From 3d51a8cdc85c280ff5e29d0d39b0c74b34d2e527 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Fri, 1 Jan 2010 02:10:06 +0100 Subject: [PATCH] Handle default value --- src/data.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/data.c b/src/data.c index 38c0d2b7780..c519ef91e25 100644 --- a/src/data.c +++ b/src/data.c @@ -101,21 +101,20 @@ 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)) { - Lisp_Object len, tem, parent = XCDR (XCAR (l->thread_data)); + Lisp_Object len, parent = XCDR (XCAR (l->thread_data)); XSETFASTINT (len, 4); ret = Fmake_vector (len, Qnil); /* FIXME: use the parent, not the first element. (or not?) */ 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; + BLOCAL_BUFFER_VEC (ret) = BLOCAL_BUFFER_VEC (ret); + BLOCAL_FRAME_VEC (ret) = BLOCAL_FRAME_VEC (ret); + BLOCAL_CDR_VEC (ret) = BLOCAL_CDR_VEC (parent); ret = Fcons (get_current_thread (), ret); l->thread_data = Fcons (ret, l->thread_data); XTHREADLOCAL (l->realvalue)->thread_alist = - Fcons (Fcons (get_current_thread (), Qunbound), + Fcons (Fcons (get_current_thread (), + XCDR (XCAR (XTHREADLOCAL (l->realvalue)->thread_alist))), XTHREADLOCAL (l->realvalue)->thread_alist); } @@ -1107,7 +1106,16 @@ store_symval_forwarding (symbol, valcontents, newval, buf) def: valcontents = SYMBOL_VALUE (symbol); if (BUFFER_LOCAL_VALUEP (valcontents)) - BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)) = newval; + { + Lisp_Object v = BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)); + if (EQ (v, XCAR (v))) + BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)) = newval; + else + { + Lisp_Object rv = XBUFFER_LOCAL_VALUE (valcontents)->realvalue; + XTHREADLOCAL (rv)->global = newval; + } + } else if (THREADLOCALP (valcontents)) { Lisp_Object val = indirect_variable (XSYMBOL (symbol))->value; @@ -1199,7 +1207,13 @@ swap_in_symval_forwarding (symbol, valcontents) Fcdr (tem1), NULL); } - return BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)); + { + Lisp_Object v = BLOCAL_CDR (XBUFFER_LOCAL_VALUE (valcontents)); + if (EQ (v, XCAR (v))) + return BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (valcontents)); + else + return XTHREADLOCAL (XBUFFER_LOCAL_VALUE (valcontents)->realvalue)->global; + } } @@ -1630,7 +1644,8 @@ The function `default-value' gets the default value and `set-default' sets it. XBUFFER_LOCAL_VALUE (newval)->realvalue = allocate_misc (); XMISCTYPE (XBUFFER_LOCAL_VALUE (newval)->realvalue) = Lisp_Misc_ThreadLocal; - XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval)->realvalue)->global = Qnil; + XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval)->realvalue)->global + = Fsymbol_value (variable); XTHREADLOCAL (XBUFFER_LOCAL_VALUE (newval)->realvalue)->thread_alist = Fcons (Fcons (get_current_thread (), Qnil), Qnil); BLOCAL_REALVALUE (XBUFFER_LOCAL_VALUE (newval)) = sym->value; -- 2.39.5