changeset 12113:d96b45f31afa

(Flocal_variable_p): New optional arg BUFFER. Really check whether var is local in *that* buffer.
author Karl Heuer <kwzh@gnu.org>
date Wed, 07 Jun 1995 21:07:25 +0000
parents 841aa5ac0f46
children 437964ecfc70
files src/data.c
diffstat 1 files changed, 33 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/data.c	Wed Jun 07 21:06:17 1995 +0000
+++ b/src/data.c	Wed Jun 07 21:07:25 1995 +0000
@@ -1339,20 +1339,45 @@
 }
 
 DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
-  1, 1, 0,
-  "Non-nil if VARIABLE has a local binding in the current buffer.")
-  (sym)
-     register Lisp_Object sym;
+  1, 2, 0,
+  "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
+BUFFER defaults to the current buffer.")
+  (sym, buffer)
+     register Lisp_Object sym, buffer;
 {
   Lisp_Object valcontents;
+  register struct buffer *buf;
+
+  if (NILP (buffer))
+    buf = current_buffer;
+  else
+    {
+      CHECK_BUFFER (buffer, 0);
+      buf = XBUFFER (buffer);
+    }
 
   CHECK_SYMBOL (sym, 0);
 
   valcontents = XSYMBOL (sym)->value;
-  return ((BUFFER_LOCAL_VALUEP (valcontents)
-	   || SOME_BUFFER_LOCAL_VALUEP (valcontents)
-	   || BUFFER_OBJFWDP (valcontents))
-	  ? Qt : Qnil);
+  if (BUFFER_LOCAL_VALUEP (valcontents)
+      && SOME_BUFFER_LOCAL_VALUEP (valcontents))
+    {
+      Lisp_Object tail, elt;
+      for (tail = buf->local_var_alist; CONSP (tail); tail = XCONS (tail)->cdr)
+	{
+	  elt = XCONS (tail)->car;
+	  if (EQ (sym, XCONS (elt)->car))
+	    return Qt;
+	}
+    }
+  if (BUFFER_OBJFWDP (valcontents))
+    {
+      int offset = XBUFFER_OBJFWD (valcontents)->offset;
+      int mask = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags));
+      if (mask == -1 || (buf->local_var_flags & mask))
+	return Qt;
+    }
+  return Qnil;
 }
 
 /* Find the function at the end of a chain of symbol function indirections.  */