From 02d8ef242da4547fc6ebce8fc4df47581206a745 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Thu, 7 May 2020 22:31:57 +0100 Subject: [PATCH] Move symbol value into separate binding --- src/alloc.c | 22 ++++++++++++---------- src/lisp.h | 18 +++++++++++------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index 4bbc6e37649..5199238b6bf 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -3524,7 +3524,7 @@ init_symbol (Lisp_Object val, Lisp_Object name) set_symbol_plist (val, Qnil); p->u.s.redirect = SYMBOL_PLAINVAL; p->u.s.val.value = Qunbound; - set_symbol_function (val, Qnil); + p->u.s._function = Qnil; set_symbol_next (val, NULL); p->u.s.gcmarkbit = false; p->u.s.interned = SYMBOL_UNINTERNED; @@ -4510,7 +4510,7 @@ live_symbol_holding (struct mem_node *m, void *p) { cp = ptr_bounds_copy (cp, b); struct Lisp_Symbol *s = p = cp -= offset % sizeof b->symbols[0]; - if (!deadp (SYMBOL_FUNCTION (s))) + if (!deadp (s->u.s._function)) return make_lisp_symbol (s); } } @@ -6647,8 +6647,8 @@ mark_object (Lisp_Object arg) CHECK_ALLOCATED_AND_LIVE_SYMBOL (); set_symbol_marked(ptr); /* Attempt to catch bogus objects. */ - eassert (valid_lisp_object_p (SYMBOL_FUNCTION (ptr))); - mark_object (SYMBOL_FUNCTION (ptr)); + eassert (valid_lisp_object_p (ptr->u.s._function)); + mark_object (ptr->u.s._function); mark_object (ptr->u.s.plist); switch (ptr->u.s.redirect) { @@ -7005,7 +7005,9 @@ sweep_symbols (void) sym->u.s.next = symbol_free_list; symbol_free_list = sym; /* FIXME */ - symbol_free_list->u.s._function = dead_object (); + if (!NILP (sym->u.s._function)) + XBINDING (symbol_free_list->u.s._function)->b[curr_lexspace] = + dead_object (); ++this_free; } else @@ -7013,7 +7015,7 @@ sweep_symbols (void) ++num_used; sym->u.s.gcmarkbit = 0; /* Attempt to catch bogus objects. */ - eassert (valid_lisp_object_p (SYMBOL_FUNCTION (sym))); + eassert (valid_lisp_object_p (sym->u.s._function)); } } @@ -7167,10 +7169,10 @@ symbol_uses_obj (Lisp_Object symbol, Lisp_Object obj) struct Lisp_Symbol *sym = XSYMBOL (symbol); Lisp_Object val = find_symbol_value (symbol); return (EQ (val, obj) - || EQ (SYMBOL_FUNCTION (sym), obj) - || (!NILP (SYMBOL_FUNCTION (sym)) - && COMPILEDP (SYMBOL_FUNCTION (sym)) - && EQ (AREF (SYMBOL_FUNCTION (sym), COMPILED_BYTECODE), obj)) + || EQ (sym->u.s._function, obj) + || (!NILP (sym->u.s._function) + && COMPILEDP (sym->u.s._function) + && EQ (AREF (sym->u.s._function, COMPILED_BYTECODE), obj)) || (!NILP (val) && COMPILEDP (val) && EQ (AREF (val, COMPILED_BYTECODE), obj))); diff --git a/src/lisp.h b/src/lisp.h index 7bf822253ac..29df243c0aa 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -2171,7 +2171,7 @@ typedef jmp_buf sys_jmp_buf; extern EMACS_INT curr_lexspace; -INLINE Lisp_Object make_binding (void); +INLINE Lisp_Object make_binding (Lisp_Object); struct Lisp_Binding { @@ -2219,7 +2219,9 @@ SYMBOL_VAL (struct Lisp_Symbol *sym) INLINE Lisp_Object SYMBOL_FUNCTION (struct Lisp_Symbol *sym) { - return sym->u.s._function; + if (!NILP (sym->u.s._function)) + return XBINDING (sym->u.s._function)->b[curr_lexspace]; + return Qnil; } INLINE struct Lisp_Symbol * @@ -2247,7 +2249,7 @@ SET_SYMBOL_VAL (struct Lisp_Symbol *sym, Lisp_Object v) { eassert (sym->u.s.redirect == SYMBOL_PLAINVAL); if (EQ (sym->u.s.val.value, Qunbound)) - sym->u.s.val.value = make_binding (); + sym->u.s.val.value = make_binding (Qunbound); struct Lisp_Binding *binding = XBINDING (sym->u.s.val.value); binding->b[curr_lexspace] = v; } @@ -3429,8 +3431,10 @@ set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val) INLINE void set_symbol_function (Lisp_Object sym, Lisp_Object function) { - /* FIXME */ - XSYMBOL (sym)->u.s._function = function; + struct Lisp_Symbol *s = XSYMBOL (sym); + if (NILP (s->u.s._function)) + s->u.s._function = make_binding (Qnil); + XBINDING (s->u.s._function)->b[curr_lexspace] = function; } INLINE void @@ -5086,13 +5090,13 @@ maybe_gc (void) } INLINE Lisp_Object -make_binding (void) +make_binding (Lisp_Object init_val) { struct Lisp_Binding *binding = ALLOCATE_ZEROED_PSEUDOVECTOR (struct Lisp_Binding, b[MAX_LEXSPACES - 1], PVEC_BINDING); for (EMACS_INT i = 0; i < MAX_LEXSPACES; i++) - binding->b[i] = Qunbound; + binding->b[i] = init_val; return make_lisp_ptr (binding, Lisp_Vectorlike); } -- 2.39.5