aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorMattias EngdegÄrd2024-01-31 17:35:59 +0100
committerMattias EngdegÄrd2024-01-31 17:35:59 +0100
commit344a846b07dfcc9ad38e510da9115fadae94a477 (patch)
tree235f53726543576d7332a0c92d23ec00c4a975bf /src/bytecode.c
parent9bcc9690a8076a22398c27a7ccf836ee95eb16a2 (diff)
downloademacs-344a846b07dfcc9ad38e510da9115fadae94a477.tar.gz
emacs-344a846b07dfcc9ad38e510da9115fadae94a477.zip
Bytecode engine fast-path streamlining of plain symbols
* src/bytecode.c (exec_byte_code): Only use fast-path optimisations for calls and dynamic variable reference and setting where the symbol is plain, which is much faster.
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index def20b232c6..dd805cbd97a 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -625,9 +625,10 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
625 varref: 625 varref:
626 { 626 {
627 Lisp_Object v1 = vectorp[op], v2; 627 Lisp_Object v1 = vectorp[op], v2;
628 if (!SYMBOLP (v1) 628 if (!BARE_SYMBOL_P (v1)
629 || XSYMBOL (v1)->u.s.redirect != SYMBOL_PLAINVAL 629 || XBARE_SYMBOL (v1)->u.s.redirect != SYMBOL_PLAINVAL
630 || (v2 = SYMBOL_VAL (XSYMBOL (v1)), BASE_EQ (v2, Qunbound))) 630 || (v2 = XBARE_SYMBOL (v1)->u.s.val.value,
631 BASE_EQ (v2, Qunbound)))
631 v2 = Fsymbol_value (v1); 632 v2 = Fsymbol_value (v1);
632 PUSH (v2); 633 PUSH (v2);
633 NEXT; 634 NEXT;
@@ -699,11 +700,11 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
699 Lisp_Object val = POP; 700 Lisp_Object val = POP;
700 701
701 /* Inline the most common case. */ 702 /* Inline the most common case. */
702 if (SYMBOLP (sym) 703 if (BARE_SYMBOL_P (sym)
703 && !BASE_EQ (val, Qunbound) 704 && !BASE_EQ (val, Qunbound)
704 && XSYMBOL (sym)->u.s.redirect == SYMBOL_PLAINVAL 705 && XBARE_SYMBOL (sym)->u.s.redirect == SYMBOL_PLAINVAL
705 && !SYMBOL_TRAPPED_WRITE_P (sym)) 706 && !XBARE_SYMBOL (sym)->u.s.trapped_write)
706 SET_SYMBOL_VAL (XSYMBOL (sym), val); 707 SET_SYMBOL_VAL (XBARE_SYMBOL (sym), val);
707 else 708 else
708 set_internal (sym, val, Qnil, SET_INTERNAL_SET); 709 set_internal (sym, val, Qnil, SET_INTERNAL_SET);
709 } 710 }
@@ -790,8 +791,9 @@ exec_byte_code (Lisp_Object fun, ptrdiff_t args_template,
790 do_debug_on_call (Qlambda, count1); 791 do_debug_on_call (Qlambda, count1);
791 792
792 Lisp_Object original_fun = call_fun; 793 Lisp_Object original_fun = call_fun;
793 if (SYMBOLP (call_fun)) 794 /* Calls to symbols-with-pos don't need to be on the fast path. */
794 call_fun = XSYMBOL (call_fun)->u.s.function; 795 if (BARE_SYMBOL_P (call_fun))
796 call_fun = XBARE_SYMBOL (call_fun)->u.s.function;
795 if (COMPILEDP (call_fun)) 797 if (COMPILEDP (call_fun))
796 { 798 {
797 Lisp_Object template = AREF (call_fun, COMPILED_ARGLIST); 799 Lisp_Object template = AREF (call_fun, COMPILED_ARGLIST);