aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
authorStefan Monnier2010-12-15 12:46:59 -0500
committerStefan Monnier2010-12-15 12:46:59 -0500
commita0ee6f2751acba71df443d4d795bb350eb6421dd (patch)
treee4f47d66877b1b00b9ce00a304b509dee840868a /src/eval.c
parentdefb141157dfa37c33cdcbfa4b29c702a8fc9edf (diff)
downloademacs-a0ee6f2751acba71df443d4d795bb350eb6421dd.tar.gz
emacs-a0ee6f2751acba71df443d4d795bb350eb6421dd.zip
Obey lexical-binding in interactive evaluation commands.
* lisp/emacs-lisp/edebug.el (edebug-eval-defun, edebug-eval): * lisp/emacs-lisp/lisp-mode.el (eval-last-sexp-1, eval-defun-1): * lisp/ielm.el (ielm-eval-input): * lisp/simple.el (eval-expression): Use new eval arg to obey lexical-binding. * src/eval.c (Feval): Add `lexical' argument. Adjust callers. (Ffuncall, eval_sub): Avoid goto.
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c267
1 files changed, 132 insertions, 135 deletions
diff --git a/src/eval.c b/src/eval.c
index 485ba00c1e4..7104a8a8396 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2311,12 +2311,14 @@ do_autoload (Lisp_Object fundef, Lisp_Object funname)
2311} 2311}
2312 2312
2313 2313
2314DEFUN ("eval", Feval, Seval, 1, 1, 0, 2314DEFUN ("eval", Feval, Seval, 1, 2, 0,
2315 doc: /* Evaluate FORM and return its value. */) 2315 doc: /* Evaluate FORM and return its value.
2316 (Lisp_Object form) 2316If LEXICAL is t, evaluate using lexical scoping. */)
2317 (Lisp_Object form, Lisp_Object lexical)
2317{ 2318{
2318 int count = SPECPDL_INDEX (); 2319 int count = SPECPDL_INDEX ();
2319 specbind (Qinternal_interpreter_environment, Qnil); 2320 specbind (Qinternal_interpreter_environment,
2321 NILP (lexical) ? Qnil : Fcons (Qt, Qnil));
2320 return unbind_to (count, eval_sub (form)); 2322 return unbind_to (count, eval_sub (form));
2321} 2323}
2322 2324
@@ -2414,10 +2416,8 @@ eval_sub (Lisp_Object form)
2414 { 2416 {
2415 backtrace.evalargs = 0; 2417 backtrace.evalargs = 0;
2416 val = (XSUBR (fun)->function.aUNEVALLED) (args_left); 2418 val = (XSUBR (fun)->function.aUNEVALLED) (args_left);
2417 goto done;
2418 } 2419 }
2419 2420 else if (XSUBR (fun)->max_args == MANY)
2420 if (XSUBR (fun)->max_args == MANY)
2421 { 2421 {
2422 /* Pass a vector of evaluated arguments */ 2422 /* Pass a vector of evaluated arguments */
2423 Lisp_Object *vals; 2423 Lisp_Object *vals;
@@ -2443,73 +2443,74 @@ eval_sub (Lisp_Object form)
2443 val = (XSUBR (fun)->function.aMANY) (XINT (numargs), vals); 2443 val = (XSUBR (fun)->function.aMANY) (XINT (numargs), vals);
2444 UNGCPRO; 2444 UNGCPRO;
2445 SAFE_FREE (); 2445 SAFE_FREE ();
2446 goto done;
2447 } 2446 }
2448 2447 else
2449 GCPRO3 (args_left, fun, fun);
2450 gcpro3.var = argvals;
2451 gcpro3.nvars = 0;
2452
2453 maxargs = XSUBR (fun)->max_args;
2454 for (i = 0; i < maxargs; args_left = Fcdr (args_left))
2455 { 2448 {
2456 argvals[i] = eval_sub (Fcar (args_left)); 2449 GCPRO3 (args_left, fun, fun);
2457 gcpro3.nvars = ++i; 2450 gcpro3.var = argvals;
2458 } 2451 gcpro3.nvars = 0;
2459 2452
2460 UNGCPRO; 2453 maxargs = XSUBR (fun)->max_args;
2454 for (i = 0; i < maxargs; args_left = Fcdr (args_left))
2455 {
2456 argvals[i] = eval_sub (Fcar (args_left));
2457 gcpro3.nvars = ++i;
2458 }
2459
2460 UNGCPRO;
2461 2461
2462 backtrace.args = argvals; 2462 backtrace.args = argvals;
2463 backtrace.nargs = XINT (numargs); 2463 backtrace.nargs = XINT (numargs);
2464 2464
2465 switch (i) 2465 switch (i)
2466 { 2466 {
2467 case 0: 2467 case 0:
2468 val = (XSUBR (fun)->function.a0) (); 2468 val = (XSUBR (fun)->function.a0) ();
2469 goto done; 2469 break;
2470 case 1: 2470 case 1:
2471 val = (XSUBR (fun)->function.a1) (argvals[0]); 2471 val = (XSUBR (fun)->function.a1) (argvals[0]);
2472 goto done; 2472 break;
2473 case 2: 2473 case 2:
2474 val = (XSUBR (fun)->function.a2) (argvals[0], argvals[1]); 2474 val = (XSUBR (fun)->function.a2) (argvals[0], argvals[1]);
2475 goto done; 2475 break;
2476 case 3: 2476 case 3:
2477 val = (XSUBR (fun)->function.a3) (argvals[0], argvals[1], 2477 val = (XSUBR (fun)->function.a3) (argvals[0], argvals[1],
2478 argvals[2]); 2478 argvals[2]);
2479 goto done; 2479 break;
2480 case 4: 2480 case 4:
2481 val = (XSUBR (fun)->function.a4) (argvals[0], argvals[1], 2481 val = (XSUBR (fun)->function.a4) (argvals[0], argvals[1],
2482 argvals[2], argvals[3]); 2482 argvals[2], argvals[3]);
2483 goto done; 2483 break;
2484 case 5: 2484 case 5:
2485 val = (XSUBR (fun)->function.a5) (argvals[0], argvals[1], argvals[2], 2485 val = (XSUBR (fun)->function.a5) (argvals[0], argvals[1], argvals[2],
2486 argvals[3], argvals[4]); 2486 argvals[3], argvals[4]);
2487 goto done; 2487 break;
2488 case 6: 2488 case 6:
2489 val = (XSUBR (fun)->function.a6) (argvals[0], argvals[1], argvals[2], 2489 val = (XSUBR (fun)->function.a6) (argvals[0], argvals[1], argvals[2],
2490 argvals[3], argvals[4], argvals[5]); 2490 argvals[3], argvals[4], argvals[5]);
2491 goto done; 2491 break;
2492 case 7: 2492 case 7:
2493 val = (XSUBR (fun)->function.a7) (argvals[0], argvals[1], argvals[2], 2493 val = (XSUBR (fun)->function.a7) (argvals[0], argvals[1], argvals[2],
2494 argvals[3], argvals[4], argvals[5], 2494 argvals[3], argvals[4], argvals[5],
2495 argvals[6]); 2495 argvals[6]);
2496 goto done; 2496
2497 2497 break;
2498 case 8: 2498 case 8:
2499 val = (XSUBR (fun)->function.a8) (argvals[0], argvals[1], argvals[2], 2499 val = (XSUBR (fun)->function.a8) (argvals[0], argvals[1], argvals[2],
2500 argvals[3], argvals[4], argvals[5], 2500 argvals[3], argvals[4], argvals[5],
2501 argvals[6], argvals[7]); 2501 argvals[6], argvals[7]);
2502 goto done; 2502
2503 2503 break;
2504 default: 2504 default:
2505 /* Someone has created a subr that takes more arguments than 2505 /* Someone has created a subr that takes more arguments than
2506 is supported by this code. We need to either rewrite the 2506 is supported by this code. We need to either rewrite the
2507 subr to use a different argument protocol, or add more 2507 subr to use a different argument protocol, or add more
2508 cases to this switch. */ 2508 cases to this switch. */
2509 abort (); 2509 abort ();
2510 }
2510 } 2511 }
2511 } 2512 }
2512 if (FUNVECP (fun)) 2513 else if (FUNVECP (fun))
2513 val = apply_lambda (fun, original_args); 2514 val = apply_lambda (fun, original_args);
2514 else 2515 else
2515 { 2516 {
@@ -2533,7 +2534,6 @@ eval_sub (Lisp_Object form)
2533 else 2534 else
2534 xsignal1 (Qinvalid_function, original_fun); 2535 xsignal1 (Qinvalid_function, original_fun);
2535 } 2536 }
2536 done:
2537 CHECK_CONS_LIST (); 2537 CHECK_CONS_LIST ();
2538 2538
2539 lisp_eval_depth--; 2539 lisp_eval_depth--;
@@ -3109,7 +3109,7 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
3109 3109
3110 if (SUBRP (fun)) 3110 if (SUBRP (fun))
3111 { 3111 {
3112 if (numargs < XSUBR (fun)->min_args 3112 if (numargs < XSUBR (fun)->min_args
3113 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs)) 3113 || (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
3114 { 3114 {
3115 XSETFASTINT (lisp_numargs, numargs); 3115 XSETFASTINT (lisp_numargs, numargs);
@@ -3119,74 +3119,72 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
3119 if (XSUBR (fun)->max_args == UNEVALLED) 3119 if (XSUBR (fun)->max_args == UNEVALLED)
3120 xsignal1 (Qinvalid_function, original_fun); 3120 xsignal1 (Qinvalid_function, original_fun);
3121 3121
3122 if (XSUBR (fun)->max_args == MANY) 3122 else if (XSUBR (fun)->max_args == MANY)
3123 { 3123 val = (XSUBR (fun)->function.aMANY) (numargs, args + 1);
3124 val = (XSUBR (fun)->function.aMANY) (numargs, args + 1);
3125 goto done;
3126 }
3127
3128 if (XSUBR (fun)->max_args > numargs)
3129 {
3130 internal_args = (Lisp_Object *) alloca (XSUBR (fun)->max_args * sizeof (Lisp_Object));
3131 memcpy (internal_args, args + 1, numargs * sizeof (Lisp_Object));
3132 for (i = numargs; i < XSUBR (fun)->max_args; i++)
3133 internal_args[i] = Qnil;
3134 }
3135 else 3124 else
3136 internal_args = args + 1;
3137 switch (XSUBR (fun)->max_args)
3138 { 3125 {
3139 case 0: 3126 if (XSUBR (fun)->max_args > numargs)
3140 val = (XSUBR (fun)->function.a0) (); 3127 {
3141 goto done; 3128 internal_args = (Lisp_Object *) alloca (XSUBR (fun)->max_args * sizeof (Lisp_Object));
3142 case 1: 3129 memcpy (internal_args, args + 1, numargs * sizeof (Lisp_Object));
3143 val = (XSUBR (fun)->function.a1) (internal_args[0]); 3130 for (i = numargs; i < XSUBR (fun)->max_args; i++)
3144 goto done; 3131 internal_args[i] = Qnil;
3145 case 2: 3132 }
3146 val = (XSUBR (fun)->function.a2) (internal_args[0], internal_args[1]); 3133 else
3147 goto done; 3134 internal_args = args + 1;
3148 case 3: 3135 switch (XSUBR (fun)->max_args)
3149 val = (XSUBR (fun)->function.a3) (internal_args[0], internal_args[1], 3136 {
3150 internal_args[2]); 3137 case 0:
3151 goto done; 3138 val = (XSUBR (fun)->function.a0) ();
3152 case 4: 3139 break;
3153 val = (XSUBR (fun)->function.a4) (internal_args[0], internal_args[1], 3140 case 1:
3154 internal_args[2], internal_args[3]); 3141 val = (XSUBR (fun)->function.a1) (internal_args[0]);
3155 goto done; 3142 break;
3156 case 5: 3143 case 2:
3157 val = (XSUBR (fun)->function.a5) (internal_args[0], internal_args[1], 3144 val = (XSUBR (fun)->function.a2) (internal_args[0], internal_args[1]);
3158 internal_args[2], internal_args[3], 3145 break;
3159 internal_args[4]); 3146 case 3:
3160 goto done; 3147 val = (XSUBR (fun)->function.a3) (internal_args[0], internal_args[1],
3161 case 6: 3148 internal_args[2]);
3162 val = (XSUBR (fun)->function.a6) (internal_args[0], internal_args[1], 3149 break;
3163 internal_args[2], internal_args[3], 3150 case 4:
3164 internal_args[4], internal_args[5]); 3151 val = (XSUBR (fun)->function.a4) (internal_args[0], internal_args[1],
3165 goto done; 3152 internal_args[2], internal_args[3]);
3166 case 7: 3153 break;
3167 val = (XSUBR (fun)->function.a7) (internal_args[0], internal_args[1], 3154 case 5:
3168 internal_args[2], internal_args[3], 3155 val = (XSUBR (fun)->function.a5) (internal_args[0], internal_args[1],
3169 internal_args[4], internal_args[5], 3156 internal_args[2], internal_args[3],
3170 internal_args[6]); 3157 internal_args[4]);
3171 goto done; 3158 break;
3172 3159 case 6:
3173 case 8: 3160 val = (XSUBR (fun)->function.a6) (internal_args[0], internal_args[1],
3174 val = (XSUBR (fun)->function.a8) (internal_args[0], internal_args[1], 3161 internal_args[2], internal_args[3],
3175 internal_args[2], internal_args[3], 3162 internal_args[4], internal_args[5]);
3176 internal_args[4], internal_args[5], 3163 break;
3177 internal_args[6], internal_args[7]); 3164 case 7:
3178 goto done; 3165 val = (XSUBR (fun)->function.a7) (internal_args[0], internal_args[1],
3179 3166 internal_args[2], internal_args[3],
3180 default: 3167 internal_args[4], internal_args[5],
3181 3168 internal_args[6]);
3182 /* If a subr takes more than 8 arguments without using MANY 3169 break;
3183 or UNEVALLED, we need to extend this function to support it. 3170
3184 Until this is done, there is no way to call the function. */ 3171 case 8:
3185 abort (); 3172 val = (XSUBR (fun)->function.a8) (internal_args[0], internal_args[1],
3173 internal_args[2], internal_args[3],
3174 internal_args[4], internal_args[5],
3175 internal_args[6], internal_args[7]);
3176 break;
3177
3178 default:
3179
3180 /* If a subr takes more than 8 arguments without using MANY
3181 or UNEVALLED, we need to extend this function to support it.
3182 Until this is done, there is no way to call the function. */
3183 abort ();
3184 }
3186 } 3185 }
3187 } 3186 }
3188 3187 else if (FUNVECP (fun))
3189 if (FUNVECP (fun))
3190 val = funcall_lambda (fun, numargs, args + 1); 3188 val = funcall_lambda (fun, numargs, args + 1);
3191 else 3189 else
3192 { 3190 {
@@ -3209,7 +3207,6 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
3209 else 3207 else
3210 xsignal1 (Qinvalid_function, original_fun); 3208 xsignal1 (Qinvalid_function, original_fun);
3211 } 3209 }
3212 done:
3213 CHECK_CONS_LIST (); 3210 CHECK_CONS_LIST ();
3214 lisp_eval_depth--; 3211 lisp_eval_depth--;
3215 if (backtrace.debug_on_exit) 3212 if (backtrace.debug_on_exit)