diff --git a/src/comp.c b/src/comp.c index 70a9a64a714..b96fae4ae95 100644 --- a/src/comp.c +++ b/src/comp.c @@ -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)); diff --git a/src/doc.c b/src/doc.c index 88be9121dab..04afe50d3dd 100644 --- a/src/doc.c +++ b/src/doc.c @@ -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 diff --git a/src/lisp.h b/src/lisp.h index 4217dd9e347..4c09afc77e2 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -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;