[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
scratch/lexspaces 09821e3 03/17: Store symbol value into the binding
From: |
Andrea Corallo |
Subject: |
scratch/lexspaces 09821e3 03/17: Store symbol value into the binding |
Date: |
Fri, 8 May 2020 16:43:06 -0400 (EDT) |
branch: scratch/lexspaces
commit 09821e3c4755131cafce6018bf29b2630901573c
Author: Andrea Corallo <address@hidden>
Commit: Andrea Corallo <address@hidden>
Store symbol value into the binding
---
src/alloc.c | 4 +--
src/data.c | 2 ++
src/lexspaces.c | 2 ++
src/lisp.h | 91 ++++++++++++++++++++++++++++++++-------------------------
src/pdumper.c | 3 +-
5 files changed, 59 insertions(+), 43 deletions(-)
diff --git a/src/alloc.c b/src/alloc.c
index cc9ba8d..e7ba4dd 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -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;
diff --git a/src/data.c b/src/data.c
index 1db0a98..1ab203f 100644
--- a/src/data.c
+++ b/src/data.c
@@ -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:
diff --git a/src/lexspaces.c b/src/lexspaces.c
index feb0adf..bfb59a1 100644
--- a/src/lexspaces.c
+++ b/src/lexspaces.c
@@ -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)
diff --git a/src/lisp.h b/src/lisp.h
index 15b1f8d..eff7d30 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -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"
+
+/* 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 ();
}
-
-/* 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);
diff --git a/src/pdumper.c b/src/pdumper.c
index 63424c5..a94145e 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -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:
- branch scratch/lexspaces created (now e2f183c), Andrea Corallo, 2020/05/08
- scratch/lexspaces 67e28d9 02/17: Adding binding pseudovector, Andrea Corallo, 2020/05/08
- scratch/lexspaces 2d1e916 01/17: Add lexspaces.c, Andrea Corallo, 2020/05/08
- scratch/lexspaces 64e442b 04/17: Add SYMBOL_FUNCTION accessor function, Andrea Corallo, 2020/05/08
- scratch/lexspaces 02d8ef2 05/17: Move symbol value into separate binding, Andrea Corallo, 2020/05/08
- scratch/lexspaces 3a57250 06/17: Add lexspace-make-from, Andrea Corallo, 2020/05/08
- scratch/lexspaces 7fecbf5 08/17: Add lexspace redirection, Andrea Corallo, 2020/05/08
- scratch/lexspaces 09821e3 03/17: Store symbol value into the binding,
Andrea Corallo <=
- scratch/lexspaces 04ac507 14/17: Remove unnecessary assertion, Andrea Corallo, 2020/05/08
- scratch/lexspaces 00108a5 15/17: Fix sweep_symbols, Andrea Corallo, 2020/05/08
- scratch/lexspaces 295ac3d 07/17: Make in-lexspace do something, Andrea Corallo, 2020/05/08
- scratch/lexspaces 610552d 10/17: Add SYMBOL_FUNC_LEXSPACE, Andrea Corallo, 2020/05/08
- scratch/lexspaces 9091913 13/17: Rename lexspace-make-from -> lexspace-make, Andrea Corallo, 2020/05/08
- scratch/lexspaces e2f183c 17/17: Shallow setters by default are not a good idea, Andrea Corallo, 2020/05/08
- scratch/lexspaces 73363e9 09/17: Store lexspace in closures, Andrea Corallo, 2020/05/08
- scratch/lexspaces b46c504 12/17: Add lexspace-import-symbol, Andrea Corallo, 2020/05/08
- scratch/lexspaces c578c72 11/17: Add function lexspace contex mechanism, Andrea Corallo, 2020/05/08
- scratch/lexspaces 0b0098a 16/17: Rename in-lexspace -> lexspace-in, Andrea Corallo, 2020/05/08