summaryrefslogtreecommitdiff
path: root/src/lisp.h
diff options
context:
space:
mode:
authorAlan Mackenzie <acm@muc.de>2019-04-05 12:18:53 +0000
committerAlan Mackenzie <acm@muc.de>2019-04-05 12:18:53 +0000
commitb071398ba3e8031fe8284f2aed95d714cd3c92af (patch)
treed27dd7d78dfff9a8b28778bee260dbbdf6c10e1d /src/lisp.h
parent8a23e8717008d31b4648c999c7a417f4729d239f (diff)
downloademacs-scratch/accurate-warning-pos.tar.gz
Enhance struct Lisp_Subr to hold the alternative "BC_" function.scratch/accurate-warning-pos
Also fix a GC bug, where symbols with position were not being disabled. * src/lisp.h (union Lisp_Function): New type. (struct Lisp_Subr): Add fields normal_function, BC_function, and next. (DEFUN): Setup all three function fields to the subr (BC_function is still a dummy), set field next to NULL. * src/alloc.c (Fgarbage_collect): Move the binding of Qsymbols_with_pos_enabled to garbage_collect_1 so that it gets bound when GC is invoked via garbage_collect. * src/lread.c (subr_ptr, using_BC_subrs): New static variables. (Fswitch_to_BC_subrs, Fswitch_to_normal_subrs): New defuns. (defsubr): Chain new subr to previous using field next and variable subr_ptr. (init_lread): Initialise subr_ptr to NULL. (syms_of_lread): Create subrs Sswitch_to_BC_subrs and Sswitch_to_normal_subrs. * src/pdumper.c (dump_subr): Enhance to dump struct Lisp_Subr's new fields. Update the expected value of HASH_Lisp_Subr_xxxxxxxxxx. (dump_vectorlike): Also dump PVEC_SYMBOL_WITH_POSes.
Diffstat (limited to 'src/lisp.h')
-rw-r--r--src/lisp.h21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 3324dac98f6..a22043026ad 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2127,10 +2127,7 @@ CHAR_TABLE_SET (Lisp_Object ct, int idx, Lisp_Object val)
It is generated by the DEFUN macro only.
defsubr makes it into a Lisp object. */
-struct Lisp_Subr
- {
- union vectorlike_header header;
- union {
+union Lisp_Function {
Lisp_Object (*a0) (void);
Lisp_Object (*a1) (Lisp_Object);
Lisp_Object (*a2) (Lisp_Object, Lisp_Object);
@@ -2142,10 +2139,18 @@ struct Lisp_Subr
Lisp_Object (*a8) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
Lisp_Object (*aUNEVALLED) (Lisp_Object args);
Lisp_Object (*aMANY) (ptrdiff_t, Lisp_Object *);
- } function;
+};
+
+struct Lisp_Subr
+ {
+ union vectorlike_header header;
+ union Lisp_Function function;
+ union Lisp_Function normal_function;
+ union Lisp_Function BC_function;
short min_args, max_args;
const char *symbol_name;
const char *intspec;
+ union Aligned_Lisp_Subr *next;
EMACS_INT doc;
} GCALIGNED_STRUCT;
union Aligned_Lisp_Subr
@@ -3162,7 +3167,11 @@ CHECK_INTEGER (Lisp_Object x)
static union Aligned_Lisp_Subr sname = \
{{{ PVEC_SUBR << PSEUDOVECTOR_AREA_BITS }, \
{ .a ## maxargs = fnname }, \
- minargs, maxargs, lname, intspec, 0}}; \
+ { .a ## maxargs = fnname }, \
+ { .a ## maxargs = /* BC_ ## */fnname }, \
+ minargs, maxargs, lname, intspec, \
+ NULL, \
+ 0}}; \
Lisp_Object fnname
/* defsubr (Sname);