]> git.eshelyaron.com Git - emacs.git/commitdiff
Change Lisp_Buffer_Local_Value representation.
authorTom Tromey <tromey@redhat.com>
Sun, 29 Nov 2009 20:12:13 +0000 (21:12 +0100)
committerGiuseppe Scrivano <gscrivano@gnu.org>
Sun, 29 Nov 2009 20:12:13 +0000 (21:12 +0100)
This doesn't change semantics but prepares the way for per-thread
buffer-local bindings.

src/alloc.c
src/buffer.c
src/data.c
src/eval.c
src/frame.c
src/lisp.h
src/print.c

index f761be4c395eb3f3ffe678feba647edf2e480a63..54359c5accd80d4e5b9f096168c8c1318fcd7ba7 100644 (file)
@@ -5577,16 +5577,8 @@ mark_object (arg)
          {
            register struct Lisp_Buffer_Local_Value *ptr
              = XBUFFER_LOCAL_VALUE (obj);
-           /* If the cdr is nil, avoid recursion for the car.  */
-           if (EQ (ptr->cdr, Qnil))
-             {
-               obj = ptr->realvalue;
-               goto loop;
-             }
            mark_object (ptr->realvalue);
-           mark_object (ptr->buffer);
-           mark_object (ptr->frame);
-           obj = ptr->cdr;
+           obj = ptr->cdrs;
            goto loop;
          }
 
index 0b899f250d4cb8e65e1b9812a2ab096805291eee..a666c690224c8413e02a0e0a1a16e580600366d7 100644 (file)
@@ -980,7 +980,7 @@ is the default binding of the variable. */)
       /* What binding is loaded right now?  */
       valcontents = sym->value;
       current_alist_element
-       = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
+       = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs));
 
       /* The value of the currently loaded binding is not
         stored in it, but rather in the realvalue slot.
@@ -2688,7 +2688,7 @@ swap_out_buffer_local_variables (b)
          && (sym = XCAR (XCAR (alist)), SYMBOLP (sym))
          /* Need not do anything if some other buffer's binding is
             now encached.  */
-         && EQ (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer,
+         && EQ (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->cdrs),
                 buffer))
        {
          /* Symbol is set up for this buffer's old local value:
index da74750952a8823958669ee38fa2d8fc70552fe8..a2ae1d6f33eb7cf918c9ffc69259f648df98dc9c 100644 (file)
@@ -1089,7 +1089,7 @@ swap_in_global_binding (symbol)
 {
   Lisp_Object valcontents = SYMBOL_VALUE (symbol);
   struct Lisp_Buffer_Local_Value *blv = XBUFFER_LOCAL_VALUE (valcontents);
-  Lisp_Object cdr = blv->cdr;
+  Lisp_Object cdr = BLOCAL_CDR (blv->cdrs);
 
   /* Unload the previously loaded binding.  */
   Fsetcdr (XCAR (cdr),
@@ -1100,10 +1100,9 @@ swap_in_global_binding (symbol)
   store_symval_forwarding (symbol, blv->realvalue, XCDR (cdr), NULL);
 
   /* Indicate that the global binding is set up now.  */
-  blv->frame = Qnil;
-  blv->buffer = Qnil;
-  blv->found_for_frame = 0;
-  blv->found_for_buffer = 0;
+  BLOCAL_FRAME (blv->cdrs) = Qnil;
+  BLOCAL_BUFFER (blv->cdrs) = Qnil;
+  BLOCAL_CLEAR_FLAGS (blv->cdrs);
 }
 
 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
@@ -1119,12 +1118,12 @@ swap_in_symval_forwarding (symbol, valcontents)
 {
   register Lisp_Object tem1;
 
-  tem1 = XBUFFER_LOCAL_VALUE (valcontents)->buffer;
+  tem1 = BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
 
   if (NILP (tem1)
       || current_buffer != XBUFFER (tem1)
       || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
-         && ! EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame)))
+         && ! EQ (selected_frame, BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs))))
     {
       struct Lisp_Symbol *sym = XSYMBOL (symbol);
       if (sym->indirect_variable)
@@ -1134,29 +1133,28 @@ swap_in_symval_forwarding (symbol, valcontents)
        }
 
       /* Unload the previously loaded binding.  */
