]> git.eshelyaron.com Git - emacs.git/commitdiff
(enum symbol_interned): New enumeration.
authorGerd Moellmann <gerd@gnu.org>
Thu, 4 Oct 2001 08:50:20 +0000 (08:50 +0000)
committerGerd Moellmann <gerd@gnu.org>
Thu, 4 Oct 2001 08:50:20 +0000 (08:50 +0000)
(struct Lisp_Symbol): Remove member `obarray', add
`indirect_variable', `constant', and `interned'.
(SYMBOL_INTERNED_P, SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P)
(SYMBOL_CONSTANT_P, SYMBOL_VALUE, SET_SYMBOL_VALUE): New macros.
(indirect_variable): Add prototype.

src/lisp.h

index e0830b934b3c000831192c295bf2fbaa7b2964be..7f00783cf09fdeb0e4c9e84e91efad0e3c622892 100644 (file)
@@ -129,7 +129,7 @@ enum Lisp_Type
     Lisp_Type_Limit
   };
 
-/* This is the set of datatypes that share a common structure.
+/* This is the set of data types that share a common structure.
    The first member of the structure is a type code from this set.
    The enum values are arbitrary, but we'll use large numbers to make it
    more likely that we'll spot the error if a random word in memory is
@@ -327,7 +327,7 @@ enum pvec_type
 
 /* One need to override this if there must be high bits set in data space
    (doing the result of the below & ((1 << (GCTYPE + 1)) - 1) would work
-    on all machines, but would penalise machines which don't need it)
+    on all machines, but would penalize machines which don't need it)
  */
 #ifndef XTYPE
 #define XTYPE(a) ((enum Lisp_Type) ((a) >> VALBITS))
@@ -788,18 +788,6 @@ struct Lisp_Bool_Vector
     unsigned char data[1];
   };
 
-/* In a symbol, the markbit of the plist is used as the gc mark bit */
-
-struct Lisp_Symbol
-  {
-    struct Lisp_String *name;
-    Lisp_Object value;
-    Lisp_Object function;
-    Lisp_Object plist;
-    Lisp_Object obarray;
-    struct Lisp_Symbol *next;  /* -> next symbol in this obarray bucket */
-  };
-
 /* This structure describes a built-in function.
    It is generated by the DEFUN macro only.
    defsubr makes it into a Lisp object.
@@ -818,6 +806,90 @@ struct Lisp_Subr
     char *doc;
   };
 
+\f
+/***********************************************************************
+                              Symbols
+ ***********************************************************************/
+
+/* Interned state of a symbol.  */
+
+enum symbol_interned
+{
+  SYMBOL_UNINTERNED = 0,
+  SYMBOL_INTERNED = 1,
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY = 2
+};
+
+/* In a symbol, the markbit of the plist is used as the gc mark bit */
+
+struct Lisp_Symbol
+{
+  /* Non-zero means symbol serves as a variable alias.  The symbol
+     holding the real value is found in the value slot.  */
+  unsigned indirect_variable : 1;
+
+  /* Non-zero means symbol is constant, i.e. changing its value
+     should signal an error.  */
+  unsigned constant : 1;
+
+  /* Interned state of the symbol.  This is an enumerator from
+     enum symbol_interned.  */
+  unsigned interned : 2;
+
+  /* The symbol's name.  This should become a Lisp_Object
+     some day; there's no need for the Lisp_String pointer nowadays.  */
+  struct Lisp_String *name;
+
+  /* Value of the symbol or Qunbound if unbound.  If this symbol is a
+     defvaralias, `value' contains the symbol for which it is an
+     alias.  Use the SYMBOL_VALUE and SET_SYMBOL_VALUE macros to get
+     and set a symbol's value, to take defvaralias into account.  */
+  Lisp_Object value;
+
+  /* Function value of the symbol or Qunbound if not fcoundp.  */
+  Lisp_Object function;
+
+  /* The symbol's property list.  */
+  Lisp_Object plist;
+    
+  /* Next symbol in obarray bucket, if the symbol is interned.  */
+  struct Lisp_Symbol *next;
+};
+
+/* Value is non-zero if SYM is an interned symbol.  */
+
+#define SYMBOL_INTERNED_P(sym)  \
+     (XSYMBOL (sym)->interned != SYMBOL_UNINTERNED)
+
+/* Value is non-zero if SYM is interned in initial_obarray.  */
+
+#define SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P(sym) \
+     (XSYMBOL (sym)->interned == SYMBOL_INTERNED_IN_INITIAL_OBARRAY)
+
+/* Value is non-zero if symbol is considered a constant, i.e. its
+   value cannot be changed (there is an exception for keyword symbols,
+   whose value can be set to the keyword symbol itself).  */
+
+#define SYMBOL_CONSTANT_P(sym)   XSYMBOL (sym)->constant
+
+/* Value is the value of SYM, with defvaralias taken into
+   account.  */
+
+#define SYMBOL_VALUE(sym)                      \
+   (XSYMBOL (sym)->indirect_variable           \
+    ? XSYMBOL (indirect_variable (sym))->value \
+    : XSYMBOL (sym)->value)
+
+/* Set SYM's value to VAL, taking defvaralias into account.  */
+
+#define SET_SYMBOL_VALUE(sym, val)                             \
+     do {                                                      \
+       if (XSYMBOL (sym)->indirect_variable)                   \
+        XSYMBOL (indirect_variable ((sym)))->value = (val);    \
+       else                                                    \
+        XSYMBOL (sym)->value = (val);                          \
+     } while (0)
+     
 \f
 /***********************************************************************
                             Hash Tables
@@ -1923,6 +1995,7 @@ EXFUN (Fadd1, 1);
 EXFUN (Fsub1, 1);
 EXFUN (Fmake_variable_buffer_local, 1);
 
+extern Lisp_Object indirect_variable P_ ((Lisp_Object));
 extern Lisp_Object long_to_cons P_ ((unsigned long));
 extern unsigned long cons_to_long P_ ((Lisp_Object));
 extern void args_out_of_range P_ ((Lisp_Object, Lisp_Object));