changeset 35394:0936433023f5

(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.
author Gerd Moellmann <gerd@gnu.org>
date Thu, 18 Jan 2001 13:21:26 +0000
parents 2470cdee5ed8
children b6dcb5fd8c6d
files src/eval.c
diffstat 1 files changed, 15 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c	Thu Jan 18 12:30:25 2001 +0000
+++ b/src/eval.c	Thu Jan 18 13:21:26 2001 +0000
@@ -2899,16 +2899,31 @@
 	  || 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;