(sym-to-c-name-h (make-hash-table :test #'eq) :type hash-table
:documentation "symbol-function -> c-name.
This is only for optimizing intra CU calls at speed 3.")
- (doc-index-h (make-hash-table :test #'eql) :type hash-table
+ (function-docs (make-hash-table :test #'eql) :type (or hash-table vector)
:documentation "Documentation index -> documentation")
(d-default (make-comp-data-container) :type comp-data-container
:documentation "Standard data relocated in use by functions.")
(make-comp-mvar :constant c-name)
(make-comp-mvar
:constant
- (let* ((h (comp-ctxt-doc-index-h comp-ctxt))
+ (let* ((h (comp-ctxt-function-docs comp-ctxt))
(i (hash-table-count h)))
(puthash i (comp-func-doc f) h)
i))
do (remhash obj d-ephemeral-idx))
;; Fix-up indexes in each relocation class and fill corresponding
;; reloc lists.
- (mapc #'comp-finalize-container (list d-default d-impure d-ephemeral))))
+ (mapc #'comp-finalize-container (list d-default d-impure d-ephemeral))
+ ;; Make a vector from the function documentation hash table.
+ (cl-loop with h = (comp-ctxt-function-docs comp-ctxt)
+ with v = (make-vector (hash-table-count h) nil)
+ for idx being each hash-keys of h
+ for doc = (gethash idx h)
+ do (setf (aref v idx) doc)
+ finally
+ do (setf (comp-ctxt-function-docs comp-ctxt) v))))
(defun comp-compile-ctxt-to-file (name)
"Compile as native code the current context naming it NAME.
emit_static_object (TEXT_OPTIM_QLY_SYM, Flist (2, opt_qly));
emit_static_object (TEXT_FDOC_SYM,
- CALL1I (comp-ctxt-doc-index-h, Vcomp_ctxt));
+ CALL1I (comp-ctxt-function-docs, Vcomp_ctxt));
comp.current_thread_ref =
gcc_jit_lvalue_as_rvalue (
struct Lisp_Native_Comp_Unit *cu =
XNATIVE_COMP_UNIT (Fsubr_native_comp_unit (function));
- if (NILP (cu->data_fdoc_h))
- cu->data_fdoc_h = load_static_obj (cu, TEXT_FDOC_SYM);
-
- eassert (!NILP (cu->data_fdoc_h));
-
- return Fgethash (make_fixnum (XSUBR (function)->doc),
- cu->data_fdoc_h,
- Qnil);
+ if (NILP (cu->data_fdoc_v))
+ cu->data_fdoc_v = load_static_obj (cu, TEXT_FDOC_SYM);
+ 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);
}
DEFUN ("comp--register-subr", Fcomp__register_subr, Scomp__register_subr,
Lisp_Object file;
Lisp_Object optimize_qualities;
/* Hash doc-idx -> function documentaiton. */
- Lisp_Object data_fdoc_h;
+ Lisp_Object data_fdoc_v;
/* Analogous to the constant vector but per compilation unit. */
Lisp_Object data_vec;
/* Same but for data that cannot be moved to pure space.
struct Lisp_Native_Comp_Unit *comp_u)
{
/* Have function documentation always lazy loaded to optimize load-time. */
- comp_u->data_fdoc_h = Qnil;
+ comp_u->data_fdoc_v = Qnil;
START_DUMP_PVEC (ctx, &comp_u->header, struct Lisp_Native_Comp_Unit, out);
dump_pseudovector_lisp_fields (ctx, &out->header, &comp_u->header);
out->handle = NULL;