X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fsymbols.c;h=133164f32783a034be04b440ed582eb19e5ebd4f;hb=63a686a3d18465a8c96b8cc4a273c295f8a5a379;hp=32e56dd3be46deb1274ee504fb6cee9a7ab69cd5;hpb=59eec5f21669e81977b5b1fe9bf717cab49cf7fb;p=chise%2Fxemacs-chise.git.1 diff --git a/src/symbols.c b/src/symbols.c index 32e56dd..133164f 100644 --- a/src/symbols.c +++ b/src/symbols.c @@ -198,8 +198,8 @@ intern (const char *str) DEFUN ("intern", Fintern, 1, 2, 0, /* Return the canonical symbol whose name is STRING. If there is none, one is created by this function and returned. -A second optional argument specifies the obarray to use; -it defaults to the value of `obarray'. +Optional second argument OBARRAY specifies the obarray to use; +it defaults to the value of the variable `obarray'. */ (string, obarray)) { @@ -245,8 +245,8 @@ DEFUN ("intern-soft", Fintern_soft, 1, 2, 0, /* Return the canonical symbol named NAME, or nil if none exists. NAME may be a string or a symbol. If it is a symbol, that exact symbol is searched for. -A second optional argument specifies the obarray to use; -it defaults to the value of `obarray'. +Optional second argument OBARRAY specifies the obarray to use; +it defaults to the value of the variable `obarray'. */ (name, obarray)) { @@ -278,7 +278,7 @@ 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 defaults to the value of the variable `obarray'. */ (name, obarray)) { @@ -490,11 +490,9 @@ apropos_mapper (Lisp_Object symbol, void *arg) } DEFUN ("apropos-internal", Fapropos_internal, 1, 2, 0, /* -Show all symbols whose names contain match for REGEXP. -If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) - is done for each symbol and a symbol is mentioned only if that - returns non-nil. -Return list of symbols found. +Return a list of all symbols whose names contain match for REGEXP. +If optional 2nd arg PREDICATE is non-nil, only symbols for which +\(funcall PREDICATE SYMBOL) returns non-nil are returned. */ (regexp, predicate)) { @@ -737,7 +735,7 @@ Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. #if 0 /* Inserted for debugging 6/28/1997 -slb */ /* Somebody is setting a property list of integer 0, who? */ /* Not this way apparently. */ - if (EQ(newplist, Qzero)) abort(); + if (EQ(newplist, Qzero)) ABORT(); #endif XSYMBOL (symbol)->plist = newplist; @@ -792,10 +790,15 @@ Set SYMBOL's property list to NEWPLIST, and return NEWPLIST. the symbol-value-forward. (See below.) SYMVAL_FIXNUM_FORWARD: + (declare with DEFVAR_INT) + Similar to SYMVAL_OBJECT_FORWARD except that the C variable + is of type "Fixnum", a typedef for "EMACS_INT", and the corresponding + lisp variable is always the corresponding integer. + SYMVAL_BOOLEAN_FORWARD: - (declare with DEFVAR_INT or DEFVAR_BOOL) + (declare with DEFVAR_BOOL) Similar to SYMVAL_OBJECT_FORWARD except that the C variable - is of type "int" and is an integer or boolean, respectively. + is of type "int" and is a boolean. SYMVAL_CONST_OBJECT_FORWARD: SYMVAL_CONST_FIXNUM_FORWARD: @@ -997,8 +1000,10 @@ static const struct lrecord_description symbol_value_forward_description[] = { }; static const struct lrecord_description symbol_value_buffer_local_description[] = { - { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, default_value) }, - { XD_LO_RESET_NIL, offsetof (struct symbol_value_buffer_local, current_value), 3 }, + { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, default_value) }, + { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, current_value) }, + { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, current_buffer) }, + { XD_LISP_OBJECT, offsetof (struct symbol_value_buffer_local, current_alist_element) }, { XD_END } }; @@ -1073,7 +1078,7 @@ do_symval_forwarding (Lisp_Object valcontents, struct buffer *buffer, { case SYMVAL_FIXNUM_FORWARD: case SYMVAL_CONST_FIXNUM_FORWARD: - return make_int (*((int *)symbol_value_forward_forward (fwd))); + return make_int (*((Fixnum *)symbol_value_forward_forward (fwd))); case SYMVAL_BOOLEAN_FORWARD: case SYMVAL_CONST_BOOLEAN_FORWARD: @@ -1113,7 +1118,7 @@ do_symval_forwarding (Lisp_Object valcontents, struct buffer *buffer, return valcontents; default: - abort (); + ABORT (); } return Qnil; /* suppress compiler warning */ } @@ -1246,7 +1251,7 @@ store_symval_forwarding (Lisp_Object sym, Lisp_Object ovalue, CHECK_INT (newval); if (magicfun) magicfun (sym, &newval, Qnil, 0); - *((int *) symbol_value_forward_forward (fwd)) = XINT (newval); + *((Fixnum *) symbol_value_forward_forward (fwd)) = XINT (newval); return; case SYMVAL_BOOLEAN_FORWARD: @@ -1289,7 +1294,7 @@ store_symval_forwarding (Lisp_Object sym, Lisp_Object ovalue, return; default: - abort (); + ABORT (); } } } @@ -1397,6 +1402,71 @@ set_up_buffer_local_cache (Lisp_Object sym, store_symval_forwarding (sym, bfwd->current_value, new_val); } + +/* SYM is a buffer-local variable, and BFWD is its buffer-local structure. + Flush the cache. BFWD->CURRENT_BUFFER will be nil after this operation. +*/ + +static void +flush_buffer_local_cache (Lisp_Object sym, + struct symbol_value_buffer_local *bfwd) +{ + if (NILP (bfwd->current_buffer)) + /* Cache is already flushed. */ + return; + + /* Flush out the old cache. */ + write_out_buffer_local_cache (sym, bfwd); + + bfwd->current_alist_element = Qnil; + bfwd->current_buffer = Qnil; + + /* Now store default the value into the current-value slot. + We don't simply write it there, because the current-value + slot might be a forwarding pointer, in which case we need + to instead write the value into the C variable. + + We might also want to call a magic function. + + So instead, we call this function. */ + store_symval_forwarding (sym, bfwd->current_value, bfwd->default_value); +} + +/* Flush all the buffer-local variable caches. Whoever has a + non-interned buffer-local variable will be spanked. Whoever has a + magic variable that interns or uninterns symbols... I don't even + want to think about it. +*/ + +void +flush_all_buffer_local_cache (void) +{ + Lisp_Object *syms = XVECTOR_DATA (Vobarray); + long count = XVECTOR_LENGTH (Vobarray); + long i; + + for (i=0; imagic); bfwd->magic.type = SYMVAL_BUFFER_LOCAL; bfwd->default_value = find_symbol_value (variable); @@ -2198,13 +2269,14 @@ Use `make-local-hook' instead. } default: - abort (); + ABORT (); } } /* Make sure variable is set up to hold per-buffer values */ bfwd = alloc_lcrecord_type (struct symbol_value_buffer_local, &lrecord_symbol_value_buffer_local); + zero_lcrecord (&bfwd->magic); bfwd->magic.type = SYMVAL_SOME_BUFFER_LOCAL; bfwd->current_buffer = Qnil; @@ -2272,7 +2344,7 @@ Use `make-local-hook' instead. break; default: - abort (); + ABORT (); } } @@ -2590,14 +2662,14 @@ The returned info will be a symbol, one of case SYMVAL_UNBOUND_MARKER: return Qnil; default: - abort (); return Qnil; + ABORT (); return Qnil; } } DEFUN ("local-variable-p", Flocal_variable_p, 2, 3, 0, /* Return t if SYMBOL's value is local to BUFFER. -If optional third arg AFTER-SET is true, return t if SYMBOL would be +If optional third arg AFTER-SET is non-nil, return t if SYMBOL would be buffer-local after it is set, regardless of whether it is so presently. A nil value for BUFFER is *not* the same as (current-buffer), but means "no buffer". Specifically: @@ -2788,7 +2860,7 @@ decode_magic_handler_type (Lisp_Object symbol) if (EQ (symbol, Qmake_local)) return MAGIC_HANDLER_MAKE_LOCAL; signal_simple_error ("Unrecognized symbol value handler type", symbol); - abort (); + ABORT (); return MAGIC_HANDLER_MAX; } @@ -2821,7 +2893,7 @@ handler_type_from_function_symbol (Lisp_Object funsym, int abort_if_not_found) return MAGIC_HANDLER_MAKE_LOCAL; if (abort_if_not_found) - abort (); + ABORT (); signal_simple_error ("Unrecognized symbol-value function", funsym); return MAGIC_HANDLER_MAX; } @@ -2925,6 +2997,7 @@ pity, thereby invalidating your code. { bfwd = alloc_lcrecord_type (struct symbol_value_lisp_magic, &lrecord_symbol_value_lisp_magic); + zero_lcrecord (&bfwd->magic); bfwd->magic.type = SYMVAL_LISP_MAGIC; for (i = 0; i < MAGIC_HANDLER_MAX; i++) { @@ -3061,6 +3134,7 @@ has a buffer-local value in any buffer, or the symbols nil or t. bfwd = alloc_lcrecord_type (struct symbol_value_varalias, &lrecord_symbol_value_varalias); + zero_lcrecord (&bfwd->magic); bfwd->magic.type = SYMVAL_VARALIAS; bfwd->aliasee = alias; bfwd->shadowed = valcontents; @@ -3118,6 +3192,31 @@ variable chain of symbols. return follow_varalias_pointers (object, follow_past_lisp_magic); } +DEFUN ("variable-binding-locus", Fvariable_binding_locus, 1, 1, 0, /* +Return a value indicating where VARIABLE's current binding comes from. +If the current binding is buffer-local, the value is the current buffer. +If the current binding is global (the default), the value is nil. +*/ + (variable)) +{ + Lisp_Object valcontents; + + CHECK_SYMBOL (variable); + variable = Findirect_variable (variable, Qnil); + + /* Make sure the current binding is actually swapped in. */ + find_symbol_value (variable); + + valcontents = XSYMBOL (variable)->value; + + if (SYMBOL_VALUE_MAGIC_P (valcontents) + && ((XSYMBOL_VALUE_MAGIC_TYPE (valcontents) == SYMVAL_BUFFER_LOCAL) + || (XSYMBOL_VALUE_MAGIC_TYPE (valcontents) == SYMVAL_SOME_BUFFER_LOCAL)) + && (!NILP (Flocal_variable_p (variable, Fcurrent_buffer (), Qnil)))) + return Fcurrent_buffer (); + else + return Qnil; +} /************************************************************************/ /* initialization */ @@ -3191,12 +3290,12 @@ init_symbols_once_early (void) XSYMBOL (Qnil)->function = Qunbound; defsymbol (&Qt, "t"); - XSYMBOL (Qt)->value = Qt; /* Veritas aetera */ + XSYMBOL (Qt)->value = Qt; /* Veritas aeterna */ Vquit_flag = Qnil; - pdump_wire (&Qnil); - pdump_wire (&Qunbound); - pdump_wire (&Vquit_flag); + dump_add_root_object (&Qnil); + dump_add_root_object (&Qunbound); + dump_add_root_object (&Vquit_flag); } void @@ -3218,8 +3317,8 @@ defsymbol_massage_name_1 (Lisp_Object *location, const char *name, int dump_p, int multiword_predicate_p) { char temp[500]; - int len = strlen (name) - 1; - int i; + size_t len = strlen (name) - 1; + size_t i; if (multiword_predicate_p) assert (len + 1 < sizeof (temp)); @@ -3295,7 +3394,7 @@ void defkeyword_massage_name (Lisp_Object *location, const char *name) { char temp[500]; - int len = strlen (name); + size_t len = strlen (name); assert (len < sizeof (temp)); strcpy (temp, name); @@ -3430,8 +3529,8 @@ deferror_massage_name_and_message (Lisp_Object *symbol, const char *name, Lisp_Object inherits_from) { char temp[500]; - int i; - int len = strlen (name) - 1; + size_t i; + size_t len = strlen (name) - 1; assert (len < sizeof (temp)); strcpy (temp, name + 1); /* Remove initial Q */ @@ -3474,7 +3573,6 @@ syms_of_symbols (void) DEFSYMBOL (Qsymbol_value_in_buffer); DEFSYMBOL (Qsymbol_value_in_console); DEFSYMBOL (Qlocal_variable_p); - DEFSYMBOL (Qconst_integer); DEFSYMBOL (Qconst_boolean); DEFSYMBOL (Qconst_object); @@ -3521,6 +3619,7 @@ syms_of_symbols (void) DEFSUBR (Fdefvaralias); DEFSUBR (Fvariable_alias); DEFSUBR (Findirect_variable); + DEFSUBR (Fvariable_binding_locus); DEFSUBR (Fdontusethis_set_symbol_value_handler); }