aboutsummaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c133
1 files changed, 67 insertions, 66 deletions
diff --git a/src/eval.c b/src/eval.c
index 74dd7e63aa1..485ba00c1e4 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -178,10 +178,8 @@ int handling_signal;
178 178
179Lisp_Object Vmacro_declaration_function; 179Lisp_Object Vmacro_declaration_function;
180 180
181static Lisp_Object apply_lambda (Lisp_Object fun, Lisp_Object args, 181static Lisp_Object apply_lambda (Lisp_Object fun, Lisp_Object args);
182 Lisp_Object lexenv); 182static Lisp_Object funcall_lambda (Lisp_Object, int, Lisp_Object *);
183static Lisp_Object funcall_lambda (Lisp_Object, int, Lisp_Object *,
184 Lisp_Object);
185static void unwind_to_catch (struct catchtag *, Lisp_Object) NO_RETURN; 183static void unwind_to_catch (struct catchtag *, Lisp_Object) NO_RETURN;
186 184
187void 185void
@@ -308,7 +306,7 @@ usage: (or CONDITIONS...) */)
308 306
309 while (CONSP (args)) 307 while (CONSP (args))
310 { 308 {
311 val = Feval (XCAR (args)); 309 val = eval_sub (XCAR (args));
312 if (!NILP (val)) 310 if (!NILP (val))
313 break; 311 break;
314 args = XCDR (args); 312 args = XCDR (args);
@@ -332,7 +330,7 @@ usage: (and CONDITIONS...) */)
332 330
333 while (CONSP (args)) 331 while (CONSP (args))
334 { 332 {
335 val = Feval (XCAR (args)); 333 val = eval_sub (XCAR (args));
336 if (NILP (val)) 334 if (NILP (val))
337 break; 335 break;
338 args = XCDR (args); 336 args = XCDR (args);
@@ -354,11 +352,11 @@ usage: (if COND THEN ELSE...) */)
354 struct gcpro gcpro1; 352 struct gcpro gcpro1;
355 353
356 GCPRO1 (args); 354 GCPRO1 (args);
357 cond = Feval (Fcar (args)); 355 cond = eval_sub (Fcar (args));
358 UNGCPRO; 356 UNGCPRO;
359 357
360 if (!NILP (cond)) 358 if (!NILP (cond))
361 return Feval (Fcar (Fcdr (args))); 359 return eval_sub (Fcar (Fcdr (args)));
362 return Fprogn (Fcdr (Fcdr (args))); 360 return Fprogn (Fcdr (Fcdr (args)));
363} 361}
364 362
@@ -382,7 +380,7 @@ usage: (cond CLAUSES...) */)
382 while (!NILP (args)) 380 while (!NILP (args))
383 { 381 {
384 clause = Fcar (args); 382 clause = Fcar (args);
385 val = Feval (Fcar (clause)); 383 val = eval_sub (Fcar (clause));
386 if (!NILP (val)) 384 if (!NILP (val))
387 { 385 {
388 if (!EQ (XCDR (clause), Qnil)) 386 if (!EQ (XCDR (clause), Qnil))
@@ -408,7 +406,7 @@ usage: (progn BODY...) */)
408 406
409 while (CONSP (args)) 407 while (CONSP (args))
410 { 408 {
411 val = Feval (XCAR (args)); 409 val = eval_sub (XCAR (args));
412 args = XCDR (args); 410 args = XCDR (args);
413 } 411 }
414 412
@@ -438,9 +436,9 @@ usage: (prog1 FIRST BODY...) */)
438 do 436 do
439 { 437 {
440 if (!(argnum++)) 438 if (!(argnum++))
441 val = Feval (Fcar (args_left)); 439 val = eval_sub (Fcar (args_left));
442 else 440 else
443 Feval (Fcar (args_left)); 441 eval_sub (Fcar (args_left));
444 args_left = Fcdr (args_left); 442 args_left = Fcdr (args_left);
445 } 443 }
446 while (!NILP(args_left)); 444 while (!NILP(args_left));
@@ -473,9 +471,9 @@ usage: (prog2 FORM1 FORM2 BODY...) */)
473 do 471 do
474 { 472 {
475 if (!(argnum++)) 473 if (!(argnum++))
476 val = Feval (Fcar (args_left)); 474 val = eval_sub (Fcar (args_left));
477 else 475 else
478 Feval (Fcar (args_left)); 476 eval_sub (Fcar (args_left));
479 args_left = Fcdr (args_left); 477 args_left = Fcdr (args_left);
480 } 478 }
481 while (!NILP (args_left)); 479 while (!NILP (args_left));
@@ -507,10 +505,10 @@ usage: (setq [SYM VAL]...) */)
507 505
508 do 506 do
509 { 507 {
510 val = Feval (Fcar (Fcdr (args_left))); 508 val = eval_sub (Fcar (Fcdr (args_left)));
511 sym = Fcar (args_left); 509 sym = Fcar (args_left);
512 510
513 /* Like for Feval, we do not check declared_special here since 511 /* Like for eval_sub, we do not check declared_special here since
514 it's been done when let-binding. */ 512 it's been done when let-binding. */
515 if (!NILP (Vinternal_interpreter_environment) /* Mere optimization! */ 513 if (!NILP (Vinternal_interpreter_environment) /* Mere optimization! */
516 && SYMBOLP (sym) 514 && SYMBOLP (sym)
@@ -870,7 +868,7 @@ usage: (defvar SYMBOL &optional INITVALUE DOCSTRING) */)
870 } 868 }
871 869
872 if (NILP (tem)) 870 if (NILP (tem))
873 Fset_default (sym, Feval (Fcar (tail))); 871 Fset_default (sym, eval_sub (Fcar (tail)));
874 else 872 else
875 { /* Check if there is really a global binding rather than just a let 873 { /* Check if there is really a global binding rather than just a let
876 binding that shadows the global unboundness of the var. */ 874 binding that shadows the global unboundness of the var. */
@@ -935,7 +933,7 @@ usage: (defconst SYMBOL INITVALUE [DOCSTRING]) */)
935 if (!NILP (Fcdr (Fcdr (Fcdr (args))))) 933 if (!NILP (Fcdr (Fcdr (Fcdr (args)))))
936 error ("Too many arguments"); 934 error ("Too many arguments");
937 935
938 tem = Feval (Fcar (Fcdr (args))); 936 tem = eval_sub (Fcar (Fcdr (args)));
939 if (!NILP (Vpurify_flag)) 937 if (!NILP (Vpurify_flag))
940 tem = Fpurecopy (tem); 938 tem = Fpurecopy (tem);
941 Fset_default (sym, tem); 939 Fset_default (sym, tem);
@@ -1049,7 +1047,7 @@ usage: (let* VARLIST BODY...) */)
1049 else 1047 else
1050 { 1048 {
1051 var = Fcar (elt); 1049 var = Fcar (elt);
1052 val = Feval (Fcar (Fcdr (elt))); 1050 val = eval_sub (Fcar (Fcdr (elt)));
1053 } 1051 }
1054 1052
1055 if (!NILP (lexenv) && SYMBOLP (var) 1053 if (!NILP (lexenv) && SYMBOLP (var)
@@ -1117,7 +1115,7 @@ usage: (let VARLIST BODY...) */)
1117 else if (! NILP (Fcdr (Fcdr (elt)))) 1115 else if (! NILP (Fcdr (Fcdr (elt))))
1118 signal_error ("`let' bindings can have only one value-form", elt); 1116 signal_error ("`let' bindings can have only one value-form", elt);
1119 else 1117 else
1120 temps [argnum++] = Feval (Fcar (Fcdr (elt))); 1118 temps [argnum++] = eval_sub (Fcar (Fcdr (elt)));
1121 gcpro2.nvars = argnum; 1119 gcpro2.nvars = argnum;
1122 } 1120 }
1123 UNGCPRO; 1121 UNGCPRO;
@@ -1166,7 +1164,7 @@ usage: (while TEST BODY...) */)
1166 1164
1167 test = Fcar (args); 1165 test = Fcar (args);
1168 body = Fcdr (args); 1166 body = Fcdr (args);
1169 while (!NILP (Feval (test))) 1167 while (!NILP (eval_sub (test)))
1170 { 1168 {
1171 QUIT; 1169 QUIT;
1172 Fprogn (body); 1170 Fprogn (body);
@@ -1268,7 +1266,7 @@ usage: (catch TAG BODY...) */)
1268 struct gcpro gcpro1; 1266 struct gcpro gcpro1;
1269 1267
1270 GCPRO1 (args); 1268 GCPRO1 (args);
1271 tag = Feval (Fcar (args)); 1269 tag = eval_sub (Fcar (args));
1272 UNGCPRO; 1270 UNGCPRO;
1273 return internal_catch (tag, Fprogn, Fcdr (args)); 1271 return internal_catch (tag, Fprogn, Fcdr (args));
1274} 1272}
@@ -1401,7 +1399,7 @@ usage: (unwind-protect BODYFORM UNWINDFORMS...) */)
1401 int count = SPECPDL_INDEX (); 1399 int count = SPECPDL_INDEX ();
1402 1400
1403 record_unwind_protect (Fprogn, Fcdr (args)); 1401 record_unwind_protect (Fprogn, Fcdr (args));
1404 val = Feval (Fcar (args)); 1402 val = eval_sub (Fcar (args));
1405 return unbind_to (count, val); 1403 return unbind_to (count, val);
1406} 1404}
1407 1405
@@ -1502,7 +1500,7 @@ internal_lisp_condition_case (volatile Lisp_Object var, Lisp_Object bodyform,
1502 h.tag = &c; 1500 h.tag = &c;
1503 handlerlist = &h; 1501 handlerlist = &h;
1504 1502
1505 val = Feval (bodyform); 1503 val = eval_sub (bodyform);
1506 catchlist = c.next; 1504 catchlist = c.next;
1507 handlerlist = h.next; 1505 handlerlist = h.next;
1508 return val; 1506 return val;
@@ -2317,6 +2315,16 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
2317 doc: /* Evaluate FORM and return its value. */) 2315 doc: /* Evaluate FORM and return its value. */)
2318 (Lisp_Object form) 2316 (Lisp_Object form)
2319{ 2317{
2318 int count = SPECPDL_INDEX ();
2319 specbind (Qinternal_interpreter_environment, Qnil);
2320 return unbind_to (count, eval_sub (form));
2321}
2322
2323/* Eval a sub-expression of the current expression (i.e. in the same
2324 lexical scope). */
2325Lisp_Object
2326eval_sub (Lisp_Object form)
2327{
2320 Lisp_Object fun, val, original_fun, original_args; 2328 Lisp_Object fun, val, original_fun, original_args;
2321 Lisp_Object funcar; 2329 Lisp_Object funcar;
2322 struct backtrace backtrace; 2330 struct backtrace backtrace;
@@ -2424,7 +2432,7 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
2424 2432
2425 while (!NILP (args_left)) 2433 while (!NILP (args_left))
2426 { 2434 {
2427 vals[argnum++] = Feval (Fcar (args_left)); 2435 vals[argnum++] = eval_sub (Fcar (args_left));
2428 args_left = Fcdr (args_left); 2436 args_left = Fcdr (args_left);
2429 gcpro3.nvars = argnum; 2437 gcpro3.nvars = argnum;
2430 } 2438 }
@@ -2445,7 +2453,7 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
2445 maxargs = XSUBR (fun)->max_args; 2453 maxargs = XSUBR (fun)->max_args;
2446 for (i = 0; i < maxargs; args_left = Fcdr (args_left)) 2454 for (i = 0; i < maxargs; args_left = Fcdr (args_left))
2447 { 2455 {
2448 argvals[i] = Feval (Fcar (args_left)); 2456 argvals[i] = eval_sub (Fcar (args_left));
2449 gcpro3.nvars = ++i; 2457 gcpro3.nvars = ++i;
2450 } 2458 }
2451 2459
@@ -2502,7 +2510,7 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
2502 } 2510 }
2503 } 2511 }
2504 if (FUNVECP (fun)) 2512 if (FUNVECP (fun))
2505 val = apply_lambda (fun, original_args, Qnil); 2513 val = apply_lambda (fun, original_args);
2506 else 2514 else
2507 { 2515 {
2508 if (EQ (fun, Qunbound)) 2516 if (EQ (fun, Qunbound))
@@ -2518,20 +2526,10 @@ DEFUN ("eval", Feval, Seval, 1, 1, 0,
2518 goto retry; 2526 goto retry;
2519 } 2527 }
2520 if (EQ (funcar, Qmacro)) 2528 if (EQ (funcar, Qmacro))
2521 val = Feval (apply1 (Fcdr (fun), original_args)); 2529 val = eval_sub (apply1 (Fcdr (fun), original_args));
2522 else if (EQ (funcar, Qlambda)) 2530 else if (EQ (funcar, Qlambda)
2523 val = apply_lambda (fun, original_args, 2531 || EQ (funcar, Qclosure))
2524 /* Only pass down the current lexical environment 2532 val = apply_lambda (fun, original_args);
2525 if FUN is lexically embedded in FORM. */
2526 (CONSP (original_fun)
2527 ? Vinternal_interpreter_environment
2528 : Qnil));
2529 else if (EQ (funcar, Qclosure)
2530 && CONSP (XCDR (fun))
2531 && CONSP (XCDR (XCDR (fun)))
2532 && EQ (XCAR (XCDR (XCDR (fun))), Qlambda))
2533 val = apply_lambda (XCDR (XCDR (fun)), original_args,
2534 XCAR (XCDR (fun)));
2535 else 2533 else
2536 xsignal1 (Qinvalid_function, original_fun); 2534 xsignal1 (Qinvalid_function, original_fun);
2537 } 2535 }
@@ -3189,7 +3187,7 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
3189 } 3187 }
3190 3188
3191 if (FUNVECP (fun)) 3189 if (FUNVECP (fun))
3192 val = funcall_lambda (fun, numargs, args + 1, Qnil); 3190 val = funcall_lambda (fun, numargs, args + 1);
3193 else 3191 else
3194 { 3192 {
3195 if (EQ (fun, Qunbound)) 3193 if (EQ (fun, Qunbound))
@@ -3199,14 +3197,9 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
3199 funcar = XCAR (fun); 3197 funcar = XCAR (fun);
3200 if (!SYMBOLP (funcar)) 3198 if (!SYMBOLP (funcar))
3201 xsignal1 (Qinvalid_function, original_fun); 3199 xsignal1 (Qinvalid_function, original_fun);
3202 if (EQ (funcar, Qlambda)) 3200 if (EQ (funcar, Qlambda)
3203 val = funcall_lambda (fun, numargs, args + 1, Qnil); 3201 || EQ (funcar, Qclosure))
3204 else if (EQ (funcar, Qclosure) 3202 val = funcall_lambda (fun, numargs, args + 1);
3205 && CONSP (XCDR (fun))
3206 && CONSP (XCDR (XCDR (fun)))
3207 && EQ (XCAR (XCDR (XCDR (fun))), Qlambda))
3208 val = funcall_lambda (XCDR (XCDR (fun)), numargs, args + 1,
3209 XCAR (XCDR (fun)));
3210 else if (EQ (funcar, Qautoload)) 3203 else if (EQ (funcar, Qautoload))
3211 { 3204 {
3212 do_autoload (fun, original_fun); 3205 do_autoload (fun, original_fun);
@@ -3226,7 +3219,7 @@ usage: (funcall FUNCTION &rest ARGUMENTS) */)
3226} 3219}
3227 3220
3228static Lisp_Object 3221static Lisp_Object
3229apply_lambda (Lisp_Object fun, Lisp_Object args, Lisp_Object lexenv) 3222apply_lambda (Lisp_Object fun, Lisp_Object args)
3230{ 3223{
3231 Lisp_Object args_left; 3224 Lisp_Object args_left;
3232 Lisp_Object numargs; 3225 Lisp_Object numargs;
@@ -3246,7 +3239,7 @@ apply_lambda (Lisp_Object fun, Lisp_Object args, Lisp_Object lexenv)
3246 for (i = 0; i < XINT (numargs);) 3239 for (i = 0; i < XINT (numargs);)
3247 { 3240 {
3248 tem = Fcar (args_left), args_left = Fcdr (args_left); 3241 tem = Fcar (args_left), args_left = Fcdr (args_left);
3249 tem = Feval (tem); 3242 tem = eval_sub (tem);
3250 arg_vector[i++] = tem; 3243 arg_vector[i++] = tem;
3251 gcpro1.nvars = i; 3244 gcpro1.nvars = i;
3252 } 3245 }
@@ -3256,7 +3249,7 @@ apply_lambda (Lisp_Object fun, Lisp_Object args, Lisp_Object lexenv)
3256 backtrace_list->args = arg_vector; 3249 backtrace_list->args = arg_vector;
3257 backtrace_list->nargs = i; 3250 backtrace_list->nargs = i;
3258 backtrace_list->evalargs = 0; 3251 backtrace_list->evalargs = 0;
3259 tem = funcall_lambda (fun, XINT (numargs), arg_vector, lexenv); 3252 tem = funcall_lambda (fun, XINT (numargs), arg_vector);
3260 3253
3261 /* Do the debug-on-exit now, while arg_vector still exists. */ 3254 /* Do the debug-on-exit now, while arg_vector still exists. */
3262 if (backtrace_list->debug_on_exit) 3255 if (backtrace_list->debug_on_exit)
@@ -3321,10 +3314,9 @@ funcall_funvec (Lisp_Object fun, int nargs, Lisp_Object *args)
3321 3314
3322static Lisp_Object 3315static Lisp_Object
3323funcall_lambda (Lisp_Object fun, int nargs, 3316funcall_lambda (Lisp_Object fun, int nargs,
3324 register Lisp_Object *arg_vector, 3317 register Lisp_Object *arg_vector)
3325 Lisp_Object lexenv)
3326{ 3318{
3327 Lisp_Object val, syms_left, next; 3319 Lisp_Object val, syms_left, next, lexenv;
3328 int count = SPECPDL_INDEX (); 3320 int count = SPECPDL_INDEX ();
3329 int i, optional, rest; 3321 int i, optional, rest;
3330 3322
@@ -3358,6 +3350,14 @@ funcall_lambda (Lisp_Object fun, int nargs,
3358 3350
3359 if (CONSP (fun)) 3351 if (CONSP (fun))
3360 { 3352 {
3353 if (EQ (XCAR (fun), Qclosure))
3354 {
3355 fun = XCDR (fun); /* Drop `closure'. */
3356 lexenv = XCAR (fun);
3357 fun = XCDR (fun); /* Drop the lexical environment. */
3358 }
3359 else
3360 lexenv = Qnil;
3361 syms_left = XCDR (fun); 3361 syms_left = XCDR (fun);
3362 if (CONSP (syms_left)) 3362 if (CONSP (syms_left))
3363 syms_left = XCAR (syms_left); 3363 syms_left = XCAR (syms_left);
@@ -3365,7 +3365,10 @@ funcall_lambda (Lisp_Object fun, int nargs,
3365 xsignal1 (Qinvalid_function, fun); 3365 xsignal1 (Qinvalid_function, fun);
3366 } 3366 }
3367 else if (COMPILEDP (fun)) 3367 else if (COMPILEDP (fun))
3368 syms_left = AREF (fun, COMPILED_ARGLIST); 3368 {
3369 syms_left = AREF (fun, COMPILED_ARGLIST);
3370 lexenv = Qnil;
3371 }
3369 else 3372 else
3370 abort (); 3373 abort ();
3371 3374
@@ -3382,23 +3385,21 @@ funcall_lambda (Lisp_Object fun, int nargs,
3382 rest = 1; 3385 rest = 1;
3383 else if (EQ (next, Qand_optional)) 3386 else if (EQ (next, Qand_optional))
3384 optional = 1; 3387 optional = 1;
3385 else if (rest)
3386 {
3387 specbind (next, Flist (nargs - i, &arg_vector[i]));
3388 i = nargs;
3389 }
3390 else 3388 else
3391 { 3389 {
3392 Lisp_Object val; 3390 Lisp_Object val;
3393 3391 if (rest)
3394 /* Get the argument's actual value. */ 3392 {
3395 if (i < nargs) 3393 val = Flist (nargs - i, &arg_vector[i]);
3394 i = nargs;
3395 }
3396 else if (i < nargs)
3396 val = arg_vector[i++]; 3397 val = arg_vector[i++];
3397 else if (!optional) 3398 else if (!optional)
3398 xsignal2 (Qwrong_number_of_arguments, fun, make_number (nargs)); 3399 xsignal2 (Qwrong_number_of_arguments, fun, make_number (nargs));
3399 else 3400 else
3400 val = Qnil; 3401 val = Qnil;
3401 3402
3402 /* Bind the argument. */ 3403 /* Bind the argument. */
3403 if (!NILP (lexenv) && SYMBOLP (next) 3404 if (!NILP (lexenv) && SYMBOLP (next)
3404 /* FIXME: there's no good reason to allow dynamic-scoping 3405 /* FIXME: there's no good reason to allow dynamic-scoping