diff options
Diffstat (limited to 'src/eval.c')
| -rw-r--r-- | src/eval.c | 133 |
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 | ||
| 179 | Lisp_Object Vmacro_declaration_function; | 179 | Lisp_Object Vmacro_declaration_function; |
| 180 | 180 | ||
| 181 | static Lisp_Object apply_lambda (Lisp_Object fun, Lisp_Object args, | 181 | static Lisp_Object apply_lambda (Lisp_Object fun, Lisp_Object args); |
| 182 | Lisp_Object lexenv); | 182 | static Lisp_Object funcall_lambda (Lisp_Object, int, Lisp_Object *); |
| 183 | static Lisp_Object funcall_lambda (Lisp_Object, int, Lisp_Object *, | ||
| 184 | Lisp_Object); | ||
| 185 | static void unwind_to_catch (struct catchtag *, Lisp_Object) NO_RETURN; | 183 | static void unwind_to_catch (struct catchtag *, Lisp_Object) NO_RETURN; |
| 186 | 184 | ||
| 187 | void | 185 | void |
| @@ -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). */ | ||
| 2325 | Lisp_Object | ||
| 2326 | eval_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 | ||
| 3228 | static Lisp_Object | 3221 | static Lisp_Object |
| 3229 | apply_lambda (Lisp_Object fun, Lisp_Object args, Lisp_Object lexenv) | 3222 | apply_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 | ||
| 3322 | static Lisp_Object | 3315 | static Lisp_Object |
| 3323 | funcall_lambda (Lisp_Object fun, int nargs, | 3316 | funcall_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 |