From 19cebf5a641fb6be90f4512d468c53f0385539a8 Mon Sep 17 00:00:00 2001 From: Gerd Moellmann Date: Fri, 5 Oct 2001 09:46:11 +0000 Subject: [PATCH] (Fdefvaralias): New function. (specbind): Simplify the test if symbol is a constant. (syms_of_eval): Defsubr Fdefvaralias. --- src/eval.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/eval.c b/src/eval.c index 7c423fe9675..10170548cf2 100644 --- a/src/eval.c +++ b/src/eval.c @@ -667,6 +667,33 @@ and the result should be a form to be evaluated instead of the original.") return fn_name; } + +DEFUN ("defvaralias", Fdefvaralias, Sdefvaralias, 2, 2, 0, + "Make SYMBOL a variable alias for symbol ALIASED.\n\ +Setting the value of SYMBOL will subsequently set the value of ALIASED,\n\ +and getting the value of SYMBOL will return the value ALIASED has.\n\ +ALIASED nil means remove the alias; SYMBOL is unbound after that.") + (symbol, aliased) + Lisp_Object symbol, aliased; +{ + struct Lisp_Symbol *sym; + + CHECK_SYMBOL (symbol, 0); + CHECK_SYMBOL (aliased, 1); + + if (SYMBOL_CONSTANT_P (symbol)) + error ("Cannot make a constant an alias"); + + sym = XSYMBOL (symbol); + sym->indirect_variable = 1; + sym->value = aliased; + sym->constant = SYMBOL_CONSTANT_P (aliased); + LOADHIST_ATTACH (symbol); + + return aliased; +} + + DEFUN ("defvar", Fdefvar, Sdefvar, 1, UNEVALLED, 0, "Define SYMBOL as a variable.\n\ You are not required to define a variable in order to use it,\n\ @@ -2901,25 +2928,22 @@ specbind (symbol, value) Lisp_Object symbol, value; { Lisp_Object ovalue; + Lisp_Object valcontents; CHECK_SYMBOL (symbol, 0); if (specpdl_ptr == specpdl + specpdl_size) grow_specpdl (); - /* The most common case is that a non-constant symbol with a trivial - value. Make that as fast as we can. */ - if (!MISCP (XSYMBOL (symbol)->value) - && !EQ (symbol, Qnil) - && !EQ (symbol, Qt) - && !(XSYMBOL (symbol)->name->data[0] == ':' - && EQ (XSYMBOL (symbol)->obarray, initial_obarray) - && !EQ (value, symbol))) + /* The most common case is that of a non-constant symbol with a + trivial value. Make that as fast as we can. */ + valcontents = SYMBOL_VALUE (symbol); + if (!MISCP (valcontents) && !SYMBOL_CONSTANT_P (symbol)) { specpdl_ptr->symbol = symbol; - specpdl_ptr->old_value = XSYMBOL (symbol)->value; + specpdl_ptr->old_value = valcontents; specpdl_ptr->func = NULL; ++specpdl_ptr; - XSYMBOL (symbol)->value = value; + SET_SYMBOL_VALUE (symbol, value); } else { @@ -3038,8 +3062,8 @@ unbind_to (count, value) /* If variable has a trivial value (no forwarding), we can just set it. No need to check for constant symbols here, since that was already done by specbind. */ - if (!MISCP (XSYMBOL (specpdl_ptr->symbol)->value)) - XSYMBOL (specpdl_ptr->symbol)->value = specpdl_ptr->old_value; + if (!MISCP (SYMBOL_VALUE (specpdl_ptr->symbol))) + SET_SYMBOL_VALUE (specpdl_ptr->symbol, specpdl_ptr->old_value); else set_internal (specpdl_ptr->symbol, specpdl_ptr->old_value, 0, 1); } @@ -3358,6 +3382,7 @@ still determine whether to handle the particular condition."); defsubr (&Sdefun); defsubr (&Sdefmacro); defsubr (&Sdefvar); + defsubr (&Sdefvaralias); defsubr (&Sdefconst); defsubr (&Suser_variable_p); defsubr (&Slet); -- 2.39.2