changeset 27704:e809aae28ae6

(specbind): For buffer-local value, record the current buffer also. (unbind_to): Cope with that change.
author Richard M. Stallman <rms@gnu.org>
date Tue, 15 Feb 2000 09:58:41 +0000
parents 2ff09a66fbf1
children 2c53eb482802
files src/eval.c
diffstat 1 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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))