]> git.eshelyaron.com Git - emacs.git/commitdiff
Store symbol value into the binding
authorAndrea Corallo <akrl@sdf.org>
Thu, 7 May 2020 19:36:25 +0000 (20:36 +0100)
committerAndrea Corallo <akrl@sdf.org>
Fri, 8 May 2020 13:30:12 +0000 (14:30 +0100)
src/alloc.c
src/data.c
src/lexspaces.c
src/lisp.h
src/pdumper.c

index cc9ba8dbf50902dc39f20e6c2863ebcbc4e849dd..e7ba4ddd70bc5079a9c627657d324098977430e5 100644 (file)
@@ -3523,7 +3523,7 @@ init_symbol (Lisp_Object val, Lisp_Object name)
   set_symbol_name (val, name);
   set_symbol_plist (val, Qnil);
   p->u.s.redirect = SYMBOL_PLAINVAL;
-  SET_SYMBOL_VAL (p, Qunbound);
+  p->u.s.val.value = Qunbound;
   set_symbol_function (val, Qnil);
   set_symbol_next (val, NULL);
   p->u.s.gcmarkbit = false;
@@ -6652,7 +6652,7 @@ mark_object (Lisp_Object arg)
        mark_object (ptr->u.s.plist);
        switch (ptr->u.s.redirect)
          {
-         case SYMBOL_PLAINVAL: mark_object (SYMBOL_VAL (ptr)); break;
+         case SYMBOL_PLAINVAL: mark_object (ptr->u.s.val.value); break;
          case SYMBOL_VARALIAS:
            {
              Lisp_Object tem;
index 1db0a983b4971f943812b2ad1566a44f73b1735e..1ab203f9de6d2e53af7e091801ce62660675c704 100644 (file)
@@ -259,6 +259,8 @@ for example, (type-of 1) returns `integer'.  */)
           }
         case PVEC_MODULE_FUNCTION:
           return Qmodule_function;
+       case PVEC_BINDING:
+         return Qbinding;
         case PVEC_XWIDGET:
           return Qxwidget;
         case PVEC_XWIDGET_VIEW:
index feb0adfdaef05d7ce6b022981dc788c11791769d..bfb59a1d108b0961c5f67830c5083fdff938d0d7 100644 (file)
@@ -20,6 +20,8 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <config.h>
 #include "lisp.h"
 
+EMACS_INT curr_lexspace;
+
 DEFUN ("in-lexspace", Fin_lexspace, Sin_lexspace, 1, 1, 0,
        doc: /* Set NAME as current lexspace.  Create it in case.   */)
   (Lisp_Object name)
index 15b1f8db9ca3947db8a4f09aa7fc6d2055ae0951..eff7d301372b9c1146bce899c61da29a94acea92 100644 (file)
@@ -377,14 +377,10 @@ typedef EMACS_INT Lisp_Word;
        & ((1 << INTTYPEBITS) - 1)))
 #define lisp_h_FLOATP(x) TAGGEDP (x, Lisp_Float)
 #define lisp_h_NILP(x) EQ (x, Qnil)
-#define lisp_h_SET_SYMBOL_VAL(sym, v) \
-   (eassert ((sym)->u.s.redirect == SYMBOL_PLAINVAL), \
-    (sym)->u.s.val.value = (v))
+
 #define lisp_h_SYMBOL_CONSTANT_P(sym) \
    (XSYMBOL (sym)->u.s.trapped_write == SYMBOL_NOWRITE)
 #define lisp_h_SYMBOL_TRAPPED_WRITE_P(sym) (XSYMBOL (sym)->u.s.trapped_write)
-#define lisp_h_SYMBOL_VAL(sym) \
-   (eassert ((sym)->u.s.redirect == SYMBOL_PLAINVAL), (sym)->u.s.val.value)
 #define lisp_h_SYMBOLP(x) TAGGEDP (x, Lisp_Symbol)
 #define lisp_h_TAGGEDP(a, tag) \
    (! (((unsigned) (XLI (a) >> (USE_LSB_TAG ? 0 : VALBITS)) \
@@ -2168,16 +2164,56 @@ typedef jmp_buf sys_jmp_buf;
 
 #include "thread.h"
 
+\f
+/* Lexspaces and binding. */
+
+#define MAX_LEXSPACES 256
+
+extern EMACS_INT curr_lexspace;
+
+INLINE Lisp_Object make_binding (void);
+
+struct Lisp_Binding
+{
+  union vectorlike_header header;
+  Lisp_Object b[MAX_LEXSPACES];
+};
+
+INLINE bool
+BINDINGP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_BINDING);
+}
+
+INLINE void
+CHECK_BINDING (Lisp_Object b)
+{
+  CHECK_TYPE (BINDINGP (b), Qbinding, b);
+}
+
+INLINE struct Lisp_Binding *
+XBINDING (Lisp_Object b)
+{
+  eassert (BINDINGP (b));
+  return XUNTAG (b, Lisp_Vectorlike, struct Lisp_Binding);
+}
+
 /***********************************************************************
                               Symbols
  ***********************************************************************/
 
 /* Value is name of symbol.  */
 
+/* FIXME move back to macro.  */
 INLINE Lisp_Object
-(SYMBOL_VAL) (struct Lisp_Symbol *sym)
+SYMBOL_VAL (struct Lisp_Symbol *sym)
 {
-  return lisp_h_SYMBOL_VAL (sym);
+  eassert (sym->u.s.redirect == SYMBOL_PLAINVAL);
+  if (EQ (sym->u.s.val.value, Qunbound))
+    return Qunbound;
+  eassert (BINDINGP (sym->u.s.val.value));
+ /* FIXME: add loop to follow indirection.  */
+  return XBINDING (sym->u.s.val.value)->b[curr_lexspace];
 }
 
 INLINE struct Lisp_Symbol *
@@ -2199,10 +2235,15 @@ SYMBOL_FWD (struct Lisp_Symbol *sym)
   return sym->u.s.val.fwd;
 }
 
+/* FIXME move it back to macro. */
 INLINE void
-(SET_SYMBOL_VAL) (struct Lisp_Symbol *sym, Lisp_Object v)
+SET_SYMBOL_VAL (struct Lisp_Symbol *sym, Lisp_Object v)
 {
-  lisp_h_SET_SYMBOL_VAL (sym, v);
+  eassert (sym->u.s.redirect == SYMBOL_PLAINVAL);
+  if (EQ (sym->u.s.val.value, Qunbound))
+    sym->u.s.val.value = make_binding ();
+  struct Lisp_Binding *binding = XBINDING (sym->u.s.val.value);
+  binding->b[curr_lexspace] = v;
 }
 
 INLINE void
@@ -2938,12 +2979,6 @@ RECORDP (Lisp_Object a)
   return PSEUDOVECTORP (a, PVEC_RECORD);
 }
 
-INLINE bool
-BINDINGP (Lisp_Object a)
-{
-  return PSEUDOVECTORP (a, PVEC_BINDING);
-}
-
 INLINE void
 CHECK_RECORD (Lisp_Object x)
 {
@@ -5043,36 +5078,12 @@ maybe_gc (void)
     maybe_garbage_collect ();
 }
 
-\f
-/* Lexspaces and binding. */
-
-#define MAX_LEXSPACES 256
-
-struct Lisp_Binding
-{
-  union vectorlike_header header;
-  Lisp_Object b[MAX_LEXSPACES];
-};
-
-INLINE void
-CHECK_BINDING (Lisp_Object b)
-{
-  CHECK_TYPE (BINDINGP (b), Qbinding, b);
-}
-
-INLINE struct Lisp_Binding *
-XBINDING (Lisp_Object b)
-{
-  eassert (BINDINGP (b));
-  return XUNTAG (b, Lisp_Vectorlike, struct Lisp_Binding);
-}
-
 INLINE Lisp_Object
 make_binding (void)
 {
   struct Lisp_Binding *binding =
     ALLOCATE_ZEROED_PSEUDOVECTOR (struct Lisp_Binding,
-                                 b[MAX_LEXSPACES], PVEC_BINDING);
+                                 b[MAX_LEXSPACES - 1], PVEC_BINDING);
   for (EMACS_INT i = 0; i < MAX_LEXSPACES; i++)
     binding->b[i] = Qunbound;
   return make_lisp_ptr (binding, Lisp_Vectorlike);
index 63424c5734ad21559805686e09dfa6dd30c57a61..a94145eee332523f5c01b26dcdb34e1d2cb7b67b 100644 (file)
@@ -2959,7 +2959,7 @@ dump_vectorlike (struct dump_context *ctx,
                  Lisp_Object lv,
                  dump_off offset)
 {
-#if CHECK_STRUCTS && !defined HASH_pvec_type_A4A6E9984D
+#if CHECK_STRUCTS && !defined HASH_pvec_type_57B9D77DC2
 # error "pvec_type changed. See CHECK_STRUCTS comment in config.h."
 #endif
   const struct Lisp_Vector *v = XVECTOR (lv);
@@ -2980,6 +2980,7 @@ dump_vectorlike (struct dump_context *ctx,
     case PVEC_CHAR_TABLE:
     case PVEC_SUB_CHAR_TABLE:
     case PVEC_RECORD:
+    case PVEC_BINDING:
       offset = dump_vectorlike_generic (ctx, &v->header);
       break;
     case PVEC_BOOL_VECTOR: