aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias EngdegÄrd2024-04-18 12:59:35 +0200
committerMattias EngdegÄrd2024-04-18 13:55:47 +0200
commit0a57dfcff8d0abcf4427cfbfd886264bb3b8eaab (patch)
treee5873afb2bc9b9eec4b1180e2779b67a76673aa7
parentdba115d6bcbc955858526740254bd9a169830d7e (diff)
downloademacs-0a57dfcff8d0abcf4427cfbfd886264bb3b8eaab.tar.gz
emacs-0a57dfcff8d0abcf4427cfbfd886264bb3b8eaab.zip
Ensure that specbind arg is always bare symbol, and drop check
* src/eval.c (FletX, Flet, internal_lisp_condition_case) (funcall_lambda): Ensure that the first argument to `specbind` is a bare symbol in the few cases where this isn't statically guaranteed. (specbind): Drop the symbol argument type check on the fast path.
-rw-r--r--src/eval.c19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/eval.c b/src/eval.c
index 7f7a70b15ae..c5b8a375af4 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -948,8 +948,9 @@ usage: (let* VARLIST BODY...) */)
948 val = eval_sub (Fcar (XCDR (elt))); 948 val = eval_sub (Fcar (XCDR (elt)));
949 } 949 }
950 950
951 if (!NILP (lexenv) && SYMBOLP (var) 951 var = maybe_remove_pos_from_symbol (var);
952 && !XSYMBOL (var)->u.s.declared_special 952 if (!NILP (lexenv) && BARE_SYMBOL_P (var)
953 && !XBARE_SYMBOL (var)->u.s.declared_special
953 && NILP (Fmemq (var, Vinternal_interpreter_environment))) 954 && NILP (Fmemq (var, Vinternal_interpreter_environment)))
954 /* Lexically bind VAR by adding it to the interpreter's binding 955 /* Lexically bind VAR by adding it to the interpreter's binding
955 alist. */ 956 alist. */
@@ -1016,11 +1017,10 @@ usage: (let VARLIST BODY...) */)
1016 varlist = XCAR (args); 1017 varlist = XCAR (args);
1017 for (argnum = 0; argnum < nvars && CONSP (varlist); argnum++) 1018 for (argnum = 0; argnum < nvars && CONSP (varlist); argnum++)
1018 { 1019 {
1019 Lisp_Object var;
1020
1021 elt = XCAR (varlist); 1020 elt = XCAR (varlist);
1022 varlist = XCDR (varlist); 1021 varlist = XCDR (varlist);
1023 var = SYMBOLP (elt) ? elt : Fcar (elt); 1022 Lisp_Object var = maybe_remove_pos_from_symbol (SYMBOLP (elt) ? elt
1023 : Fcar (elt));
1024 tem = temps[argnum]; 1024 tem = temps[argnum];
1025 1025
1026 if (!NILP (lexenv) && SYMBOLP (var) 1026 if (!NILP (lexenv) && SYMBOLP (var)
@@ -1416,6 +1416,7 @@ internal_lisp_condition_case (Lisp_Object var, Lisp_Object bodyform,
1416 struct handler *oldhandlerlist = handlerlist; 1416 struct handler *oldhandlerlist = handlerlist;
1417 ptrdiff_t CACHEABLE clausenb = 0; 1417 ptrdiff_t CACHEABLE clausenb = 0;
1418 1418
1419 var = maybe_remove_pos_from_symbol (var);
1419 CHECK_SYMBOL (var); 1420 CHECK_SYMBOL (var);
1420 1421
1421 Lisp_Object success_handler = Qnil; 1422 Lisp_Object success_handler = Qnil;
@@ -3254,7 +3255,7 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, Lisp_Object *arg_vector)
3254 lexenv = Fcons (Fcons (next, arg), lexenv); 3255 lexenv = Fcons (Fcons (next, arg), lexenv);
3255 else 3256 else
3256 /* Dynamically bind NEXT. */ 3257 /* Dynamically bind NEXT. */
3257 specbind (next, arg); 3258 specbind (maybe_remove_pos_from_symbol (next), arg);
3258 previous_rest = false; 3259 previous_rest = false;
3259 } 3260 }
3260 } 3261 }
@@ -3466,10 +3467,8 @@ do_specbind (struct Lisp_Symbol *sym, union specbinding *bind,
3466void 3467void
3467specbind (Lisp_Object symbol, Lisp_Object value) 3468specbind (Lisp_Object symbol, Lisp_Object value)
3468{ 3469{
3469 struct Lisp_Symbol *sym; 3470 /* The caller must ensure that the SYMBOL argument is a bare symbol. */
3470 3471 struct Lisp_Symbol *sym = XBARE_SYMBOL (symbol);
3471 CHECK_SYMBOL (symbol);
3472 sym = XSYMBOL (symbol);
3473 3472
3474 start: 3473 start:
3475 switch (sym->u.s.redirect) 3474 switch (sym->u.s.redirect)