changeset 86338:cc3ad12e2f26

(set_internal): Set the value in the `cons-cell' (for Buffer_Local_values) not only for frame-local variables.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Thu, 22 Nov 2007 19:48:57 +0000
parents 161416156d88
children 6f4793ab0756
files src/ChangeLog src/data.c
diffstat 2 files changed, 11 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Thu Nov 22 18:08:06 2007 +0000
+++ b/src/ChangeLog	Thu Nov 22 19:48:57 2007 +0000
@@ -1,3 +1,8 @@
+2007-11-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* data.c (set_internal): Set the value in the `cons-cell' (for
+	Buffer_Local_values) not only for frame-local variables.
+
 2007-11-22  Andreas Schwab  <schwab@suse.de>
 
 	* data.c (Fnumber_to_string): Add cast when passing EMACS_INT
@@ -13,7 +18,7 @@
 2007-11-22  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	* term.c: Include stdarg.h.
-	(fatal): Implement using varargs. 
+	(fatal): Implement using varargs.
 	* lisp.h (fatal): Add argument types. (Restore 2005-09-30 change).
 
 2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
--- a/src/data.c	Thu Nov 22 18:08:06 2007 +0000
+++ b/src/data.c	Thu Nov 22 19:48:57 2007 +0000
@@ -1238,6 +1238,7 @@
 	  || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
 	  || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
 	      && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
+	  /* Also unload a global binding (if the var is local_if_set). */
 	  || (EQ (XCAR (current_alist_element),
 		  current_alist_element)))
 	{
@@ -1257,7 +1258,7 @@
 	    {
 	      /* This buffer still sees the default value.  */
 
-	      /* If the variable is a Lisp_Some_Buffer_Local_Value,
+	      /* If the variable is not local_if_set,
 		 or if this is `let' rather than `set',
 		 make CURRENT-ALIST-ELEMENT point to itself,
 		 indicating that we're seeing the default value.
@@ -1298,6 +1299,9 @@
 	  XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
 	}
       innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
+
+      /* Store the new value in the cons-cell.  */
+      XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr), newval);
     }
 
   /* If storing void (making the symbol void), forward only through
@@ -1307,24 +1311,6 @@
   else
     store_symval_forwarding (symbol, innercontents, newval, buf);
 
-  /* If we just set a variable whose current binding is frame-local,
-     store the new value in the frame parameter too.  */
-
-  if (BUFFER_LOCAL_VALUEP (valcontents))
-    {
-      /* What binding is loaded right now?  */
-      current_alist_element
-	= XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
-
-      /* If the current buffer is not the buffer whose binding is
-	 loaded, or if there may be frame-local bindings and the frame
-	 isn't the right one, or if it's a Lisp_Buffer_Local_Value and
-	 the default binding is loaded, the loaded binding may be the
-	 wrong one.  */
-      if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
-	XSETCDR (current_alist_element, newval);
-    }
-
   return newval;
 }