X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fsymbols.c;h=bb0fae059ba28ef7285c5ecd14c40659621cddeb;hb=7b4b1b26bb371112bf3e18732864bc08584127b6;hp=32e56dd3be46deb1274ee504fb6cee9a7ab69cd5;hpb=d8bd7eee3147c839d3c74d1823c139cd54867a75;p=chise%2Fxemacs-chise.git- diff --git a/src/symbols.c b/src/symbols.c index 32e56dd..bb0fae0 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)) { @@ -997,8 +995,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 } }; @@ -1397,6 +1397,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; ifunction = Qunbound; defsymbol (&Qt, "t"); - XSYMBOL (Qt)->value = Qt; /* Veritas aetera */ + XSYMBOL (Qt)->value = Qt; /* Veritas aeterna */ Vquit_flag = Qnil; pdump_wire (&Qnil);