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;
{
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);
}
}
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)
{
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
++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));
}
}
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)));
extern EMACS_INT curr_lexspace;
-INLINE Lisp_Object make_binding (void);
+INLINE Lisp_Object make_binding (Lisp_Object);
struct Lisp_Binding
{
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 *
{
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;
}
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
}
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);
}