]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fmake_variable_buffer_local): Doc fix.
authorRichard M. Stallman <rms@gnu.org>
Sun, 20 Feb 2000 14:27:12 +0000 (14:27 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sun, 20 Feb 2000 14:27:12 +0000 (14:27 +0000)
Init found_for_buffer to 0.
(Fmake_variable_frame_local): If the variable has already
been buffer-local, set the check_frame field.

src/data.c

index a206c5c4994439af8795a1fdd06a02ce0eb68459..b0a6a2ba9aa7c10e5e752667b675ff1a58c474c7 100644 (file)
@@ -823,39 +823,29 @@ store_symval_forwarding (symbol, valcontents, newval)
 }
 
 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
-   VALCONTENTS is the contents of its value cell.
-   Return the value forwarded one step past the buffer-local indicator.  */
+   VALCONTENTS is the contents of its value cell,
+   which points to a struct Lisp_Buffer_Local_Value.
+
+   Return the value forwarded one step past the buffer-local stage.
+   This could be another forwarding pointer.  */
 
 static Lisp_Object
 swap_in_symval_forwarding (symbol, valcontents)
      Lisp_Object symbol, valcontents;
 {
-  /* valcontents is a pointer to a struct resembling the cons
-     (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE)).
-
-     CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
-     local_var_alist, that being the element whose car is this
-     variable.  Or it can be a pointer to the
-     (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not have
-     an element in its alist for this variable.
-
-     If the current buffer is not BUFFER, we store the current
-     REALVALUE value into CURRENT-ALIST-ELEMENT, then find the
-     appropriate alist element for the buffer now current and set up
-     CURRENT-ALIST-ELEMENT.  Then we set REALVALUE out of that
-     element, and store into BUFFER.
-
-     Note that REALVALUE can be a forwarding pointer. */
-
   register Lisp_Object tem1;
   tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
 
-  if (NILP (tem1) || current_buffer != XBUFFER (tem1)
-      || !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
+  if (NILP (tem1)
+      || current_buffer != XBUFFER (tem1)
+      || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
+         && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
     {
+      /* Unload the previously loaded binding.  */
       tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
       Fsetcdr (tem1,
               do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
+      /* Choose the new binding.  */
       tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
       XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
       XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
@@ -871,6 +861,7 @@ swap_in_symval_forwarding (symbol, valcontents)
       else
        XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
 
+      /* Load the new binding.  */
       XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = tem1;
       XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
       XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
@@ -1015,56 +1006,32 @@ set_internal (symbol, newval, buf, bindflag)
   else if (BUFFER_LOCAL_VALUEP (valcontents)
           || SOME_BUFFER_LOCAL_VALUEP (valcontents))
     {
-      /* valcontents is actually a pointer to a struct resembling a cons,
-        with contents something like:
-        (REALVALUE BUFFER CURRENT-ALIST-ELEMENT . DEFAULT-VALUE).
-
-        BUFFER is the last buffer for which this symbol's value was
-        made up to date.
-
-        CURRENT-ALIST-ELEMENT is a pointer to an element of BUFFER's
-        local_var_alist, that being the element whose car is this
-        variable.  Or it can be a pointer to the
-        (CURRENT-ALIST-ELEMENT . DEFAULT-VALUE), if BUFFER does not
-        have an element in its alist for this variable (that is, if
-        BUFFER sees the default value of this variable).
-
-        If we want to examine or set the value and BUFFER is current,
-        we just examine or set REALVALUE. If BUFFER is not current, we
-        store the current REALVALUE value into CURRENT-ALIST-ELEMENT,
-        then find the appropriate alist element for the buffer now
-        current and set up CURRENT-ALIST-ELEMENT.  Then we set
-        REALVALUE out of that element, and store into BUFFER.
-
-        If we are setting the variable and the current buffer does
-        not have an alist entry for this variable, an alist entry is
-        created.
-
-        Note that REALVALUE can be a forwarding pointer.  Each time
-        it is examined or set, forwarding must be done.  */
-
-      /* What value are we caching right now?  */
+      /* valcontents is a struct Lisp_Buffer_Local_Value.   */
+
+      /* 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
-        currently cached, or if it's a Lisp_Buffer_Local_Value and
-        we're looking at the default value, the cache is invalid; we
-        need to write it out, and find the new CURRENT-ALIST-ELEMENT.  */
-      if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame
-         ? !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)
-         : (buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
-            || (BUFFER_LOCAL_VALUEP (valcontents)
-                && EQ (XCAR (current_alist_element),
-                       current_alist_element))))
+        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 (buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
+         || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
+             && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
+         || (BUFFER_LOCAL_VALUEP (valcontents)
+             && EQ (XCAR (current_alist_element),
+                    current_alist_element)))
        {
-         /* Write out the cached value for the old buffer; copy it
-            back to its alist element.  This works if the current
-            buffer only sees the default value, too.  */
+         /* The currently loaded binding is not necessarily valid.
+            We need to unload it, and choose a new binding.  */
+
+         /* Write out `realvalue' to the old loaded binding.  */
           Fsetcdr (current_alist_element,
                   do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
 
-         /* Find the new value for CURRENT-ALIST-ELEMENT.  */
+         /* Find the new binding.  */
          tem1 = Fassq (symbol, buf->local_var_alist);
          XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
          XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
@@ -1097,7 +1064,7 @@ set_internal (symbol, newval, buf, bindflag)
                 and we're not within a let that was made for this buffer,
                 create a new buffer-local binding for the variable.
                 That means, give this buffer a new assoc for a local value
-                and set CURRENT-ALIST-ELEMENT to point to that.  */
+                and load that binding.  */
              else
                {
                  tem1 = Fcons (symbol, Fcdr (current_alist_element));
@@ -1106,11 +1073,11 @@ set_internal (symbol, newval, buf, bindflag)
                }
            }
 
-         /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT.  */
+         /* Record which binding is now loaded.  */
          XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr)
            = tem1;
 
-         /* Set BUFFER and FRAME for binding now loaded.  */
+         /* Set `buffer' and `frame' slots for thebinding now loaded.  */
          XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
          XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
        }
@@ -1157,7 +1124,7 @@ default_value (symbol)
     {
       /* If var is set up for a buffer that lacks a local value for it,
         the current value is nominally the default value.
-        But the current value slot may be more up to date, since
+        But the `realvalue' slot may be more up to date, since
         ordinary setq stores just that slot.  So use that.  */
       Lisp_Object current_alist_element, alist_element_car;
       current_alist_element
@@ -1240,10 +1207,10 @@ for this variable.")
       && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
     return Fset (symbol, value);
 
-  /* Store new value into the DEFAULT-VALUE slot */
+  /* Store new value into the DEFAULT-VALUE slot */
   XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr) = value;
 
-  /* If that slot is current, we must set the REALVALUE slot too */
+  /* If the default binding is now loaded, set the REALVALUE slot too.  */
   current_alist_element
     = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
   alist_element_buffer = Fcar (current_alist_element);
@@ -1296,12 +1263,14 @@ of previous SYMs.")
 
 DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
   1, 1, "vMake Variable Buffer Local: ",
-  "Make VARIABLE have a separate value for each buffer.\n\
-At any time, the value for the current buffer is in effect.\n\
-There is also a default value which is seen in any buffer which has not yet\n\
-set its own value.\n\
-Using `set' or `setq' to set the variable causes it to have a separate value\n\
-for the current buffer if it was previously using the default value.\n\
+  "Make VARIABLE become buffer-local whenever it is set.\n\
+At any time, the value for the current buffer is in effect,\n\
+unless the variable has never been set in this buffer,\n\
+in which case the default value is in effect.\n\
+Note that binding the variable with `let', or setting it while\n\
+a `let'-style binding made in this buffer is in effect,\n\
+does not make the variable buffer-local.\n\
+\n\
 The function `default-value' gets the default value and `set-default' sets it.")
   (variable)
      register Lisp_Object variable;
@@ -1330,7 +1299,7 @@ The function `default-value' gets the default value and `set-default' sets it.")
   XBUFFER_LOCAL_VALUE (newval)->realvalue = XSYMBOL (variable)->value;
   XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
   XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
-  XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 1;
+  XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
   XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
   XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
   XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
@@ -1376,7 +1345,7 @@ Use `make-local-hook' instead.")
       Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
       return variable;
     }
-  /* Make sure symbol is set up to hold per-buffer values */
+  /* Make sure symbol is set up to hold per-buffer values */
   if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
     {
       Lisp_Object newval;
@@ -1393,7 +1362,7 @@ Use `make-local-hook' instead.")
       XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
       XSYMBOL (variable)->value = newval;
     }
-  /* Make sure this buffer has its own value of symbol */
+  /* Make sure this buffer has its own value of symbol */
   tem = Fassq (variable, current_buffer->local_var_alist);
   if (NILP (tem))
     {
@@ -1407,7 +1376,7 @@ Use `make-local-hook' instead.")
                 current_buffer->local_var_alist);
 
       /* Make sure symbol does not think it is set up for this buffer;
-        force it to look once again for this buffer's value */
+        force it to look once again for this buffer's value */
       {
        Lisp_Object *pvalbuf;
 
@@ -1420,10 +1389,10 @@ Use `make-local-hook' instead.")
       }
     }
 
-  /* If the symbol forwards into a C variable, then swap in the
-     variable for this buffer immediately.  If C code modifies the
-     variable before we swap in, then that new value will clobber the
-     default value the next time we swap.  */
+  /* If the symbol forwards into a C variable, then load the binding
+     for this buffer now.  If C code modifies the variable before we
+     load the binding in, then that new value will clobber the default
+     binding the next time we unload it.  */
   valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->realvalue;
   if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
     swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
@@ -1463,16 +1432,16 @@ From now on the default value will apply in this buffer.")
       && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
     return variable;
 
-  /* Get rid of this buffer's alist element, if any */
+  /* Get rid of this buffer's alist element, if any */
 
   tem = Fassq (variable, current_buffer->local_var_alist);
   if (!NILP (tem))
     current_buffer->local_var_alist
       = Fdelq (tem, current_buffer->local_var_alist);
 
-  /* If the symbol is set up for the current buffer, recompute its
-     value.  We have to do it now, or else forwarded objects won't
-     work right. */
+  /* If the symbol is set up with the current buffer's binding
+     loaded, recompute its value.  We have to do it now, or else
+     forwarded objects won't work right.  */
   {
     Lisp_Object *pvalbuf;
     valcontents = XSYMBOL (variable)->value;
@@ -1513,7 +1482,10 @@ See `modify-frame-parameters'.")
 
   if (BUFFER_LOCAL_VALUEP (valcontents)
       || SOME_BUFFER_LOCAL_VALUEP (valcontents))
-    return variable;
+    {
+      XBUFFER_LOCAL_VALUE (valcontents)->check_frame = 1;
+      return variable;
+    }
 
   if (EQ (valcontents, Qunbound))
     XSYMBOL (variable)->value = Qnil;