]> git.eshelyaron.com Git - emacs.git/commitdiff
(specbind): For buffer-local value, record the current buffer also.
authorRichard M. Stallman <rms@gnu.org>
Tue, 15 Feb 2000 09:58:41 +0000 (09:58 +0000)
committerRichard M. Stallman <rms@gnu.org>
Tue, 15 Feb 2000 09:58:41 +0000 (09:58 +0000)
(unbind_to): Cope with that change.

src/eval.c

index ad01cb4f0219ceb186b002713d28008c5d3a295e..b3a8319d9faa7273d10623a4d9625a05e91646b3 100644 (file)
@@ -2768,15 +2768,17 @@ specbind (symbol, value)
       || 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 @@ unbind_to (count, value)
         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))