aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/bytecode.c2
-rw-r--r--src/callint.c2
-rw-r--r--src/doc.c2
-rw-r--r--src/eval.c267
-rw-r--r--src/keyboard.c12
-rw-r--r--src/lisp.h2
-rw-r--r--src/minibuf.c4
8 files changed, 152 insertions, 144 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index c333b6388c6..2de6a5ed66c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
12010-12-15 Stefan Monnier <monnier@iro.umontreal.ca>
2
3 * eval.c (Feval): Add `lexical' argument. Adjust callers.
4 (Ffuncall, eval_sub): Avoid goto.
5
12010-12-14 Stefan Monnier <monnier@iro.umontreal.ca> 62010-12-14 Stefan Monnier <monnier@iro.umontreal.ca>
2 7
3 Try and be more careful about propagation of lexical environment. 8 Try and be more careful about propagation of lexical environment.
diff --git a/src/bytecode.c b/src/bytecode.c
index 01fce0577b0..eb12b9c4963 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -915,7 +915,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
915 Lisp_Object v1; 915 Lisp_Object v1;
916 BEFORE_POTENTIAL_GC (); 916 BEFORE_POTENTIAL_GC ();
917 v1 = POP; 917 v1 = POP;
918 TOP = internal_catch (TOP, Feval, v1); /* FIXME: lexbind */ 918 TOP = internal_catch (TOP, eval_sub, v1); /* FIXME: lexbind */
919 AFTER_POTENTIAL_GC (); 919 AFTER_POTENTIAL_GC ();
920 break; 920 break;
921 } 921 }
diff --git a/src/callint.c b/src/callint.c
index 960158029c3..5eb65b31cbf 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -342,7 +342,7 @@ invoke it. If KEYS is omitted or nil, the return value of
342 input = specs; 342 input = specs;
343 /* Compute the arg values using the user's expression. */ 343 /* Compute the arg values using the user's expression. */
344 GCPRO2 (input, filter_specs); 344 GCPRO2 (input, filter_specs);
345 specs = Feval (specs); /* FIXME: lexbind */ 345 specs = Feval (specs, Qnil); /* FIXME: lexbind */
346 UNGCPRO; 346 UNGCPRO;
347 if (i != num_input_events || !NILP (record_flag)) 347 if (i != num_input_events || !NILP (record_flag))
348 { 348 {
diff --git a/src/doc.c b/src/doc.c
index b887b3149bc..8ae152dca9a 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -490,7 +490,7 @@ aren't strings. */)
490 } 490 }
491 else if (!STRINGP (tem)) 491 else if (!STRINGP (tem))
492 /* Feval protects its argument. */ 492 /* Feval protects its argument. */
493 tem = Feval (tem); 493 tem = Feval (tem, Qnil);
494 494
495 if (NILP (raw) && STRINGP (tem)) 495 if (NILP (raw) && STRINGP (tem))
496 tem = Fsubstitute_command_keys (tem); 496 tem = Fsubstitute_command_keys (tem);
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)
diff --git a/src/keyboard.c b/src/keyboard.c
index 17819170640..df69c526f71 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1327,7 +1327,7 @@ command_loop_2 (Lisp_Object ignore)
1327Lisp_Object 1327Lisp_Object
1328top_level_2 (void) 1328top_level_2 (void)
1329{ 1329{
1330 return Feval (Vtop_level); 1330 return Feval (Vtop_level, Qnil);
1331} 1331}
1332 1332
1333Lisp_Object 1333Lisp_Object
@@ -3255,7 +3255,7 @@ read_char (int commandflag, int nmaps, Lisp_Object *maps, Lisp_Object prev_event
3255 help_form_saved_window_configs); 3255 help_form_saved_window_configs);
3256 record_unwind_protect (read_char_help_form_unwind, Qnil); 3256 record_unwind_protect (read_char_help_form_unwind, Qnil);
3257 3257
3258 tem0 = Feval (Vhelp_form); 3258 tem0 = Feval (Vhelp_form, Qnil);
3259 if (STRINGP (tem0)) 3259 if (STRINGP (tem0))
3260 internal_with_output_to_temp_buffer ("*Help*", print_help, tem0); 3260 internal_with_output_to_temp_buffer ("*Help*", print_help, tem0);
3261 3261
@@ -7696,6 +7696,12 @@ menu_item_eval_property_1 (Lisp_Object arg)
7696 return Qnil; 7696 return Qnil;
7697} 7697}
7698 7698
7699static Lisp_Object
7700eval_dyn (Lisp_Object form)
7701{
7702 return Feval (form, Qnil);
7703}
7704
7699/* Evaluate an expression and return the result (or nil if something 7705/* Evaluate an expression and return the result (or nil if something
7700 went wrong). Used to evaluate dynamic parts of menu items. */ 7706 went wrong). Used to evaluate dynamic parts of menu items. */
7701Lisp_Object 7707Lisp_Object
@@ -7704,7 +7710,7 @@ menu_item_eval_property (Lisp_Object sexpr)
7704 int count = SPECPDL_INDEX (); 7710 int count = SPECPDL_INDEX ();
7705 Lisp_Object val; 7711 Lisp_Object val;
7706 specbind (Qinhibit_redisplay, Qt); 7712 specbind (Qinhibit_redisplay, Qt);
7707 val = internal_condition_case_1 (Feval, sexpr, Qerror, 7713 val = internal_condition_case_1 (eval_dyn, sexpr, Qerror,
7708 menu_item_eval_property_1); 7714 menu_item_eval_property_1);
7709 return unbind_to (count, val); 7715 return unbind_to (count, val);
7710} 7716}
diff --git a/src/lisp.h b/src/lisp.h
index 20b50632c49..db78996be55 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -2971,7 +2971,7 @@ extern void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object) NO_RET
2971extern void signal_error (const char *, Lisp_Object) NO_RETURN; 2971extern void signal_error (const char *, Lisp_Object) NO_RETURN;
2972EXFUN (Fautoload, 5); 2972EXFUN (Fautoload, 5);
2973EXFUN (Fcommandp, 2); 2973EXFUN (Fcommandp, 2);
2974EXFUN (Feval, 1); 2974EXFUN (Feval, 2);
2975extern Lisp_Object eval_sub (Lisp_Object form); 2975extern Lisp_Object eval_sub (Lisp_Object form);
2976EXFUN (Fapply, MANY); 2976EXFUN (Fapply, MANY);
2977EXFUN (Ffuncall, MANY); 2977EXFUN (Ffuncall, MANY);
diff --git a/src/minibuf.c b/src/minibuf.c
index 409f8a9a9ef..9dd32a8bab4 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -1026,10 +1026,10 @@ is a string to insert in the minibuffer before reading.
1026Such arguments are used as in `read-from-minibuffer'.) */) 1026Such arguments are used as in `read-from-minibuffer'.) */)
1027 (Lisp_Object prompt, Lisp_Object initial_contents) 1027 (Lisp_Object prompt, Lisp_Object initial_contents)
1028{ 1028{
1029 /* FIXME: lexbind. */
1030 return Feval (read_minibuf (Vread_expression_map, initial_contents, 1029 return Feval (read_minibuf (Vread_expression_map, initial_contents,
1031 prompt, Qnil, 1, Qread_expression_history, 1030 prompt, Qnil, 1, Qread_expression_history,
1032 make_number (0), Qnil, 0, 0)); 1031 make_number (0), Qnil, 0, 0),
1032 Qnil);
1033} 1033}
1034 1034
1035/* Functions that use the minibuffer to read various things. */ 1035/* Functions that use the minibuffer to read various things. */