]> git.eshelyaron.com Git - emacs.git/commitdiff
Lazy load function documentation.
authorAndrea Corallo <akrl@sdf.org>
Sat, 25 Apr 2020 17:16:17 +0000 (18:16 +0100)
committerAndrea Corallo <akrl@sdf.org>
Sat, 25 Apr 2020 18:55:39 +0000 (19:55 +0100)
* src/comp.c (native_function_doc): New function.
(load_comp_unit): Do not load function doc during load.

* src/comp.h: Extern 'native_function_doc'.

* src/doc.c (Fdocumentation): Call 'native_function_doc' to
retrive function doc.

* src/pdumper.c (dump_native_comp_unit): Zero 'data_fdoc_h' before
dumping.

src/comp.c
src/comp.h
src/doc.c
src/pdumper.c

index 70b0a25a9c0464426d529abf7f60008141598162..b33ef92f72b95615bfec3fb2144cdccbd8951350 100644 (file)
@@ -3627,7 +3627,6 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
          comp_u->data_vec = load_static_obj (comp_u, TEXT_DATA_RELOC_SYM);
          comp_u->data_impure_vec =
            load_static_obj (comp_u, TEXT_DATA_RELOC_IMPURE_SYM);
-         comp_u->data_fdoc_h = load_static_obj (comp_u, TEXT_FDOC_SYM);
 
          if (!NILP (Vpurify_flag))
            /* Non impure can be copied into pure space.  */
@@ -3672,6 +3671,22 @@ load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u, bool loading_dump,
   return;
 }
 
+Lisp_Object
+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);
+}
+
 DEFUN ("comp--register-subr", Fcomp__register_subr, Scomp__register_subr,
        7, 7, 0,
        doc: /* This gets called by top_level_run during load phase to register
index c0598468117ac4aa609177205cf25b4bdacfc796..5beedcfc2804cb01516852a15a84690c30f3ab8f 100644 (file)
@@ -69,6 +69,8 @@ extern void hash_native_abi (void);
 extern void load_comp_unit (struct Lisp_Native_Comp_Unit *comp_u,
                            bool loading_dump, bool late_load);
 
+extern Lisp_Object native_function_doc (Lisp_Object function);
+
 extern void syms_of_comp (void);
 
 extern void maybe_defer_native_compilation (Lisp_Object function_name,
index 8191a914c6e5f828014dd50df88db42f28cd8510..31ccee8079b476097996561ec1c929220db63fb1 100644 (file)
--- a/src/doc.c
+++ b/src/doc.c
@@ -337,10 +337,7 @@ string is passed through `substitute-command-keys'.  */)
     fun = XCDR (fun);
 #ifdef HAVE_NATIVE_COMP
   if (!NILP (Fsubr_native_elisp_p (fun)))
-    doc =
-      Fgethash (make_fixnum (XSUBR (fun)->doc),
-               XNATIVE_COMP_UNIT (Fsubr_native_comp_unit (fun))->data_fdoc_h,
-               Qnil);
+    doc = native_function_doc (fun);
   else
 #endif
   if (SUBRP (fun))
index 702b3ffced9c88fdffd6bb008a0ce97370af3e6b..39adaf3ea2103ee651344479ada5494411d8d82f 100644 (file)
@@ -2982,8 +2982,10 @@ dump_subr (struct dump_context *ctx, const struct Lisp_Subr *subr)
 #ifdef HAVE_NATIVE_COMP
 static dump_off
 dump_native_comp_unit (struct dump_context *ctx,
-                      const struct Lisp_Native_Comp_Unit *comp_u)
+                      struct Lisp_Native_Comp_Unit *comp_u)
 {
+  /* Have function documentation always lazy loaded to optimize load-time.  */
+  comp_u->data_fdoc_h = 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;