# HG changeset patch # User Richard M. Stallman # Date 950608721 0 # Node ID e809aae28ae60a6b02d057dcfc9fd935807ee894 # Parent 2ff09a66fbf1cf829a6926ebea1f9b4f9a76ebb5 (specbind): For buffer-local value, record the current buffer also. (unbind_to): Cope with that change. diff -r 2ff09a66fbf1 -r e809aae28ae6 src/eval.c --- a/src/eval.c Tue Feb 15 09:57:33 2000 +0000 +++ b/src/eval.c Tue Feb 15 09:58:41 2000 +0000 @@ -2768,15 +2768,17 @@ || SOME_BUFFER_LOCAL_VALUEP (XSYMBOL (symbol)->value) || BUFFER_OBJFWDP (XSYMBOL (symbol)->value)) { - Lisp_Object buffer; + Lisp_Object current_buffer, binding_buffer; /* For a local variable, record both the symbol and which buffer's value we are saving. */ - buffer = Fcurrent_buffer (); + current_buffer = Fcurrent_buffer (); + binding_buffer = current_buffer; /* If the variable is not local in this buffer, we are saving the global value, so restore that. */ - if (NILP (Flocal_variable_p (symbol, buffer))) - buffer = Qnil; - specpdl_ptr->symbol = Fcons (symbol, buffer); + if (NILP (Flocal_variable_p (symbol, binding_buffer))) + binding_buffer = Qnil; + specpdl_ptr->symbol + = Fcons (symbol, Fcons (binding_buffer, current_buffer)); } else specpdl_ptr->symbol = symbol; @@ -2822,12 +2824,16 @@ 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 BINDING_BUFFER . CURRENT_BUFFER) + and it indicates we bound a variable that has + buffer-local bindings. */ else if (CONSP (specpdl_ptr->symbol)) { Lisp_Object symbol, buffer; symbol = XCAR (specpdl_ptr->symbol); - buffer = XCDR (specpdl_ptr->symbol); + buffer = XCAR (XCDR (specpdl_ptr->symbol)); /* Handle restoring a default value. */ if (NILP (buffer))