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:
Pip Cet 2025-01-08 12:15:30 +00:00
parent 631f43d2bb
commit ac52993b99
3 changed files with 13 additions and 3 deletions

View file

@ -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));

View file

@ -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

View file

@ -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;