aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorJim Blandy <[email protected]>1992-09-30 11:35:45 +0000
committerJim Blandy <[email protected]>1992-09-30 11:35:45 +0000
commita5ca2b75400ef3026661de8f2e51f8b91c0e607e (patch)
tree8b593513cbad0e002440d28365094efdf552d764 /src/data.c
parentbad481d48fb13c87aee3717e082608ca14c7236c (diff)
* data.c (Fmake_local_variable): If SYM forwards to a C variable,
swap in the value for the current buffer immediately.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/data.c b/src/data.c
index 339302ac08..7d11d1cc80 100644
--- a/src/data.c
+++ b/src/data.c
@@ -1007,6 +1007,8 @@ not have their own values for this variable.")
return val;
}
+/* Lisp functions for creating and removing buffer-local variables. */
+
DEFUN ("make-variable-buffer-local", Fmake_variable_buffer_local, Smake_variable_buffer_local,
1, 1, "vMake Variable Buffer Local: ",
"Make VARIABLE have a separate value for each buffer.\n\
@@ -1101,8 +1103,18 @@ just as if the variable were set.")
if (current_buffer == XBUFFER (XCONS (XCONS (xs)->cdr)->car))
XCONS (XCONS (XSYMBOL (sym)->value)->cdr)->car = Qnil;
}
-
}
+
+ /* If the symbol forwards into a C variable, then swap in the
+ variable for this buffer immediately. If C code modifies the
+ variable before we swap in, then that new value will clobber the
+ default value the next time we swap. */
+ valcontents = XCONS (XSYMBOL (sym)->value)->car;
+ if (XTYPE (valcontents) == Lisp_Intfwd
+ || XTYPE (valcontents) == Lisp_Boolfwd
+ || XTYPE (valcontents) == Lisp_Objfwd)
+ swap_in_symval_forwarding (sym, XSYMBOL (sym)->value);
+
return sym;
}