-      tem1 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
+      tem1 = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs));
       Fsetcdr (tem1,
               do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
       /* Choose the new binding.  */
       tem1 = assq_no_quit (symbol, BUF_LOCAL_VAR_ALIST (current_buffer));
-      XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
-      XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
+      BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
       if (NILP (tem1))
        {
          if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
            tem1 = assq_no_quit (symbol, XFRAME (selected_frame)->param_alist);
          if (! NILP (tem1))
-           XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
+           BLOCAL_SET_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
          else
-           tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
+           tem1 = BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
        }
       else
-       XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
+       BLOCAL_SET_FOUND_FOR_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
 
       /* Load the new binding.  */
-      XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
-      XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, current_buffer);
-      XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
+      XSETCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs), tem1);
+      XSETBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs), current_buffer);
+      BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs) = selected_frame;
       store_symval_forwarding (symbol,
                               XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
                               Fcdr (tem1), NULL);
@@ -1282,17 +1280,17 @@ set_internal (symbol, newval, buf, bindflag)
 
       /* What binding is loaded right now?  */
       current_alist_element
-       = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
+       = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs));
 
       /* 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 (!BUFFERP (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
-         || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
+      if (!BUFFERP (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs))
+         || buf != XBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs))
          || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
-             && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
+             && !EQ (selected_frame, BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs)))
          /* Also unload a global binding (if the var is local_if_set). */
          || (EQ (XCAR (current_alist_element),
                  current_alist_element)))
@@ -1306,8 +1304,7 @@ set_internal (symbol, newval, buf, bindflag)
 
          /* Find the new binding.  */
          tem1 = Fassq (symbol, BUF_LOCAL_VAR_ALIST (buf));
-         XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 1;
-         XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
+         BLOCAL_SET_FOUND_FOR_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
 
          if (NILP (tem1))
            {
@@ -1322,16 +1319,16 @@ set_internal (symbol, newval, buf, bindflag)
              if (bindflag || !XBUFFER_LOCAL_VALUE (valcontents)->local_if_set
                  || let_shadows_buffer_binding_p (XSYMBOL (symbol)))
                {
-                 XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
+                 BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
 
                  if (XBUFFER_LOCAL_VALUE (valcontents)->check_frame)
                    tem1 = Fassq (symbol,
                                  XFRAME (selected_frame)->param_alist);
 
                  if (! NILP (tem1))
-                   XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 1;
+                   BLOCAL_SET_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
                  else
-                   tem1 = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
+                   tem1 = BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
                }
              /* If it's a Lisp_Buffer_Local_Value, being set not bound,
                 and we're not within a let that was made for this buffer,
@@ -1347,16 +1344,16 @@ set_internal (symbol, newval, buf, bindflag)
            }
 
          /* Record which binding is now loaded.  */
-         XSETCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, tem1);
+         XSETCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs), tem1);
 
          /* Set `buffer' and `frame' slots for the binding now loaded.  */
-         XSETBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer, buf);
-         XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
+         XSETBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs), buf);
+         BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs) = selected_frame;
        }
       innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
 
       /* Store the new value in the cons-cell.  */
-      XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr), newval);
+      XSETCDR (XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs)), newval);
     }
 
   /* If storing void (making the symbol void), forward only through
@@ -1401,12 +1398,12 @@ default_value (symbol)
         ordinary setq stores just that slot.  So use that.  */
       Lisp_Object current_alist_element, alist_element_car;
       current_alist_element
-       = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
+       = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs));
       alist_element_car = XCAR (current_alist_element);
       if (EQ (alist_element_car, current_alist_element))
        return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue);
       else
-       return XCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
+       return XCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs));
     }
   /* For other variables, get the current value.  */
   return do_symval_forwarding (valcontents);
@@ -1481,11 +1478,11 @@ for this variable.  */)
     return Fset (symbol, value);
 
   /* Store new value into the DEFAULT-VALUE slot.  */
