Mercurial > emacs
changeset 38290:57b9619e2e44
(specbind): Additionally record the buffer that was
current when a buffer-local or frame-local variable was bound.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Thu, 05 Jul 2001 09:25:09 +0000 |
parents | a35885785077 |
children | a13b229de6d7 |
files | src/eval.c |
diffstat | 1 files changed, 13 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c Thu Jul 05 09:24:35 2001 +0000 +++ b/src/eval.c Thu Jul 05 09:25:09 2001 +0000 @@ -2935,12 +2935,14 @@ || SOME_BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents)) { - Lisp_Object where; + Lisp_Object where, current_buffer; + + current_buffer = Fcurrent_buffer (); /* For a local variable, record both the symbol and which buffer's or frame's value we are saving. */ if (!NILP (Flocal_variable_p (symbol, Qnil))) - where = Fcurrent_buffer (); + where = current_buffer; else if (!BUFFER_OBJFWDP (valcontents) && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame) where = XBUFFER_LOCAL_VALUE (valcontents)->frame; @@ -2950,7 +2952,7 @@ /* We're not using the `unused' slot in the specbinding structure because this would mean we have to do more work for simple variables. */ - specpdl_ptr->symbol = Fcons (symbol, where); + specpdl_ptr->symbol = Fcons (symbol, Fcons (where, current_buffer)); /* If SYMBOL is a per-buffer variable which doesn't have a buffer-local value here, make the `let' change the global @@ -3010,17 +3012,19 @@ so in that case the "old value" is a list of forms to evaluate. */ else if (NILP (specpdl_ptr->symbol)) Fprogn (specpdl_ptr->old_value); - /* If the symbol is a list, it is really (SYMBOL . WHERE) where - WHERE is either nil, a buffer, or a frame. If WHERE is a - buffer or frame, this indicates we bound a variable that had - a buffer-local or frmae-local binding.. WHERE nil means that - the variable had the default value when it was bound. */ + /* If the symbol is a list, it is really (SYMBOL WHERE + . CURRENT-BUFFER) where WHERE is either nil, a buffer, or a + frame. If WHERE is a buffer or frame, this indicates we + bound a variable that had a buffer-local or frmae-local + binding.. WHERE nil means that the variable had the default + value when it was bound. CURRENT-BUFFER is the buffer that + was current when the variable was bound. */ else if (CONSP (specpdl_ptr->symbol)) { Lisp_Object symbol, where; symbol = XCAR (specpdl_ptr->symbol); - where = XCDR (specpdl_ptr->symbol); + where = XCAR (XCDR (specpdl_ptr->symbol)); if (NILP (where)) Fset_default (symbol, specpdl_ptr->old_value);