diff options
| author | Mattias EngdegÄrd | 2024-04-14 12:47:43 +0200 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2024-04-14 12:47:43 +0200 |
| commit | 85ece8b494429b5ae36e79d7b4ad85a993f73543 (patch) | |
| tree | 48234de1479ffe39cae5ffcb3284cf0180ae02f1 /src | |
| parent | 616af565796f8c690dd9c7d1b2fa7607f2e2fa1e (diff) | |
| download | emacs-85ece8b494429b5ae36e79d7b4ad85a993f73543.tar.gz emacs-85ece8b494429b5ae36e79d7b4ad85a993f73543.zip | |
; * src/eval.c (funcall_lambda): Sink specpdl load out of fast path.
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/eval.c b/src/eval.c index f48d7b0682f..7f7a70b15ae 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -3158,13 +3158,9 @@ apply_lambda (Lisp_Object fun, Lisp_Object args, specpdl_ref count) | |||
| 3158 | or a module function. */ | 3158 | or a module function. */ |
| 3159 | 3159 | ||
| 3160 | static Lisp_Object | 3160 | static Lisp_Object |
| 3161 | funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, | 3161 | funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, Lisp_Object *arg_vector) |
| 3162 | register Lisp_Object *arg_vector) | ||
| 3163 | { | 3162 | { |
| 3164 | Lisp_Object val, syms_left, next, lexenv; | 3163 | Lisp_Object syms_left, lexenv; |
| 3165 | specpdl_ref count = SPECPDL_INDEX (); | ||
| 3166 | ptrdiff_t i; | ||
| 3167 | bool optional, rest; | ||
| 3168 | 3164 | ||
| 3169 | if (CONSP (fun)) | 3165 | if (CONSP (fun)) |
| 3170 | { | 3166 | { |
| @@ -3211,13 +3207,16 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, | |||
| 3211 | else | 3207 | else |
| 3212 | emacs_abort (); | 3208 | emacs_abort (); |
| 3213 | 3209 | ||
| 3214 | i = optional = rest = 0; | 3210 | specpdl_ref count = SPECPDL_INDEX (); |
| 3211 | ptrdiff_t i = 0; | ||
| 3212 | bool optional = false; | ||
| 3213 | bool rest = false; | ||
| 3215 | bool previous_rest = false; | 3214 | bool previous_rest = false; |
| 3216 | for (; CONSP (syms_left); syms_left = XCDR (syms_left)) | 3215 | for (; CONSP (syms_left); syms_left = XCDR (syms_left)) |
| 3217 | { | 3216 | { |
| 3218 | maybe_quit (); | 3217 | maybe_quit (); |
| 3219 | 3218 | ||
| 3220 | next = XCAR (syms_left); | 3219 | Lisp_Object next = XCAR (syms_left); |
| 3221 | if (!SYMBOLP (next)) | 3220 | if (!SYMBOLP (next)) |
| 3222 | xsignal1 (Qinvalid_function, fun); | 3221 | xsignal1 (Qinvalid_function, fun); |
| 3223 | 3222 | ||
| @@ -3269,6 +3268,7 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, | |||
| 3269 | /* Instantiate a new lexical environment. */ | 3268 | /* Instantiate a new lexical environment. */ |
| 3270 | specbind (Qinternal_interpreter_environment, lexenv); | 3269 | specbind (Qinternal_interpreter_environment, lexenv); |
| 3271 | 3270 | ||
| 3271 | Lisp_Object val; | ||
| 3272 | if (CONSP (fun)) | 3272 | if (CONSP (fun)) |
| 3273 | val = Fprogn (XCDR (XCDR (fun))); | 3273 | val = Fprogn (XCDR (XCDR (fun))); |
| 3274 | else if (SUBR_NATIVE_COMPILEDP (fun)) | 3274 | else if (SUBR_NATIVE_COMPILEDP (fun)) |