]> git.eshelyaron.com Git - emacs.git/commitdiff
Make primitive redefinition effective through trampoline synthesis
authorAndrea Corallo <akrl@sdf.org>
Fri, 2 Oct 2020 20:36:05 +0000 (22:36 +0200)
committerAndrea Corallo <akrl@sdf.org>
Mon, 5 Oct 2020 19:32:38 +0000 (21:32 +0200)
* lisp/loadup.el (dump-mode): Set `comp-enable-subr-trampolines'
when finished bootstrap.
* src/data.c (Ffset): Call `comp-enable-subr-trampolines' when
redefining a subr.
* src/comp.c (syms_of_comp): Define `comp-subr-trampoline-install'
symbol.
(syms_of_comp): Define `comp-enable-subr-trampolines' variable.

lisp/loadup.el
src/comp.c
src/data.c

index f218ec1ff980d2312884d0ea84d17944712ef5e4..91126703d1804c359c82bf165a962f6dc60f5f15 100644 (file)
@@ -510,6 +510,11 @@ lost after dumping")))
                         ((equal dump-mode "bootstrap") "emacs")
                         ((equal dump-mode "pbootstrap") "bootstrap-emacs.pdmp")
                         (t (error "unrecognized dump mode %s" dump-mode)))))
+      (when (and (boundp 'comp-ctxt)
+                 (equal dump-mode "pdump"))
+        ;; Don't enable this before bootstrap is completed the as the
+        ;; compiler infrastructure may not be usable.
+        (setq comp-enable-subr-trampolines t))
       (message "Dumping under the name %s" output)
       (condition-case ()
           (delete-file output)
index 5663c9e56248bc8cd5f28d6ff4fcc6a6e3411415..076236ef80c36cdae159e767d90571c8fc1e52af 100644 (file)
@@ -5141,6 +5141,7 @@ native compiled one.  */);
   DEFSYM (Qlate, "late");
   DEFSYM (Qlambda_fixup, "lambda-fixup");
   DEFSYM (Qgccjit, "gccjit");
+  DEFSYM (Qcomp_subr_trampoline_install, "comp-subr-trampoline-install")
 
   /* To be signaled by the compiler.  */
   DEFSYM (Qnative_compiler_error, "native-compiler-error");
@@ -5246,6 +5247,11 @@ The last directory of this list is assumed to be the system one.  */);
      dump reload.  */
   Vcomp_eln_load_path = Fcons (build_string ("../native-lisp/"), Qnil);
 
+  DEFVAR_BOOL ("comp-enable-subr-trampolines", comp_enable_subr_trampolines,
+              doc: /* When non-nil enable trampoline synthesis
+                      triggerd by `fset' making primitives
+                      redefinable effectivelly.  */);
+
   DEFVAR_LISP ("comp-installed-trampolines-h", Vcomp_installed_trampolines_h,
               doc: /* Hash table subr-name -> bool.  */);
   Vcomp_installed_trampolines_h = CALLN (Fmake_hash_table);
index 8c39c3191108fb32e286a5ad318704ba3201e26b..c6629dd5f29822e77a92b0ec667418d249948ea6 100644 (file)
@@ -775,6 +775,13 @@ DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
 
   eassert (valid_lisp_object_p (definition));
 
+#ifdef HAVE_NATIVE_COMP
+  if (comp_enable_subr_trampolines
+      && SUBRP (function)
+      && !SUBR_NATIVE_COMPILEDP (function))
+    CALLN (Ffuncall, Qcomp_subr_trampoline_install, symbol);
+#endif
+
   set_symbol_function (symbol, definition);
 
   return definition;