]> git.eshelyaron.com Git - emacs.git/commitdiff
(swap_in_global_binding): New function.
authorGerd Moellmann <gerd@gnu.org>
Tue, 13 Jun 2000 13:21:59 +0000 (13:21 +0000)
committerGerd Moellmann <gerd@gnu.org>
Tue, 13 Jun 2000 13:21:59 +0000 (13:21 +0000)
src/data.c

index f43d15f8e960bebfeee0c7481ac42054cd382605..d083f5f84f57290cdd371bc581c738c461081377 100644 (file)
@@ -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] == ':'