]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fdefvaralias): New function.
authorGerd Moellmann <gerd@gnu.org>
Fri, 5 Oct 2001 09:46:11 +0000 (09:46 +0000)
committerGerd Moellmann <gerd@gnu.org>
Fri, 5 Oct 2001 09:46:11 +0000 (09:46 +0000)
(specbind): Simplify the test if symbol is a constant.
(syms_of_eval): Defsubr Fdefvaralias.

src/eval.c

index 7c423fe9675b6db1fe7019232a08a58c952d5f68..10170548cf21a72470992ae62dbf3fd49cb76be0 100644 (file)
@@ -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);