# HG changeset patch # User Karl Heuer # Date 784539327 0 # Node ID 924f7b9ce544e80125d79b74782b9ce7f6cc8f14 # Parent a541739a1ba833e214092b2b434f1d7107ce175b (store_symval_forwarding, swap_in_symval_forwarding, Fset, default_value, Fset_default, Fkill_local_variable): Use XBUFFER_LOCAL_VALUE, not XCONS. (Fmake_variable_buffer_local, Fmake_local_variable): Use the new substructure. diff -r a541739a1ba8 -r 924f7b9ce544 src/data.c --- a/src/data.c Fri Nov 11 07:34:37 1994 +0000 +++ b/src/data.c Fri Nov 11 07:35:27 1994 +0000 @@ -695,7 +695,7 @@ valcontents = XSYMBOL (sym)->value; if (BUFFER_LOCAL_VALUEP (valcontents) || SOME_BUFFER_LOCAL_VALUEP (valcontents)) - XCONS (XSYMBOL (sym)->value)->car = newval; + XBUFFER_LOCAL_VALUE (valcontents)->car = newval; else XSYMBOL (sym)->value = newval; } @@ -727,20 +727,23 @@ Note that REALVALUE can be a forwarding pointer. */ register Lisp_Object tem1; - tem1 = XCONS (XCONS (valcontents)->cdr)->car; + tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car; if (NILP (tem1) || current_buffer != XBUFFER (tem1)) { - tem1 = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; - Fsetcdr (tem1, do_symval_forwarding (XCONS (valcontents)->car)); + tem1 = XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car; + Fsetcdr (tem1, + do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car)); tem1 = assq_no_quit (sym, current_buffer->local_var_alist); if (NILP (tem1)) - tem1 = XCONS (XCONS (valcontents)->cdr)->cdr; - XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1; - XSETBUFFER (XCONS (XCONS (valcontents)->cdr)->car, current_buffer); - store_symval_forwarding (sym, XCONS (valcontents)->car, Fcdr (tem1)); + tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr; + XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car = tem1; + XSETBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car, + current_buffer); + store_symval_forwarding (sym, XBUFFER_LOCAL_VALUE (valcontents)->car, + Fcdr (tem1)); } - return XCONS (valcontents)->car; + return XBUFFER_LOCAL_VALUE (valcontents)->car; } /* Find the value of a symbol, returning Qunbound if it's not bound. @@ -825,7 +828,8 @@ else if (BUFFER_LOCAL_VALUEP (valcontents) || SOME_BUFFER_LOCAL_VALUEP (valcontents)) { - /* valcontents is actually a pointer to a cons heading something like: + /* 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 @@ -854,14 +858,14 @@ /* What value are we caching right now? */ current_alist_element = - XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; + XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car; /* 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 ((current_buffer - != XBUFFER (XCONS (XCONS (valcontents)->cdr)->car)) + != XBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car)) || (BUFFER_LOCAL_VALUEP (valcontents) && EQ (XCONS (current_alist_element)->car, current_alist_element))) @@ -870,7 +874,7 @@ back to its alist element. This works if the current buffer only sees the default value, too. */ Fsetcdr (current_alist_element, - do_symval_forwarding (XCONS (valcontents)->car)); + do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car)); /* Find the new value for CURRENT-ALIST-ELEMENT. */ tem1 = Fassq (sym, current_buffer->local_var_alist); @@ -882,7 +886,7 @@ make CURRENT-ALIST-ELEMENT point to itself, indicating that we're seeing the default value. */ if (SOME_BUFFER_LOCAL_VALUEP (valcontents)) - tem1 = XCONS (XCONS (valcontents)->cdr)->cdr; + tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr; /* If it's a Lisp_Buffer_Local_Value, give this buffer a new assoc for a local value and set @@ -895,12 +899,14 @@ } } /* Cache the new buffer's assoc in CURRENT-ALIST-ELEMENT. */ - XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car = tem1; + XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car + = tem1; /* Set BUFFER, now that CURRENT-ALIST-ELEMENT is accurate. */ - XSETBUFFER (XCONS (XCONS (valcontents)->cdr)->car, current_buffer); + XSETBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car, + current_buffer); } - valcontents = XCONS (valcontents)->car; + valcontents = XBUFFER_LOCAL_VALUE (valcontents)->car; } /* If storing void (making the symbol void), forward only through @@ -947,12 +953,12 @@ ordinary setq stores just that slot. So use that. */ Lisp_Object current_alist_element, alist_element_car; current_alist_element - = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; + = XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car; alist_element_car = XCONS (current_alist_element)->car; if (EQ (alist_element_car, current_alist_element)) - return do_symval_forwarding (XCONS (valcontents)->car); + return do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car); else - return XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr; + return XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->cdr; } /* For other variables, get the current value. */ return do_symval_forwarding (valcontents); @@ -1024,13 +1030,15 @@ return Fset (sym, value); /* Store new value into the DEFAULT-VALUE slot */ - XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->cdr = value; + XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->cdr = value; /* If that slot is current, we must set the REALVALUE slot too */ - current_alist_element = XCONS (XCONS (XCONS (valcontents)->cdr)->cdr)->car; + current_alist_element + = XCONS (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr)->car; alist_element_buffer = Fcar (current_alist_element); if (EQ (alist_element_buffer, current_alist_element)) - store_symval_forwarding (sym, XCONS (valcontents)->car, value); + store_symval_forwarding (sym, XBUFFER_LOCAL_VALUE (valcontents)->car, + value); return value; } @@ -1087,7 +1095,7 @@ (sym) register Lisp_Object sym; { - register Lisp_Object tem, valcontents; + register Lisp_Object tem, valcontents, newval; CHECK_SYMBOL (sym, 0); @@ -1099,15 +1107,18 @@ return sym; if (SOME_BUFFER_LOCAL_VALUEP (valcontents)) { - XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value); + XMISC (XSYMBOL (sym)->value)->type = Lisp_Misc_Buffer_Local_Value; return sym; } if (EQ (valcontents, Qunbound)) XSYMBOL (sym)->value = Qnil; tem = Fcons (Qnil, Fsymbol_value (sym)); XCONS (tem)->car = tem; - XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Fcurrent_buffer (), tem)); - XSETTYPE (XSYMBOL (sym)->value, Lisp_Buffer_Local_Value); + newval = allocate_misc (); + XMISC (newval)->type = Lisp_Misc_Buffer_Local_Value; + XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (sym)->value; + XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Fcurrent_buffer (), tem); + XSYMBOL (sym)->value = newval; return sym; } @@ -1147,28 +1158,31 @@ /* Make sure sym is set up to hold per-buffer values */ if (!SOME_BUFFER_LOCAL_VALUEP (valcontents)) { + Lisp_Object newval; tem = Fcons (Qnil, do_symval_forwarding (valcontents)); XCONS (tem)->car = tem; - XSYMBOL (sym)->value = Fcons (XSYMBOL (sym)->value, Fcons (Qnil, tem)); - XSETTYPE (XSYMBOL (sym)->value, Lisp_Some_Buffer_Local_Value); + newval = allocate_misc (); + XMISC (newval)->type = Lisp_Misc_Some_Buffer_Local_Value; + XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (sym)->value; + XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Qnil, tem); + XSYMBOL (sym)->value = newval; } /* Make sure this buffer has its own value of sym */ tem = Fassq (sym, current_buffer->local_var_alist); if (NILP (tem)) { current_buffer->local_var_alist - = Fcons (Fcons (sym, XCONS (XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->cdr)->cdr), + = Fcons (Fcons (sym, XCONS (XCONS (XBUFFER_LOCAL_VALUE (XSYMBOL (sym)->value)->cdr)->cdr)->cdr), 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 */ { - /* This local variable avoids "expression too complex" on IBM RT. */ - Lisp_Object xs; - - xs = XSYMBOL (sym)->value; - if (current_buffer == XBUFFER (XCONS (XCONS (xs)->cdr)->car)) - XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Qnil; + Lisp_Object *pvalbuf; + valcontents = XSYMBOL (sym)->value; + pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car; + if (current_buffer == XBUFFER (*pvalbuf)) + *pvalbuf = Qnil; } } @@ -1176,7 +1190,7 @@ 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. */ - valcontents = XCONS (XSYMBOL (sym)->value)->car; + valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (sym)->value)->car; if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents)) swap_in_symval_forwarding (sym, XSYMBOL (sym)->value); @@ -1219,15 +1233,17 @@ tem = Fassq (sym, current_buffer->local_var_alist); if (!NILP (tem)) - current_buffer->local_var_alist = Fdelq (tem, current_buffer->local_var_alist); + current_buffer->local_var_alist + = Fdelq (tem, 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 */ { - Lisp_Object sv; - sv = XSYMBOL (sym)->value; - if (current_buffer == XBUFFER (XCONS (XCONS (sv)->cdr)->car)) - XCONS (XCONS (sv)->cdr)->car = Qnil; + Lisp_Object *pvalbuf; + valcontents = XSYMBOL (sym)->value; + pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car; + if (current_buffer == XBUFFER (*pvalbuf)) + *pvalbuf = Qnil; } return sym;