From: Gerd Moellmann Date: Tue, 13 Jun 2000 13:21:59 +0000 (+0000) Subject: (swap_in_global_binding): New function. X-Git-Tag: emacs-pretest-21.0.90~3347 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=b0d53addf7f02e815af2809e5d0fa21c3c68806b;p=emacs.git (swap_in_global_binding): New function. --- diff --git a/src/data.c b/src/data.c index f43d15f8e96..d083f5f84f5 100644 --- a/src/data.c +++ b/src/data.c @@ -840,6 +840,36 @@ store_symval_forwarding (symbol, valcontents, newval) } } +/* Set up SYMBOL to refer to its global binding. + This makes it safe to alter the status of other bindings. */ + +void +swap_in_global_binding (symbol) + Lisp_Object symbol; +{ + Lisp_Object valcontents, cdr; + + valcontents = XSYMBOL (symbol)->value; + if (!BUFFER_LOCAL_VALUEP (valcontents) + && !SOME_BUFFER_LOCAL_VALUEP (valcontents)) + abort (); + cdr = XBUFFER_LOCAL_VALUE (valcontents)->cdr; + + /* Unload the previously loaded binding. */ + Fsetcdr (XCAR (cdr), + do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue)); + + /* Select the global binding in the symbol. */ + XCAR (cdr) = cdr; + store_symval_forwarding (symbol, valcontents, XCDR (cdr)); + + /* Indicate that the global binding is set up now. */ + XBUFFER_LOCAL_VALUE (valcontents)->frame = Qnil; + XBUFFER_LOCAL_VALUE (valcontents)->buffer = Qnil; + XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0; + XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0; +} + /* Set up the buffer-local symbol SYMBOL for validity in the current buffer. VALCONTENTS is the contents of its value cell, which points to a struct Lisp_Buffer_Local_Value. @@ -1003,6 +1033,9 @@ set_internal (symbol, newval, buf, bindflag) if (NILP (buf->name)) return newval; + if (strcmp (XSYMBOL (symbol)->name->data, "foo") == 0) + fprintf (stderr, "foo\n"); + CHECK_SYMBOL (symbol, 0); if (NILP (symbol) || EQ (symbol, Qt) || (XSYMBOL (symbol)->name->data[0] == ':'