aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorAndrea Corallo2026-03-12 14:30:54 +0100
committerAndrea Corallo2026-03-12 14:30:54 +0100
commit6198bb89b453a8b93113ac6bbb102043f5636334 (patch)
tree0006eddd65f0a0508be443f1a0cc3f22d437c74f /src/data.c
parentfe121ef586b4adf2befc7e2af42d65f7acc25891 (diff)
downloademacs-scratch/better-comp.tar.gz
emacs-scratch/better-comp.zip
nativecomp: optimize local CU calls at speed 2scratch/better-comp
* etc/NEWS: Document speed-2 local call optimization. * etc/TODO: Remove completed item. * lisp/emacs-lisp/comp.el (comp--cu-local-func-c-name-v): New function. (comp--call-optim-form-call): Enable named local direct calls at speed 2. (comp--function-trampoline-form): New helper. (comp-trampoline-compile, comp-local-function-trampoline-compile): Share trampoline generation. * lisp/emacs-lisp/comp-run.el (comp-local-function-trampoline--install-now): New function. (comp-local-function-trampoline-install): Install local trampolines. Defer trampoline compilation until after load. * src/comp.c (emit_call, emit_ctxt_code, compile_function) (load_comp_unit, unload_comp_unit): Add local function relocation support. (native_comp_local_function_p): New function. (comp--install-local-function-trampoline): New subr. (syms_of_comp): Register it and update trampoline docs. * src/comp.h (Lisp_Native_Comp_Unit): Add local relocation slot. (native_comp_local_function_p): Declare. * src/data.c (Ffset): Install local trampolines for redefined named local native functions. Keep skipping anonymous lambdas. * src/pdumper.c: Clear local relocation state. * test/src/comp-tests.el (comp-tests--run-in-sub-emacs): New helper. (comp-tests--direct-call-redefinition-form): New helper. (comp-tests-direct-call-redefinition-speed-split): New test. (comp-tests-anonymous-lambda-recompile): New test. (comp-tests-direct-call-with-lambdas): Use an explicit output file.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/data.c b/src/data.c
index 4973d577c1c..2360033bb6b 100644
--- a/src/data.c
+++ b/src/data.c
@@ -912,10 +912,24 @@ signal a `cyclic-function-indirection' error. */)
912 register Lisp_Object function = XSYMBOL (symbol)->u.s.function; 912 register Lisp_Object function = XSYMBOL (symbol)->u.s.function;
913 913
914 if (!NILP (Vnative_comp_enable_subr_trampolines) 914 if (!NILP (Vnative_comp_enable_subr_trampolines)
915 && SUBRP (function)
916 && !NATIVE_COMP_FUNCTIONP (function)
917 && !EQ (definition, Fsymbol_function (symbol))) 915 && !EQ (definition, Fsymbol_function (symbol)))
918 calln (Qcomp_subr_trampoline_install, symbol); 916 {
917 if (SUBRP (function) && !NATIVE_COMP_FUNCTIONP (function))
918 calln (Qcomp_subr_trampoline_install, symbol);
919 else if (NATIVE_COMP_FUNCTIONP (function))
920 {
921 if (!EQ (symbol, intern_c_string ("--anonymous-lambda"))
922 && native_comp_local_function_p (function)
923 && !(NATIVE_COMP_FUNCTIONP (definition)
924 && EQ (Fsubr_native_comp_unit (function),
925 Fsubr_native_comp_unit (definition))))
926 {
927 calln (intern_c_string ("require"), intern_c_string ("comp-run"));
928 calln (intern_c_string ("comp-local-function-trampoline-install"),
929 symbol, function);
930 }
931 }
932 }
919#endif 933#endif
920 934
921 set_symbol_function (symbol, definition); 935 set_symbol_function (symbol, definition);