]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fvariable_binding_locus): New function.
authorRichard M. Stallman <rms@gnu.org>
Fri, 19 Sep 2003 14:34:30 +0000 (14:34 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 19 Sep 2003 14:34:30 +0000 (14:34 +0000)
(syms_of_data): defsubr it.
(Flocal_variable_p): Delete duplicate call to indirect_variable.

src/data.c

index af635bf77be7ec5ac6473cce4ca38adb6fdcd1ce..3585d2d105b29f40cedc87b2eb5ff6808b11bec5 100644 (file)
@@ -1706,7 +1706,6 @@ BUFFER defaults to the current buffer.  */)
     {
       Lisp_Object tail, elt;
 
-      variable = indirect_variable (variable);
       for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
        {
          elt = XCAR (tail);
@@ -1765,6 +1764,41 @@ BUFFER defaults to the current buffer.  */)
     }
   return Qnil;
 }
+
+DEFUN ("variable-binding-locus", Fvariable_binding_locus, Svariable_binding_locus,
+       1, 1, 0,
+       doc: /* Return a value indicating where VARIABLE's current binding comes from.
+If the current binding is buffer-local, the value is the current buffer.
+If the current binding is frame-local, the value is the selected frame.
+If the current binding is global (the default), the value is nil.  */)
+     (variable)
+     register Lisp_Object variable;
+{
+  Lisp_Object valcontents;
+
+  CHECK_SYMBOL (variable);
+  variable = indirect_variable (variable);
+
+  /* Make sure the current binding is actually swapped in.  */
+  find_symbol_value (variable);
+
+  valcontents = XSYMBOL (variable)->value;
+
+  if (BUFFER_LOCAL_VALUEP (valcontents)
+      || SOME_BUFFER_LOCAL_VALUEP (valcontents)
+      || BUFFER_OBJFWDP (valcontents))
+    {
+      /* For a local variable, record both the symbol and which
+        buffer's or frame's value we are saving.  */
+      if (!NILP (Flocal_variable_p (variable, Qnil)))
+       return Fcurrent_buffer ();
+      else if (!BUFFER_OBJFWDP (valcontents)
+              && XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
+       return XBUFFER_LOCAL_VALUE (valcontents)->frame;
+    }
+
+  return Qnil;
+}
 \f
 /* Find the function at the end of a chain of symbol function indirections.  */
 
@@ -3185,6 +3219,7 @@ syms_of_data ()
   defsubr (&Smake_variable_frame_local);
   defsubr (&Slocal_variable_p);
   defsubr (&Slocal_variable_if_set_p);
+  defsubr (&Svariable_binding_locus);
   defsubr (&Saref);
   defsubr (&Saset);
   defsubr (&Snumber_to_string);