X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/518c40a27ce7c4774c9e488639fb605a38d4f599..42c30833c2f65f8d44f3a9f7564f41deac939659:/src/lread.c diff --git a/src/lread.c b/src/lread.c index 2042d16592..54542fef97 100644 --- a/src/lread.c +++ b/src/lread.c @@ -1,6 +1,7 @@ /* Lisp parsing and input streams. -Copyright (C) 1985-1989, 1993-1995, 1997-2013 Free Software Foundation, Inc. +Copyright (C) 1985-1989, 1993-1995, 1997-2014 Free Software Foundation, +Inc. This file is part of GNU Emacs. @@ -63,6 +64,8 @@ along with GNU Emacs. If not, see . */ #define file_tell ftell #endif +static SCM obarrays; + /* Hash table read constants. */ static Lisp_Object Qhash_table, Qdata; static Lisp_Object Qtest, Qsize; @@ -212,7 +215,7 @@ readchar (Lisp_Object readcharfun, bool *multibyte) else { c = BUF_FETCH_BYTE (inbuffer, pt_byte); - if (! ASCII_BYTE_P (c)) + if (! ASCII_CHAR_P (c)) c = BYTE8_TO_CHAR (c); pt_byte++; } @@ -241,7 +244,7 @@ readchar (Lisp_Object readcharfun, bool *multibyte) else { c = BUF_FETCH_BYTE (inbuffer, bytepos); - if (! ASCII_BYTE_P (c)) + if (! ASCII_CHAR_P (c)) c = BYTE8_TO_CHAR (c); bytepos++; } @@ -323,7 +326,7 @@ readchar (Lisp_Object readcharfun, bool *multibyte) return c; if (multibyte) *multibyte = 1; - if (ASCII_BYTE_P (c)) + if (ASCII_CHAR_P (c)) return c; if (emacs_mule_encoding) return read_emacs_mule_char (c, readbyte, readcharfun); @@ -1029,6 +1032,10 @@ in `load-file-rep-suffixes'. If MUST-SUFFIX is non-nil, only the return value of `get-load-suffixes' is used, i.e. the file name is required to have a non-empty suffix. +When searching suffixes, this function normally stops at the first +one that exists. If the option `load-prefer-newer' is non-nil, +however, it tries all suffixes, and uses whichever file is the newest. + Loading a file records its definitions, and its `provide' and `require' calls, in an element of `load-history' whose car is the file name loaded. See `load-history'. @@ -1041,10 +1048,9 @@ Return t if the file exists and loads successfully. */) (Lisp_Object file, Lisp_Object noerror, Lisp_Object nomessage, Lisp_Object nosuffix, Lisp_Object must_suffix) { - FILE *stream; + FILE *stream = NULL; int fd; - int fd_index; - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); struct gcpro gcpro1, gcpro2, gcpro3; Lisp_Object found, efound, hist_file_name; /* True means we printed the ".el is newer" message. */ @@ -1080,8 +1086,10 @@ Return t if the file exists and loads successfully. */) { file = internal_condition_case_1 (Fsubstitute_in_file_name, file, Qt, load_error_handler); - if (NILP (file)) - return Qnil; + if (NILP (file)) { + dynwind_end (); + return Qnil; + } } else file = Fsubstitute_in_file_name (file); @@ -1137,6 +1145,7 @@ Return t if the file exists and loads successfully. */) { if (NILP (noerror)) report_file_error ("Cannot open load file", file); + dynwind_end (); return Qnil; } @@ -1154,8 +1163,10 @@ Return t if the file exists and loads successfully. */) handler = Ffind_file_name_handler (found, Qt); else handler = Ffind_file_name_handler (found, Qload); - if (! NILP (handler)) - return call5 (handler, Qload, found, noerror, nomessage, Qt); + if (! NILP (handler)) { + dynwind_end (); + return call5 (handler, Qload, found, noerror, nomessage, Qt); + } #ifdef DOS_NT /* Tramp has to deal with semi-broken packages that prepend drive letters to remote files. For that reason, Tramp @@ -1174,15 +1185,10 @@ Return t if the file exists and loads successfully. */) #endif } - if (fd < 0) - { - /* Pacify older GCC with --enable-gcc-warnings. */ - IF_LINT (fd_index = 0); - } - else + if (fd >= 0) { - fd_index = SPECPDL_INDEX (); - record_unwind_protect_int (close_file_unwind, fd); + record_unwind_protect_ptr (close_file_ptr_unwind, &fd); + record_unwind_protect_ptr (fclose_ptr_unwind, &stream); } /* Check if we're stuck in a recursive load cycle. @@ -1295,12 +1301,13 @@ Return t if the file exists and loads successfully. */) if (fd >= 0) { emacs_close (fd); - clear_unwind_protect (fd_index); + fd = -1; } val = call4 (Vload_source_file_function, found, hist_file_name, NILP (noerror) ? Qnil : Qt, (NILP (nomessage) || force_load_messages) ? Qnil : Qt); - return unbind_to (count, val); + dynwind_end (); + return val; } } @@ -1318,7 +1325,7 @@ Return t if the file exists and loads successfully. */) { #ifdef WINDOWSNT emacs_close (fd); - clear_unwind_protect (fd_index); + fd = -1; efound = ENCODE_FILE (found); stream = emacs_fopen (SSDATA (efound), fmode); #else @@ -1327,7 +1334,6 @@ Return t if the file exists and loads successfully. */) } if (! stream) report_file_error ("Opening stdio stream", file); - set_unwind_protect_ptr (fd_index, fclose_unwind, stream); if (! NILP (Vpurify_flag)) Vpreloaded_file_list = Fcons (Fpurecopy (file), Vpreloaded_file_list); @@ -1365,7 +1371,7 @@ Return t if the file exists and loads successfully. */) readevalloop (Qget_emacs_mule_file_char, stream, hist_file_name, 0, Qnil, Qnil, Qnil, Qnil); } - unbind_to (count, Qnil); + dynwind_end (); /* Run any eval-after-load forms for this file. */ if (!NILP (Ffboundp (Qdo_after_load_evaluation))) @@ -1467,9 +1473,12 @@ openp (Lisp_Object path, Lisp_Object str, Lisp_Object suffixes, Lisp_Object string, tail, encoded_fn, save_string; ptrdiff_t max_suffix_len = 0; int last_errno = ENOENT; - struct timespec save_mtime = make_timespec (TYPE_MINIMUM (time_t), -1); int save_fd = -1; + /* The last-modified time of the newest matching file found. + Initialize it to something less than all valid timestamps. */ + struct timespec save_mtime = make_timespec (TYPE_MINIMUM (time_t), -1); + CHECK_STRING (str); for (tail = suffixes; CONSP (tail); tail = XCDR (tail)) @@ -1755,6 +1764,29 @@ end_of_file_error (void) xsignal0 (Qend_of_file); } +static Lisp_Object +readevalloop_eager_expand_eval (Lisp_Object val, Lisp_Object macroexpand) +{ + /* If we macroexpand the toplevel form non-recursively and it ends + up being a `progn' (or if it was a progn to start), treat each + form in the progn as a top-level form. This way, if one form in + the progn defines a macro, that macro is in effect when we expand + the remaining forms. See similar code in bytecomp.el. */ + val = call2 (macroexpand, val, Qnil); + if (EQ (CAR_SAFE (val), Qprogn)) + { + Lisp_Object subforms = XCDR (val); + val = Qnil; + for (; CONSP (subforms); subforms = XCDR (subforms)) + val = readevalloop_eager_expand_eval (XCAR (subforms), + macroexpand); + } + else + val = eval_sub (call2 (macroexpand, val, Qt)); + + return val; +} + /* UNIBYTE specifies how to set load_convert_to_unibyte for this invocation. READFUN, if non-nil, is used instead of `read'. @@ -1772,7 +1804,7 @@ readevalloop (Lisp_Object readcharfun, { register int c; register Lisp_Object val; - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; struct buffer *b = 0; bool continue_reading_p; @@ -1834,7 +1866,7 @@ readevalloop (Lisp_Object readcharfun, continue_reading_p = 1; while (continue_reading_p) { - ptrdiff_t count1 = SPECPDL_INDEX (); + dynwind_begin (); if (b != 0 && !BUFFER_LIVE_P (b)) error ("Reading from killed buffer"); @@ -1877,7 +1909,7 @@ readevalloop (Lisp_Object readcharfun, } if (c < 0) { - unbind_to (count1, Qnil); + dynwind_end (); break; } @@ -1918,12 +1950,13 @@ readevalloop (Lisp_Object readcharfun, start = Fpoint_marker (); /* Restore saved point and BEGV. */ - unbind_to (count1, Qnil); + dynwind_end (); /* Now eval what we just read. */ if (!NILP (macroexpand)) - val = call1 (macroexpand, val); - val = eval_sub (val); + val = readevalloop_eager_expand_eval (val, macroexpand); + else + val = eval_sub (val); if (printflag) { @@ -1942,7 +1975,7 @@ readevalloop (Lisp_Object readcharfun, UNGCPRO; - unbind_to (count, Qnil); + dynwind_end (); } DEFUN ("eval-buffer", Feval_buffer, Seval_buffer, 0, 5, "", @@ -1961,7 +1994,7 @@ DO-ALLOW-PRINT, if non-nil, specifies that `print' and related This function preserves the position of point. */) (Lisp_Object buffer, Lisp_Object printflag, Lisp_Object filename, Lisp_Object unibyte, Lisp_Object do_allow_print) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); Lisp_Object tem, buf; if (NILP (buffer)) @@ -1986,7 +2019,7 @@ This function preserves the position of point. */) specbind (Qlexical_binding, lisp_file_lexically_bound_p (buf) ? Qt : Qnil); readevalloop (buf, 0, filename, !NILP (printflag), unibyte, Qnil, Qnil, Qnil); - unbind_to (count, Qnil); + dynwind_end (); return Qnil; } @@ -2006,7 +2039,7 @@ This function does not move point. */) (Lisp_Object start, Lisp_Object end, Lisp_Object printflag, Lisp_Object read_function) { /* FIXME: Do the eval-sexp-add-defvars dance! */ - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); Lisp_Object tem, cbuf; cbuf = Fcurrent_buffer (); @@ -2023,7 +2056,8 @@ This function does not move point. */) !NILP (printflag), Qnil, read_function, start, end); - return unbind_to (count, Qnil); + dynwind_end (); + return Qnil; } @@ -2045,7 +2079,7 @@ STREAM or the value of `standard-input' may be: if (EQ (stream, Qt)) stream = Qread_char; if (EQ (stream, Qread_char)) - /* FIXME: ¿¡ When is this used !? */ + /* FIXME: ?! When is this used !? */ return call1 (intern ("read-minibuffer"), build_string ("Lisp expression: ")); @@ -2603,7 +2637,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) XSETPVECTYPE (XVECTOR (tmp), PVEC_SUB_CHAR_TABLE); return tmp; } - invalid_syntax ("#^^"); + invalid_syntax ("#^" "^"); } invalid_syntax ("#^"); } @@ -2646,9 +2680,10 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) /* Accept compiled functions at read-time so that we don't have to build them using function calls. */ Lisp_Object tmp; + struct Lisp_Vector *vec; tmp = read_vector (readcharfun, 1); - struct Lisp_Vector* vec = XVECTOR (tmp); - if (vec->header.size==0) + vec = XVECTOR (tmp); + if (vec->header.size == 0) invalid_syntax ("Empty byte-code object"); make_byte_code (vec); return tmp; @@ -2745,7 +2780,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) if (saved_doc_string_size == 0) { - saved_doc_string = xmalloc (nskip + extra); + saved_doc_string = xmalloc_atomic (nskip + extra); saved_doc_string_size = nskip + extra; } if (nskip > saved_doc_string_size) @@ -3274,58 +3309,52 @@ substitute_object_recurse (Lisp_Object object, Lisp_Object placeholder, Lisp_Obj /* Recurse according to subtree's type. Every branch must return a Lisp_Object. */ - switch (XTYPE (subtree)) + if (VECTORLIKEP (subtree)) { - case Lisp_Vectorlike: - { - ptrdiff_t i, length = 0; - if (BOOL_VECTOR_P (subtree)) - return subtree; /* No sub-objects anyway. */ - else if (CHAR_TABLE_P (subtree) || SUB_CHAR_TABLE_P (subtree) - || COMPILEDP (subtree) || HASH_TABLE_P (subtree)) - length = ASIZE (subtree) & PSEUDOVECTOR_SIZE_MASK; - else if (VECTORP (subtree)) - length = ASIZE (subtree); - else - /* An unknown pseudovector may contain non-Lisp fields, so we - can't just blindly traverse all its fields. We used to call - `Flength' which signaled `sequencep', so I just preserved this - behavior. */ - wrong_type_argument (Qsequencep, subtree); - - for (i = 0; i < length; i++) - SUBSTITUTE (AREF (subtree, i), - ASET (subtree, i, true_value)); - return subtree; - } - - case Lisp_Cons: - { - SUBSTITUTE (XCAR (subtree), - XSETCAR (subtree, true_value)); - SUBSTITUTE (XCDR (subtree), - XSETCDR (subtree, true_value)); - return subtree; - } - - case Lisp_String: - { - /* Check for text properties in each interval. - substitute_in_interval contains part of the logic. */ - - INTERVAL root_interval = string_intervals (subtree); - Lisp_Object arg = Fcons (object, placeholder); + ptrdiff_t i, length = 0; + if (BOOL_VECTOR_P (subtree)) + return subtree; /* No sub-objects anyway. */ + else if (CHAR_TABLE_P (subtree) || SUB_CHAR_TABLE_P (subtree) + || COMPILEDP (subtree) || HASH_TABLE_P (subtree)) + length = ASIZE (subtree) & PSEUDOVECTOR_SIZE_MASK; + else if (VECTORP (subtree)) + length = ASIZE (subtree); + else + /* An unknown pseudovector may contain non-Lisp fields, so we + can't just blindly traverse all its fields. We used to call + `Flength' which signaled `sequencep', so I just preserved this + behavior. */ + wrong_type_argument (Qsequencep, subtree); + + for (i = 0; i < length; i++) + SUBSTITUTE (AREF (subtree, i), + ASET (subtree, i, true_value)); + return subtree; + } + else if (CONSP (subtree)) + { + SUBSTITUTE (XCAR (subtree), + XSETCAR (subtree, true_value)); + SUBSTITUTE (XCDR (subtree), + XSETCDR (subtree, true_value)); + return subtree; + } + else if (STRINGP (subtree)) + { + /* Check for text properties in each interval. + substitute_in_interval contains part of the logic. */ - traverse_intervals_noorder (root_interval, - &substitute_in_interval, arg); + INTERVAL root_interval = string_intervals (subtree); + Lisp_Object arg = Fcons (object, placeholder); - return subtree; - } + traverse_intervals_noorder (root_interval, + &substitute_in_interval, arg); - /* Other types don't recurse any further. */ - default: return subtree; } + else + /* Other types don't recurse any further. */ + return subtree; } /* Helper function for substitute_object_recurse. */ @@ -3504,7 +3533,6 @@ read_vector (Lisp_Object readcharfun, bool bytecodeflag) ptrdiff_t i, size; Lisp_Object *ptr; Lisp_Object tem, item, vector; - struct Lisp_Cons *otem; Lisp_Object len; tem = read_list (1, readcharfun); @@ -3549,10 +3577,8 @@ read_vector (Lisp_Object readcharfun, bool bytecodeflag) if (!CONSP (item)) error ("Invalid byte code"); - otem = XCONS (item); bytestr = XCAR (item); item = XCDR (item); - free_cons (otem); } /* Now handle the bytecode slot. */ @@ -3569,9 +3595,7 @@ read_vector (Lisp_Object readcharfun, bool bytecodeflag) } } ASET (vector, i, item); - otem = XCONS (tem); tem = Fcdr (tem); - free_cons (otem); } return vector; } @@ -3731,9 +3755,15 @@ read_list (bool flag, Lisp_Object readcharfun) static Lisp_Object initial_obarray; -/* `oblookup' stores the bucket number here, for the sake of Funintern. */ - -static size_t oblookup_last_bucket_number; +Lisp_Object +obhash (Lisp_Object obarray) +{ + Lisp_Object tem = scm_hashq_get_handle (obarrays, obarray); + if (SCM_UNLIKELY (scm_is_false (tem))) + tem = scm_hashq_create_handle_x (obarrays, obarray, + scm_make_obarray ()); + return scm_cdr (tem); +} /* Get an error if OBARRAY is not an obarray. If it is one, return it. */ @@ -3797,17 +3827,16 @@ it defaults to the value of `obarray'. */) tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string)); - if (!INTEGERP (tem)) + if (SYMBOLP (tem)) return tem; if (!NILP (Vpurify_flag)) string = Fpurecopy (string); - sym = Fmake_symbol (string); - if (EQ (obarray, initial_obarray)) - XSYMBOL (sym)->interned = SYMBOL_INTERNED_IN_INITIAL_OBARRAY; - else - XSYMBOL (sym)->interned = SYMBOL_INTERNED; + sym = scm_intern (scm_from_utf8_stringn (SSDATA (string), + SBYTES (string)), + obhash (obarray)); + initialize_symbol (sym, string); if ((SREF (string, 0) == ':') && EQ (obarray, initial_obarray)) @@ -3817,13 +3846,9 @@ it defaults to the value of `obarray'. */) SET_SYMBOL_VAL (XSYMBOL (sym), sym); } - ptr = aref_addr (obarray, XINT(tem)); - if (SYMBOLP (*ptr)) - set_symbol_next (sym, XSYMBOL (*ptr)); - else - set_symbol_next (sym, NULL); - *ptr = sym; - return sym; + return scm_intern (scm_from_utf8_stringn (SSDATA (string), + SBYTES (string)), + obhash (obarray)); } DEFUN ("intern-soft", Fintern_soft, Sintern_soft, 1, 2, 0, @@ -3853,138 +3878,93 @@ it defaults to the value of `obarray'. */) else return tem; } + +DEFUN ("find-symbol", Ffind_symbol, Sfind_symbol, 1, 2, 0, + doc: /* find-symbol */) + (Lisp_Object string, Lisp_Object obarray) +{ + Lisp_Object tem; + + obarray = check_obarray (NILP (obarray) ? Vobarray : obarray); + CHECK_STRING (string); + + tem = oblookup (obarray, SSDATA (string), SCHARS (string), SBYTES (string)); + if (INTEGERP (tem)) + return scm_values (scm_list_2 (Qnil, Qnil)); + else + return scm_values (scm_list_2 (tem, Qt)); +} DEFUN ("unintern", Funintern, Sunintern, 1, 2, 0, doc: /* Delete the symbol named NAME, if any, from OBARRAY. The value is t if a symbol was found and deleted, nil otherwise. NAME may be a string or a symbol. If it is a symbol, that symbol is deleted, if it belongs to OBARRAY--no other symbol is deleted. -OBARRAY defaults to the value of the variable `obarray'. */) +OBARRAY, if nil, defaults to the value of the variable `obarray'. +usage: (unintern NAME OBARRAY) */) (Lisp_Object name, Lisp_Object obarray) { - register Lisp_Object string, tem; - size_t hash; + Lisp_Object string; + Lisp_Object tem; - if (NILP (obarray)) obarray = Vobarray; + if (NILP (obarray)) + obarray = Vobarray; obarray = check_obarray (obarray); if (SYMBOLP (name)) - string = SYMBOL_NAME (name); - else - { - CHECK_STRING (name); - string = name; - } - - tem = oblookup (obarray, SSDATA (string), - SCHARS (string), - SBYTES (string)); - if (INTEGERP (tem)) - return Qnil; - /* If arg was a symbol, don't delete anything but that symbol itself. */ - if (SYMBOLP (name) && !EQ (name, tem)) - return Qnil; - - /* There are plenty of other symbols which will screw up the Emacs - session if we unintern them, as well as even more ways to use - `setq' or `fset' or whatnot to make the Emacs session - unusable. Let's not go down this silly road. --Stef */ - /* if (EQ (tem, Qnil) || EQ (tem, Qt)) - error ("Attempt to unintern t or nil"); */ - - XSYMBOL (tem)->interned = SYMBOL_UNINTERNED; - - hash = oblookup_last_bucket_number; - - if (EQ (AREF (obarray, hash), tem)) { - if (XSYMBOL (tem)->next) - { - Lisp_Object sym; - XSETSYMBOL (sym, XSYMBOL (tem)->next); - ASET (obarray, hash, sym); - } - else - ASET (obarray, hash, make_number (0)); + if (! EQ (name, + scm_find_symbol (scm_symbol_to_string (name), + obhash (obarray)))) + return Qnil; + string = SYMBOL_NAME (name); } else { - Lisp_Object tail, following; - - for (tail = AREF (obarray, hash); - XSYMBOL (tail)->next; - tail = following) - { - XSETSYMBOL (following, XSYMBOL (tail)->next); - if (EQ (following, tem)) - { - set_symbol_next (tail, XSYMBOL (following)->next); - break; - } - } + CHECK_STRING (name); + string = name; + } - return Qt; + return (scm_is_true (scm_unintern (name, obhash (obarray))) ? Qt : Qnil); } /* Return the symbol in OBARRAY whose names matches the string of SIZE characters (SIZE_BYTE bytes) at PTR. - If there is no such symbol in OBARRAY, return nil. + If there is no such symbol, return the integer bucket number of + where the symbol would be if it were present. Also store the bucket number in oblookup_last_bucket_number. */ Lisp_Object oblookup (Lisp_Object obarray, register const char *ptr, ptrdiff_t size, ptrdiff_t size_byte) { - size_t hash; - size_t obsize; - register Lisp_Object tail; - Lisp_Object bucket, tem; + Lisp_Object sym; + Lisp_Object string2 = scm_from_utf8_stringn (ptr, size_byte); obarray = check_obarray (obarray); - obsize = ASIZE (obarray); - - /* This is sometimes needed in the middle of GC. */ - obsize &= ~ARRAY_MARK_FLAG; - hash = hash_string (ptr, size_byte) % obsize; - bucket = AREF (obarray, hash); - oblookup_last_bucket_number = hash; - if (EQ (bucket, make_number (0))) - ; - else if (!SYMBOLP (bucket)) - error ("Bad data in guts of obarray"); /* Like CADR error message. */ + sym = scm_find_symbol (string2, obhash (obarray)); + if (scm_is_true (sym) + && scm_is_true (scm_module_variable (symbol_module, sym))) + return sym; else - for (tail = bucket; ; XSETSYMBOL (tail, XSYMBOL (tail)->next)) - { - if (SBYTES (SYMBOL_NAME (tail)) == size_byte - && SCHARS (SYMBOL_NAME (tail)) == size - && !memcmp (SDATA (SYMBOL_NAME (tail)), ptr, size_byte)) - return tail; - else if (XSYMBOL (tail)->next == 0) - break; - } - XSETINT (tem, hash); - return tem; + return make_number (0); } void map_obarray (Lisp_Object obarray, void (*fn) (Lisp_Object, Lisp_Object), Lisp_Object arg) { - ptrdiff_t i; - register Lisp_Object tail; + Lisp_Object proc (Lisp_Object sym) + { + Lisp_Object tem = Ffind_symbol (SYMBOL_NAME (sym), obarray); + if (scm_is_true (scm_c_value_ref (tem, 1)) + && EQ (sym, scm_c_value_ref (tem, 0))) + fn (sym, arg); + return SCM_UNSPECIFIED; + } CHECK_VECTOR (obarray); - for (i = ASIZE (obarray) - 1; i >= 0; i--) - { - tail = AREF (obarray, i); - if (SYMBOLP (tail)) - while (1) - { - (*fn) (tail, arg); - if (XSYMBOL (tail)->next == 0) - break; - XSETSYMBOL (tail, XSYMBOL (tail)->next); - } - } + scm_obarray_for_each (scm_c_make_gsubr ("proc", 1, 0, 0, proc), + obhash (obarray)); } static void @@ -4019,6 +3999,9 @@ init_obarray (void) initial_obarray = Vobarray; staticpro (&initial_obarray); + obarrays = scm_make_hash_table (SCM_UNDEFINED); + scm_hashq_set_x (obarrays, Vobarray, SCM_UNDEFINED); + Qunbound = Fmake_symbol (build_pure_c_string ("unbound")); /* Set temporary dummy values to Qnil and Vpurify_flag to satisfy the NILP (Vpurify_flag) check in intern_c_string. */ @@ -4046,7 +4029,7 @@ init_obarray (void) DEFSYM (Qvariable_documentation, "variable-documentation"); - read_buffer = xmalloc (size); + read_buffer = xmalloc_atomic (size); read_buffer_size = size; } @@ -4055,21 +4038,12 @@ defsubr (struct Lisp_Subr *sname) { Lisp_Object sym, tem; sym = intern_c_string (sname->symbol_name); + SCM_NEWSMOB (sname->header.self, lisp_vectorlike_tag, sname); XSETPVECTYPE (sname, PVEC_SUBR); XSETSUBR (tem, sname); set_symbol_function (sym, tem); } -#ifdef NOTDEF /* Use fset in subr.el now! */ -void -defalias (struct Lisp_Subr *sname, char *string) -{ - Lisp_Object sym; - sym = intern (string); - XSETSUBR (XSYMBOL (sym)->function, sname); -} -#endif /* NOTDEF */ - /* Define an "integer variable"; a symbol whose value is forwarded to a C variable of type EMACS_INT. Sample call (with "xx" to fool make-docfile): DEFxxVAR_INT ("emacs-priority", &emacs_priority, "Documentation"); */ @@ -4336,7 +4310,7 @@ init_lread (void) #ifdef CANNOT_DUMP bool use_loadpath = true; #else - bool use_loadpath = !NILP (Vpurify_flag); + bool use_loadpath = NILP (Vpurify_flag); #endif if (use_loadpath && egetenv ("EMACSLOADPATH")) @@ -4379,7 +4353,7 @@ init_lread (void) } } /* Fmemq (Qnil, Vload_path) */ } - else /* Vpurify_flag || !EMACSLOADPATH */ + else { Vload_path = load_path_default (); @@ -4396,7 +4370,7 @@ init_lread (void) sitelisp = decode_env_path (0, PATH_SITELOADSEARCH, 0); if (! NILP (sitelisp)) Vload_path = nconc2 (sitelisp, Vload_path); } - } /* !Vpurify_flag && EMACSLOADPATH */ + } Vvalues = Qnil; @@ -4436,21 +4410,7 @@ dir_warning (char const *use, Lisp_Object dirname) void syms_of_lread (void) { - defsubr (&Sread); - defsubr (&Sread_from_string); - defsubr (&Sintern); - defsubr (&Sintern_soft); - defsubr (&Sunintern); - defsubr (&Sget_load_suffixes); - defsubr (&Sload); - defsubr (&Seval_buffer); - defsubr (&Seval_region); - defsubr (&Sread_char); - defsubr (&Sread_char_exclusive); - defsubr (&Sread_event); - defsubr (&Sget_file_char); - defsubr (&Smapatoms); - defsubr (&Slocate_file_internal); +#include "lread.x" DEFVAR_LISP ("obarray", Vobarray, doc: /* Symbol table for use by `intern' and `read'. @@ -4676,11 +4636,12 @@ variables, this must be set in the first line of a file. */); This applies when a filename suffix is not explicitly specified and `load' is trying various possible suffixes (see `load-suffixes' and `load-file-rep-suffixes'). Normally, it stops at the first file -that exists. If this option is non-nil, it checks all suffixes and -uses whichever file is newest. +that exists unless you explicitly specify one or the other. If this +option is non-nil, it checks all suffixes and uses whichever file is +newest. Note that if you customize this, obviously it will not affect files that are loaded before your customizations are read! */); - load_prefer_newer = 0; + load_prefer_newer = 1; /* Vsource_directory was initialized in init_lread. */