diff options
| author | Stefan Monnier | 2010-12-15 12:46:59 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2010-12-15 12:46:59 -0500 |
| commit | a0ee6f2751acba71df443d4d795bb350eb6421dd (patch) | |
| tree | e4f47d66877b1b00b9ce00a304b509dee840868a /src/eval.c | |
| parent | defb141157dfa37c33cdcbfa4b29c702a8fc9edf (diff) | |
| download | emacs-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.c | 267 |
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 | ||
| 2314 | DEFUN ("eval", Feval, Seval, 1, 1, 0, | 2314 | DEFUN ("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) | 2316 | If 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) |