Fix store_function_docstring for native subrs (Bug#74966)
Since native subrs can have either etc/DOC indexes or vector indexes, we use the sign bit of the 'doc' field to distinguish the two cases. * src/comp.c (native_function_doc, make_subr): Use one's complement of doc index for native subrs. * src/doc.c (store_function_docstring): Add assertion. * src/lisp.h (struct Lisp_Subr): Document 'doc' sign bit.
This commit is contained in:
parent
631f43d2bb
commit
ac52993b99
3 changed files with 13 additions and 3 deletions
|
@ -5488,7 +5488,10 @@ native_function_doc (Lisp_Object function)
|
|||
if (!VECTORP (cu->data_fdoc_v))
|
||||
xsignal2 (Qnative_lisp_file_inconsistent, cu->file,
|
||||
build_string ("missing documentation vector"));
|
||||
return AREF (cu->data_fdoc_v, XSUBR (function)->doc);
|
||||
EMACS_INT doc = XSUBR (function)->doc;
|
||||
if (doc < 0)
|
||||
return AREF (cu->data_fdoc_v, -doc - 1);
|
||||
return make_fixnum (doc);
|
||||
}
|
||||
|
||||
static Lisp_Object
|
||||
|
@ -5529,7 +5532,8 @@ make_subr (Lisp_Object symbol_name, Lisp_Object minarg, Lisp_Object maxarg,
|
|||
x->s.symbol_name = xstrdup (SSDATA (symbol_name));
|
||||
x->s.intspec.native = intspec;
|
||||
x->s.command_modes = command_modes;
|
||||
x->s.doc = XFIXNUM (doc_idx);
|
||||
x->s.doc = -XFIXNUM (doc_idx) - 1;
|
||||
eassert (x->s.doc < 0);
|
||||
#ifdef HAVE_NATIVE_COMP
|
||||
x->s.native_comp_u = comp_u;
|
||||
x->s.native_c_name = xstrdup (SSDATA (c_name));
|
||||
|
|
|
@ -479,7 +479,10 @@ store_function_docstring (Lisp_Object obj, EMACS_INT offset)
|
|||
fun = XCDR (fun);
|
||||
/* Lisp_Subrs have a slot for it. */
|
||||
if (SUBRP (fun))
|
||||
XSUBR (fun)->doc = offset;
|
||||
{
|
||||
XSUBR (fun)->doc = offset;
|
||||
eassert (XSUBR (fun)->doc >= 0);
|
||||
}
|
||||
else if (CLOSUREP (fun))
|
||||
{
|
||||
/* This bytecode object must have a slot for the docstring, since
|
||||
|
|
|
@ -2228,6 +2228,9 @@ struct Lisp_Subr
|
|||
Lisp_Object native;
|
||||
} intspec;
|
||||
Lisp_Object command_modes;
|
||||
/* positive values: offset into etc/DOC. Negative values: one's
|
||||
complement of index into the native comp unit's function
|
||||
documentation vector. */
|
||||
EMACS_INT doc;
|
||||
#ifdef HAVE_NATIVE_COMP
|
||||
Lisp_Object native_comp_u;
|
||||
|
|
Loading…
Add table
Reference in a new issue