diff options
| author | Mattias EngdegÄrd | 2024-01-31 17:35:59 +0100 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2024-01-31 17:35:59 +0100 |
| commit | 344a846b07dfcc9ad38e510da9115fadae94a477 (patch) | |
| tree | 235f53726543576d7332a0c92d23ec00c4a975bf /src/bytecode.c | |
| parent | 9bcc9690a8076a22398c27a7ccf836ee95eb16a2 (diff) | |
| download | emacs-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.c | 20 |
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); |