]> git.eshelyaron.com Git - emacs.git/commitdiff
(specbind): If binding a per-buffer variable which
authorGerd Moellmann <gerd@gnu.org>
Thu, 18 Jan 2001 13:21:51 +0000 (13:21 +0000)
committerGerd Moellmann <gerd@gnu.org>
Thu, 18 Jan 2001 13:21:51 +0000 (13:21 +0000)
doesn't have a buffer-local value in the current buffer, change
the global value by changing the value of the symbol bound in all
buffers not having their own value, to make it consistent with
what happens with other buffer-local variables.

src/ChangeLog
src/eval.c

index f30ccf975b23794dd95a4616e551e689274b4f37..affd55502deb75812a4db99d7f0df2b73226a9f7 100644 (file)
@@ -1,5 +1,11 @@
 2001-01-18  Gerd Moellmann  <gerd@gnu.org>
 
+       * eval.c (specbind): If binding a per-buffer variable which
+       doesn't have a buffer-local value in the current buffer, change
+       the global value by changing the value of the symbol bound in all
+       buffers not having their own value, to make it consistent with
+       what happens with other buffer-local variables.
+
        * xterm.c (x_initialize): Set char_ins_del_ok to 1.
 
        * xdisp.c (forward_to_next_line_start): Stop at end of buffer
index 8d8b9b14d42b78502184b9c12816e0a05a41ac81..41085cdef5c1472e75fe2c48ec1bcb0153ae5e71 100644 (file)
@@ -2899,16 +2899,31 @@ specbind (symbol, value)
          || BUFFER_OBJFWDP (XSYMBOL (symbol)->value))
        {
          Lisp_Object current_buffer, binding_buffer;
+         
          /* For a local variable, record both the symbol and which
             buffer's value we are saving.  */
          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, binding_buffer)))
            binding_buffer = Qnil;
          specpdl_ptr->symbol
            = Fcons (symbol, Fcons (binding_buffer, current_buffer));
+
+         /* If SYMBOL is a per-buffer variable which doesn't have a
+            buffer-local value here, make the `let' change the global
+            value by changing the value of SYMBOL in all buffers not
+            having their own value.  This is consistent with what
+            happens with other buffer-local variables.  */
+         if (NILP (binding_buffer)
+             && BUFFER_OBJFWDP (XSYMBOL (symbol)->value))
+           {
+             ++specpdl_ptr;
+             Fset_default (symbol, value);
+             return;
+           }
        }
       else
        specpdl_ptr->symbol = symbol;