-  XSETCDR (XBUFFER_LOCAL_VALUE (valcontents)->cdr, value);
+  XSETCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs), value);
 
   /* If the default binding is now loaded, set the REALVALUE slot too.  */
   current_alist_element
-    = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
+    = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)->cdrs));
   alist_element_buffer = Fcar (current_alist_element);
   if (EQ (alist_element_buffer, current_alist_element))
     store_symval_forwarding (symbol,
@@ -1573,6 +1570,9 @@ The function `default-value' gets the default value and `set-default' sets it.
     }
   else
     {
+      Lisp_Object len, val_vec;
+      XSETFASTINT (len, 4);
+      val_vec = Fmake_vector (len, Qnil);
       if (EQ (valcontents, Qunbound))
        sym->value = Qnil;
       tem = Fcons (Qnil, Fsymbol_value (variable));
@@ -1580,12 +1580,12 @@ The function `default-value' gets the default value and `set-default' sets it.
       newval = allocate_misc ();
       XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
       XBUFFER_LOCAL_VALUE (newval)->realvalue = sym->value;
-      XBUFFER_LOCAL_VALUE (newval)->buffer = Fcurrent_buffer ();
-      XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
-      XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
-      XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
+      BLOCAL_CLEAR_FLAGS (val_vec);
+      BLOCAL_BUFFER (val_vec) = Fcurrent_buffer ();
+      BLOCAL_FRAME (val_vec) = Qnil;
+      BLOCAL_CDR (val_vec) = tem;
       XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
-      XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
+      XBUFFER_LOCAL_VALUE (newval)->cdrs = val_vec;
       sym->value = newval;
     }
   XBUFFER_LOCAL_VALUE (newval)->local_if_set = 1;
@@ -1641,19 +1641,21 @@ Instead, use `add-hook' and specify t for the LOCAL argument.  */)
   /* Make sure symbol is set up to hold per-buffer values.  */
   if (!BUFFER_LOCAL_VALUEP (valcontents))
     {
-      Lisp_Object newval;
+      Lisp_Object newval, len, val_vec;
+      XSETFASTINT (len, 4);
+      val_vec = Fmake_vector (len, Qnil);
       tem = Fcons (Qnil, do_symval_forwarding (valcontents));
       XSETCAR (tem, tem);
       newval = allocate_misc ();
       XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
       XBUFFER_LOCAL_VALUE (newval)->realvalue = sym->value;
-      XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
-      XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
+      BLOCAL_CDR (val_vec);
+      BLOCAL_BUFFER (val_vec) = Qnil;
+      BLOCAL_FRAME (val_vec) = Qnil;
+      BLOCAL_CDR (val_vec) = tem;
       XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
-      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;
+      XBUFFER_LOCAL_VALUE (newval)->cdrs = val_vec;
       sym->value = newval;
     }
   /* Make sure this buffer has its own value of symbol.  */
@@ -1667,7 +1669,7 @@ Instead, use `add-hook' and specify t for the LOCAL argument.  */)
       find_symbol_value (variable);
 
       BUF_LOCAL_VAR_ALIST (current_buffer)
-        = Fcons (Fcons (variable, XCDR (XBUFFER_LOCAL_VALUE (sym->value)->cdr)),
+        = Fcons (Fcons (variable, XCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (sym->value)->cdrs))),
                 BUF_LOCAL_VAR_ALIST (current_buffer));
 
       /* Make sure symbol does not think it is set up for this buffer;
@@ -1677,10 +1679,10 @@ Instead, use `add-hook' and specify t for the LOCAL argument.  */)
 
        valcontents = sym->value;
 
-       pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
+       pvalbuf = &BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
        if (current_buffer == XBUFFER (*pvalbuf))
          *pvalbuf = Qnil;
-       XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
+       BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
       }
     }
 
@@ -1740,12 +1742,12 @@ From now on the default value will apply in this buffer.  Return VARIABLE.  */)
   {
     Lisp_Object *pvalbuf, buf;
     valcontents = sym->value;
-    pvalbuf = &XBUFFER_LOCAL_VALUE (valcontents)->buffer;
+    pvalbuf = &BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
     XSETBUFFER (buf, current_buffer);
     if (EQ (buf, *pvalbuf))
       {
        *pvalbuf = Qnil;
-       XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
+       BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
        find_symbol_value (variable);
       }
   }
