Lisp_Object impl_Vmost_positive_fixnum, impl_Vmost_negative_fixnum;
-Lisp_Object
+Lisp_Object *
blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l)
{
Lisp_Object ret = assq_no_quit (get_current_thread (), l->thread_data);
if (NILP (ret))
{
- /* FIXME: use the parent, not the first element. (or not?) */
- Lisp_Object tem, len, parent = XCDR (XCAR (l->thread_data));
-
- XSETFASTINT (len, 4);
+ Lisp_Object len;
+ XSETFASTINT (len, 5);
ret = Fmake_vector (len, Qnil);
BLOCAL_CLEAR_FLAGS_VEC (ret);
- XSETFASTINT (AREF (ret, 0), AREF (parent, 0));
- BLOCAL_BUFFER_VEC (ret) = BLOCAL_BUFFER_VEC (parent);
- BLOCAL_FRAME_VEC (ret) = BLOCAL_FRAME_VEC (parent);
-
- tem = Fcons (Qnil, Qnil);
- XSETCAR (tem, tem);
- BLOCAL_CDR_VEC (ret) = tem;
- l->thread_data = Fcons (Fcons (get_current_thread (), ret), l->thread_data);
+ if (!NILP (l->thread_data))
+ {
+ /* FIXME: use the parent, not the first element. (or not?) */
+ Lisp_Object tem, parent = XCDR (XCAR (l->thread_data));
+ XSETFASTINT (AREF (ret, 0), AREF (parent, 0));
+ BLOCAL_BUFFER_VEC (ret) = BLOCAL_BUFFER_VEC (parent);
+ BLOCAL_FRAME_VEC (ret) = BLOCAL_FRAME_VEC (parent);
+ tem = Fcons (Qnil, Qnil);
+ XSETCAR (tem, tem);
+
+ BLOCAL_CDR_VEC (ret) = tem;
+ }
+
+ l->thread_data = Fcons (Fcons (get_current_thread (), ret),
+ l->thread_data);
}
- return XCDR (ret);
+ return &XCDR_AS_LVALUE (ret);
}
void
l->thread_data = Fcons (Fcons (get_current_thread (), obj), Qnil);
}
-Lisp_Object *
-blocal_get_realvalue (struct Lisp_Buffer_Local_Value *l)
-{
- Lisp_Object current_thread = get_current_thread ();
- Lisp_Object ret = assq_no_quit (current_thread, l->realvalue);
- if (NILP (ret))
- {
- ret = Fcons (current_thread, Qnil);
- l->realvalue = Fcons (ret, l->realvalue);
- }
-
- return &XCDR_AS_LVALUE (ret);
-}
-
void
circular_list_error (list)
Lisp_Object list;
def:
valcontents = SYMBOL_VALUE (symbol);
if (BUFFER_LOCAL_VALUEP (valcontents))
- BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)) = newval;
+ BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)) = newval;
else if (THREADLOCALP (valcontents))
*find_variable_location (&indirect_variable (XSYMBOL (symbol))->value) = newval;
else
/* Unload the previously loaded binding. */
Fsetcdr (XCAR (cdr),
- do_symval_forwarding (BLOCAL_GET_REALVALUE (blv)));
+ do_symval_forwarding (BLOCAL_REALVALUE (blv)));
/* Select the global binding in the symbol. */
XSETCAR (cdr, cdr);
- store_symval_forwarding (symbol, BLOCAL_GET_REALVALUE (blv), XCDR (cdr), NULL);
+ store_symval_forwarding (symbol, BLOCAL_REALVALUE (blv), XCDR (cdr), NULL);
/* Indicate that the global binding is set up now. */
BLOCAL_FRAME (blv) = Qnil;
/* Unload the previously loaded binding. */
tem1 = XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)));
Fsetcdr (tem1,
- do_symval_forwarding (BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents))));
+ do_symval_forwarding (BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents))));
/* Choose the new binding. */
tem1 = assq_no_quit (symbol, BUF_LOCAL_VAR_ALIST (current_buffer));
BLOCAL_CLEAR_FLAGS (XBUFFER_LOCAL_VALUE (valcontents));
XSETBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)), current_buffer);
BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)) = selected_frame;
store_symval_forwarding (symbol,
- BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)),
+ BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)),
Fcdr (tem1), NULL);
}
- return BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents));
+ return BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents));
}
\f
/* Find the value of a symbol, returning Qunbound if it's not bound.
/* Write out `realvalue' to the old loaded binding. */
Fsetcdr (current_alist_element,
- do_symval_forwarding (BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents))));
+ do_symval_forwarding (BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents))));
/* Find the new binding. */
tem1 = Fassq (symbol, BUF_LOCAL_VAR_ALIST (buf));
XSETBUFFER (BLOCAL_BUFFER (XBUFFER_LOCAL_VALUE (valcontents)), buf);
BLOCAL_FRAME (XBUFFER_LOCAL_VALUE (valcontents)) = selected_frame;
}
- innercontents = BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents));
+ innercontents = BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents));
/* Store the new value in the cons-cell. */
XSETCDR (XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents))), newval);
= XCAR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)));
alist_element_car = XCAR (current_alist_element);
if (EQ (alist_element_car, current_alist_element))
- return do_symval_forwarding (BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)));
+ return do_symval_forwarding (BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)));
else
return XCDR (BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)));
}
alist_element_buffer = Fcar (current_alist_element);
if (EQ (alist_element_buffer, current_alist_element))
store_symval_forwarding (symbol,
- BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)),
+ BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)),
value, NULL);
return value;
else
{
Lisp_Object len, val_vec;
- XSETFASTINT (len, 4);
+ XSETFASTINT (len, 5);
val_vec = Fmake_vector (len, Qnil);
if (EQ (valcontents, Qunbound))
sym->value = Qnil;
XSETCAR (tem, tem);
newval = allocate_misc ();
XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
- XBUFFER_LOCAL_VALUE (newval)->realvalue = Qnil;
- BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value;
+ XBUFFER_LOCAL_VALUE (newval)->thread_data = Qnil;
+ BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value;
BLOCAL_CLEAR_FLAGS_VEC (val_vec);
BLOCAL_BUFFER_VEC (val_vec) = Fcurrent_buffer ();
BLOCAL_FRAME_VEC (val_vec) = Qnil;
if (!BUFFER_LOCAL_VALUEP (valcontents))
{
Lisp_Object newval, len, val_vec;
- XSETFASTINT (len, 4);
+ XSETFASTINT (len, 5);
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 = Qnil;
- BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value;
+ XBUFFER_LOCAL_VALUE (newval)->thread_data = Qnil;
+ BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value;
BLOCAL_CDR_VEC (val_vec);
BLOCAL_BUFFER_VEC (val_vec) = Qnil;
BLOCAL_FRAME_VEC (val_vec) = Qnil;
+ BLOCAL_REALVALUE_VEC (val_vec) = Qnil;
BLOCAL_CDR_VEC (val_vec) = tem;
XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
XBUFFER_LOCAL_VALUE (newval)->check_frame = 0;
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 = BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (sym->value));
+ valcontents = BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (sym->value));
if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
swap_in_symval_forwarding (variable, sym->value);
tem = Fcons (Qnil, Fsymbol_value (variable));
XSETCAR (tem, tem);
newval = allocate_misc ();
- XSETFASTINT (len, 4);
+ XSETFASTINT (len, 5);
val_vec = Fmake_vector (len, Qnil);
XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
- XBUFFER_LOCAL_VALUE (newval)->realvalue = Qnil;
- BLOCAL_GET_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value;
+ XBUFFER_LOCAL_VALUE (newval)->thread_data = Qnil;
+ BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value;
BLOCAL_CLEAR_FLAGS_VEC (val_vec);
BLOCAL_BUFFER_VEC (val_vec) = Qnil;
BLOCAL_FRAME_VEC (val_vec) = Qnil;
BLOCAL_CDR_VEC (val_vec) = tem;
+ BLOCAL_REALVALUE_VEC (val_vec) = Qnil;
XBUFFER_LOCAL_VALUE (newval)->local_if_set = 0;
XBUFFER_LOCAL_VALUE (newval)->check_frame = 1;
BLOCAL_SET_THREAD_DATA (XBUFFER_LOCAL_VALUE (newval), val_vec);
/* 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; */
- Lisp_Object realvalue;
+ /*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
Lisp_Object thread_data;
};
-Lisp_Object blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l);
-Lisp_Object *blocal_get_realvalue (struct Lisp_Buffer_Local_Value *l);
+Lisp_Object *blocal_get_thread_data (struct Lisp_Buffer_Local_Value *l);
void blocal_set_thread_data (struct Lisp_Buffer_Local_Value *l, Lisp_Object o);
-#define BLOCAL_GET_REALVALUE(A) (*blocal_get_realvalue (A))
#define BLOCAL_CLEAR_FLAGS_VEC(VEC) XSETFASTINT (AREF ((VEC), 0), 0)
#define BLOCAL_FOUND_FOR_BUFFER_VEC(VEC) ((XFASTINT (AREF ((VEC), 0))) == 1)
#define BLOCAL_SET_FOUND_FOR_BUFFER_VEC(VEC) XSETFASTINT (AREF ((VEC), 0), 1)
#define BLOCAL_BUFFER_VEC(VEC) (AREF ((VEC), 1))
#define BLOCAL_FRAME_VEC(VEC) (AREF ((VEC), 2))
#define BLOCAL_CDR_VEC(VEC) (AREF ((VEC), 3))
-#define BLOCAL_THREAD_DATA(A) (blocal_get_thread_data (A))
+#define BLOCAL_REALVALUE_VEC(VEC) (AREF ((VEC), 4))
+#define BLOCAL_THREAD_DATA(A) (*blocal_get_thread_data (A))
#define BLOCAL_SET_THREAD_DATA(A, B) (blocal_set_thread_data (A, B))
#define BLOCAL_CLEAR_FLAGS(A) (BLOCAL_CLEAR_FLAGS_VEC (BLOCAL_THREAD_DATA (A)))
#define BLOCAL_FOUND_FOR_BUFFER(A) (BLOCAL_FOUND_FOR_BUFFER_VEC (BLOCAL_THREAD_DATA (A)))
#define BLOCAL_BUFFER(A) (BLOCAL_BUFFER_VEC (BLOCAL_THREAD_DATA (A)))
#define BLOCAL_FRAME(A) (BLOCAL_FRAME_VEC (BLOCAL_THREAD_DATA (A)))
#define BLOCAL_CDR(A) (BLOCAL_CDR_VEC (BLOCAL_THREAD_DATA (A)))
+#define BLOCAL_REALVALUE(A) (BLOCAL_REALVALUE_VEC (BLOCAL_THREAD_DATA (A)))
/* START and END are markers in the overlay's buffer, and