]> git.eshelyaron.com Git - emacs.git/commitdiff
Convert before final function doc hash into a vector.
authorAndrea Corallo <akrl@sdf.org>
Sun, 26 Apr 2020 08:11:33 +0000 (09:11 +0100)
committerAndrea Corallo <akrl@sdf.org>
Sun, 26 Apr 2020 09:10:17 +0000 (10:10 +0100)
* lisp/emacs-lisp/comp.el (comp-finalize-relocs): Convert doc hash
table into vector befor final.
(comp-emit-for-top-level): Rename `comp-ctxt-doc-index-h' ->
`comp-ctxt-function-docs'.
(comp-ctxt): Likewise.

* src/comp.c (native_function_doc): Update logic for documentation
being a vector.
(emit_ctxt_code): Update for 'comp-ctxt-doc-index-h' slot rename.

* src/comp.h (struct Lisp_Native_Comp_Unit): Rename 'data_fdoc_h'
into data_fdoc_v.

* src/pdumper.c (dump_native_comp_unit): Likewise.

lisp/emacs-lisp/comp.el
src/comp.c
src/comp.h
src/pdumper.c

index 5096a143a0f0d85fc53aa224bbac281d968030c7..f8e30f0047ad5c4e72f6c3be6b803a91ff88bf8c 100644 (file)
@@ -216,7 +216,7 @@ Can be one of: 'd-default', 'd-impure' or 'd-ephemeral'.  See `comp-ctxt'.")
   (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.")
@@ -1218,7 +1218,7 @@ the annotation emission."
                           (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))
@@ -2103,7 +2103,15 @@ Update all insn accordingly."
                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.
index b33ef92f72b95615bfec3fb2144cdccbd8951350..d021be479b0acf9521169e0ad454690126ffc8a6 100644 (file)
@@ -2102,7 +2102,7 @@ emit_ctxt_code (void)
   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 (
@@ -3677,14 +3677,12 @@ native_function_doc (Lisp_Object function)
   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,
index 73baa27276ec5222b2530e3e0aef38850ad53824..cbdcaccd5fe875d37790de951f830ee602b1b574 100644 (file)
@@ -38,7 +38,7 @@ struct Lisp_Native_Comp_Unit
   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.
index c9015d503cdbb896439ece887d693c44b8e278dc..f837dfc38d28f3c5de2bc51cb42b92539233f4fa 100644 (file)
@@ -2982,7 +2982,7 @@ dump_native_comp_unit (struct dump_context *ctx,
                       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;