@@ -1780,7 +1782,7 @@ frame-local bindings).  */)
      (variable)
      register Lisp_Object variable;
 {
-  register Lisp_Object tem, valcontents, newval;
+  register Lisp_Object tem, valcontents, newval, val_vec, len;
   struct Lisp_Symbol *sym;
 
   CHECK_SYMBOL (variable);
@@ -1803,15 +1805,17 @@ frame-local bindings).  */)
   tem = Fcons (Qnil, Fsymbol_value (variable));
   XSETCAR (tem, tem);
   newval = allocate_misc ();
+  XSETFASTINT (len, 4);
+  val_vec = Fmake_vector (len, Qnil);
   XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
   XBUFFER_LOCAL_VALUE (newval)->realvalue = sym->value;
-  XBUFFER_LOCAL_VALUE (newval)->buffer = Qnil;
-  XBUFFER_LOCAL_VALUE (newval)->frame = Qnil;
+  BLOCAL_CLEAR_FLAGS (val_vec);
+  BLOCAL_BUFFER (val_vec) = Qnil;
+  BLOCAL_FRAME (val_vec) = Qnil;
+  BLOCAL_CDR (val_vec) = tem;
   XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
-  XBUFFER_LOCAL_VALUE (newval)->found_for_buffer = 0;
-  XBUFFER_LOCAL_VALUE (newval)->found_for_frame = 0;
   XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
-  XBUFFER_LOCAL_VALUE (newval)->cdr = tem;
+  XBUFFER_LOCAL_VALUE (newval)->cdrs = val_vec;
   sym->value = newval;
   return variable;
 }
@@ -1936,8 +1940,8 @@ If the current binding is global (the default), the value is nil.  */)
       if (!NILP (Flocal_variable_p (variable, Qnil)))
        return Fcurrent_buffer ();
       else if (BUFFER_LOCAL_VALUEP (valcontents)
-              && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
-       return XBUFFER_LOCAL_VALUE (valcontents)->frame;
+              && BLOCAL_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs))
+       return BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
     }
 
   return Qnil;
index d725a497457ecdd4e9c1d543246c8d0565d6e5c4..189b0a524c9dae249a13ed1a4bbe1186e9b1ef85 100644 (file)
@@ -3282,8 +3282,8 @@ specbind (symbol, value)
          if (!NILP (Flocal_variable_p (symbol, Qnil)))
            where = self_buffer;
          else if (BUFFER_LOCAL_VALUEP (valcontents)
-                  && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
-           where = XBUFFER_LOCAL_VALUE (valcontents)->frame;
+                  && BLOCAL_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs))
+           where = BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs);
          else
            where = Qnil;
 
index c162fd7b1b4d3f17e9255d412ac87383389fa209..acbb33c6e9e817e711ee65663865de96af46f3a6 100644 (file)
@@ -2302,8 +2302,8 @@ store_frame_param (f, prop, val)
       valcontents = SYMBOL_VALUE (prop);
       if ((BUFFER_LOCAL_VALUEP (valcontents))
          && XBUFFER_LOCAL_VALUE (valcontents)->check_frame
-         && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame
-         && XFRAME (XBUFFER_LOCAL_VALUE (valcontents)->frame) == f)
+         && BLOCAL_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs)
+         && XFRAME (BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)->cdrs)) == f)
        swap_in_global_binding (prop);
     }
 
index 0d27c55efcea48ac209188b1bd0f0eabb2d443c3..657a1949003fbc9c190ba1a3e855ed5f23b64722 100644 (file)
@@ -1335,17 +1335,17 @@ struct Lisp_Buffer_Local_Value
     unsigned int check_frame : 1;
     /* 1 means that the binding now loaded was found
        as a local binding for the buffer in the `buffer' slot.  */
-    unsigned int found_for_buffer : 1;
+    /* unsigned int found_for_buffer : 1; */
     /* 1 means that the binding now loaded was found
        as a local binding for the frame in the `frame' slot.  */
-    unsigned int found_for_frame : 1;
+    /* unsigned int found_for_frame : 1; */
     Lisp_Object realvalue;
     /* The buffer and frame for which the loaded binding was found.  */
     /* Having both is only needed if we want to allow variables that are
        both buffer local and frame local (in which case, we currently give
        precedence to the buffer-local binding).  I don't think such
        a combination is desirable.  --Stef  */
-    Lisp_Object buffer, frame;
+    /* Lisp_Object buffer, frame; */
 
     /* A cons cell, (LOADED-BINDING . DEFAULT-VALUE).
 
@@ -1359,9 +1359,20 @@ struct Lisp_Buffer_Local_Value
        bindings for the variable.  When the default binding is loaded,
        LOADED-BINDING is actually this very cons cell; thus, its car
        points to itself.  */
-    Lisp_Object cdr;
+    /* Lisp_Object cdr; */
+
+    Lisp_Object cdrs;
   };
 
+#define BLOCAL_CLEAR_FLAGS(VEC) XSETFASTINT (AREF ((VEC), 0), 0)
+#define BLOCAL_FOUND_FOR_BUFFER(VEC) ((XFASTINT (AREF ((VEC), 0))) == 1)
+#define BLOCAL_SET_FOUND_FOR_BUFFER(VEC) XSETFASTINT (AREF ((VEC), 0), 1)
+#define BLOCAL_FOUND_FOR_FRAME(VEC) ((XFASTINT (AREF ((VEC), 0))) == 2)
+#define BLOCAL_SET_FOUND_FOR_FRAME(VEC) XSETFASTINT (AREF ((VEC), 0), 2)
+#define BLOCAL_BUFFER(VEC) (AREF ((VEC), 1))
+#define BLOCAL_FRAME(VEC) (AREF ((VEC), 2))
+#define BLOCAL_CDR(VEC) (AREF ((VEC), 3))
+
 /* START and END are markers in the overlay's buffer, and
    PLIST is the overlay's property list.  */
 struct Lisp_Overlay
index d8815ec40140bb638888322e39dd520b5d8c258d..f325ee1edd8b51a4aafa7099c04cab1256cab374 100644 (file)
@@ -2307,26 +2307,26 @@ print_object (obj, printcharfun, escapeflag)
          strout ("[realvalue] ", -1, -1, printcharfun, 0);
          print_object (XBUFFER_LOCAL_VALUE (obj)->realvalue,
                        printcharfun, escapeflag);
-         if (XBUFFER_LOCAL_VALUE (obj)->found_for_buffer)
+         if (BLOCAL_FOUND_FOR_BUFFER (XBUFFER_LOCAL_VALUE (obj)->cdrs))
            strout ("[local in buffer] ", -1, -1, printcharfun, 0);
          else
            strout ("[buffer] ", -1, -1, printcharfun, 0);
-         print_object (XBUFFER_LOCAL_VALUE (obj)->buffer,
+         print_object (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (obj)->cdrs),
                        printcharfun, escapeflag);
          if (XBUFFER_LOCAL_VALUE (obj)->check_frame)
            {
-             if (XBUFFER_LOCAL_VALUE (obj)->found_for_frame)
+             if (BLOCAL_FOUND_FOR_FRAME (XBUFFER_LOCAL_VALUE (obj)->cdrs))
                strout ("[local in frame] ", -1, -1, printcharfun, 0);
              else
                strout ("[frame] ", -1, -1, printcharfun, 0);
-             print_object (XBUFFER_LOCAL_VALUE (obj)->frame,
+             print_object (BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (obj)->cdrs),
                            printcharfun, escapeflag);
            }
          strout ("[alist-elt] ", -1, -1, printcharfun, 0);
-         print_object (XCAR (XBUFFER_LOCAL_VALUE (obj)->cdr),
+         print_object (XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (obj)->cdrs)),
                        printcharfun, escapeflag);
          strout ("[default-value] ", -1, -1, printcharfun, 0);
-         print_object (XCDR (XBUFFER_LOCAL_VALUE (obj)->cdr),
+         print_object (XCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (obj)->cdrs)),
                        printcharfun, escapeflag);
          PRINTCHAR ('>');
          break;