comparison src/eval.c @ 436:080151679be2 r21-2-26

Import from CVS: tag r21-2-26
author cvs
date Mon, 13 Aug 2007 11:31:24 +0200
parents 3ecd8885ac67
children 84b14dcb0985
comparison
equal deleted inserted replaced
435:53cf74a9db44 436:080151679be2
75 #define PRIMITIVE_FUNCALL(rv, fn, av, ac) do { \ 75 #define PRIMITIVE_FUNCALL(rv, fn, av, ac) do { \
76 void (*PF_fn)(void) = (void (*)(void)) fn; \ 76 void (*PF_fn)(void) = (void (*)(void)) fn; \
77 Lisp_Object *PF_av = (av); \ 77 Lisp_Object *PF_av = (av); \
78 switch (ac) \ 78 switch (ac) \
79 { \ 79 { \
80 default: abort(); \ 80 default:rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 0); break; \
81 case 0: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 0); break; \
82 case 1: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 1); break; \ 81 case 1: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 1); break; \
83 case 2: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 2); break; \ 82 case 2: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 2); break; \
84 case 3: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 3); break; \ 83 case 3: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 3); break; \
85 case 4: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 4); break; \ 84 case 4: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 4); break; \
86 case 5: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 5); break; \ 85 case 5: rv = PRIMITIVE_FUNCALL_1(PF_fn, PF_av, 5); break; \
2469 Fsignal (Qquit, Qnil); 2468 Fsignal (Qquit, Qnil);
2470 } 2469 }
2471 2470
2472 2471
2473 /* Used in core lisp functions for efficiency */ 2472 /* Used in core lisp functions for efficiency */
2474 void 2473 Lisp_Object
2475 signal_void_function_error (Lisp_Object function) 2474 signal_void_function_error (Lisp_Object function)
2476 { 2475 {
2477 Fsignal (Qvoid_function, list1 (function)); 2476 return Fsignal (Qvoid_function, list1 (function));
2478 } 2477 }
2479 2478
2480 static void 2479 Lisp_Object
2481 signal_invalid_function_error (Lisp_Object function) 2480 signal_invalid_function_error (Lisp_Object function)
2482 { 2481 {
2483 Fsignal (Qinvalid_function, list1 (function)); 2482 return Fsignal (Qinvalid_function, list1 (function));
2484 } 2483 }
2485 2484
2486 static void 2485 Lisp_Object
2487 signal_wrong_number_of_arguments_error (Lisp_Object function, int nargs) 2486 signal_wrong_number_of_arguments_error (Lisp_Object function, int nargs)
2488 { 2487 {
2489 Fsignal (Qwrong_number_of_arguments, list2 (function, make_int (nargs))); 2488 return Fsignal (Qwrong_number_of_arguments,
2489 list2 (function, make_int (nargs)));
2490 } 2490 }
2491 2491
2492 /* Used in list traversal macros for efficiency. */ 2492 /* Used in list traversal macros for efficiency. */
2493 void 2493 DOESNT_RETURN
2494 signal_malformed_list_error (Lisp_Object list) 2494 signal_malformed_list_error (Lisp_Object list)
2495 { 2495 {
2496 Fsignal (Qmalformed_list, list1 (list)); 2496 signal_error (Qmalformed_list, list1 (list));
2497 } 2497 }
2498 2498
2499 void 2499 DOESNT_RETURN
2500 signal_malformed_property_list_error (Lisp_Object list) 2500 signal_malformed_property_list_error (Lisp_Object list)
2501 { 2501 {
2502 Fsignal (Qmalformed_property_list, list1 (list)); 2502 signal_error (Qmalformed_property_list, list1 (list));
2503 } 2503 }
2504 2504
2505 void 2505 DOESNT_RETURN
2506 signal_circular_list_error (Lisp_Object list) 2506 signal_circular_list_error (Lisp_Object list)
2507 { 2507 {
2508 Fsignal (Qcircular_list, list1 (list)); 2508 signal_error (Qcircular_list, list1 (list));
2509 } 2509 }
2510 2510
2511 void 2511 DOESNT_RETURN
2512 signal_circular_property_list_error (Lisp_Object list) 2512 signal_circular_property_list_error (Lisp_Object list)
2513 { 2513 {
2514 Fsignal (Qcircular_property_list, list1 (list)); 2514 signal_error (Qcircular_property_list, list1 (list));
2515 } 2515 }
2516 2516
2517 /************************************************************************/ 2517 /************************************************************************/
2518 /* User commands */ 2518 /* User commands */
2519 /************************************************************************/ 2519 /************************************************************************/
3004 UNGCPRO; 3004 UNGCPRO;
3005 } 3005 }
3006 else 3006 else
3007 { 3007 {
3008 wrong_number_of_arguments: 3008 wrong_number_of_arguments:
3009 signal_wrong_number_of_arguments_error (fun, nargs); 3009 val = signal_wrong_number_of_arguments_error (fun, nargs);
3010 } 3010 }
3011 } 3011 }
3012 else if (COMPILED_FUNCTIONP (fun)) 3012 else if (COMPILED_FUNCTIONP (fun))
3013 { 3013 {
3014 struct gcpro gcpro1; 3014 struct gcpro gcpro1;
3092 } 3092 }
3093 } 3093 }
3094 else /* ! (SUBRP (fun) || COMPILED_FUNCTIONP (fun) || CONSP (fun)) */ 3094 else /* ! (SUBRP (fun) || COMPILED_FUNCTIONP (fun) || CONSP (fun)) */
3095 { 3095 {
3096 invalid_function: 3096 invalid_function:
3097 signal_invalid_function_error (fun); 3097 val = signal_invalid_function_error (fun);
3098 } 3098 }
3099 3099
3100 lisp_eval_depth--; 3100 lisp_eval_depth--;
3101 if (backtrace.debug_on_exit) 3101 if (backtrace.debug_on_exit)
3102 val = do_debug_on_exit (val); 3102 val = do_debug_on_exit (val);
3167 { 3167 {
3168 Lisp_Subr *subr = XSUBR (fun); 3168 Lisp_Subr *subr = XSUBR (fun);
3169 int max_args = subr->max_args; 3169 int max_args = subr->max_args;
3170 Lisp_Object spacious_args[SUBR_MAX_ARGS]; 3170 Lisp_Object spacious_args[SUBR_MAX_ARGS];
3171 3171
3172 if (fun_nargs < subr->min_args)
3173 goto wrong_number_of_arguments;
3174
3175 if (fun_nargs == max_args) /* Optimize for the common case */ 3172 if (fun_nargs == max_args) /* Optimize for the common case */
3176 { 3173 {
3177 funcall_subr: 3174 funcall_subr:
3178 FUNCALL_SUBR (val, subr, fun_args, max_args); 3175 FUNCALL_SUBR (val, subr, fun_args, max_args);
3179 } 3176 }
3177 else if (fun_nargs < subr->min_args)
3178 {
3179 goto wrong_number_of_arguments;
3180 }
3180 else if (fun_nargs < max_args) 3181 else if (fun_nargs < max_args)
3181 { 3182 {
3182 Lisp_Object *p = spacious_args; 3183 Lisp_Object *p = spacious_args;
3183 3184
3184 /* Default optionals to nil */ 3185 /* Default optionals to nil */
3190 fun_args = spacious_args; 3191 fun_args = spacious_args;
3191 goto funcall_subr; 3192 goto funcall_subr;
3192 } 3193 }
3193 else if (max_args == MANY) 3194 else if (max_args == MANY)
3194 { 3195 {
3195 val = ((Lisp_Object (*) (int, Lisp_Object *)) subr_function (subr)) 3196 val = SUBR_FUNCTION (subr, MANY) (fun_nargs, fun_args);
3196 (fun_nargs, fun_args);
3197 } 3197 }
3198 else if (max_args == UNEVALLED) /* Can't funcall a special form */ 3198 else if (max_args == UNEVALLED) /* Can't funcall a special form */
3199 { 3199 {
3200 goto invalid_function; 3200 goto invalid_function;
3201 } 3201 }
3202 else 3202 else
3203 { 3203 {
3204 wrong_number_of_arguments: 3204 wrong_number_of_arguments:
3205 signal_wrong_number_of_arguments_error (fun, fun_nargs); 3205 val = signal_wrong_number_of_arguments_error (fun, fun_nargs);
3206 } 3206 }
3207 } 3207 }
3208 else if (COMPILED_FUNCTIONP (fun)) 3208 else if (COMPILED_FUNCTIONP (fun))
3209 { 3209 {
3210 val = funcall_compiled_function (fun, fun_nargs, fun_args); 3210 val = funcall_compiled_function (fun, fun_nargs, fun_args);
3227 goto invalid_function; 3227 goto invalid_function;
3228 } 3228 }
3229 } 3229 }
3230 else if (UNBOUNDP (fun)) 3230 else if (UNBOUNDP (fun))
3231 { 3231 {
3232 signal_void_function_error (args[0]); 3232 val = signal_void_function_error (args[0]);
3233 } 3233 }
3234 else 3234 else
3235 { 3235 {
3236 invalid_function: 3236 invalid_function:
3237 signal_invalid_function_error (fun); 3237 val = signal_invalid_function_error (fun);
3238 } 3238 }
3239 3239
3240 lisp_eval_depth--; 3240 lisp_eval_depth--;
3241 if (backtrace.debug_on_exit) 3241 if (backtrace.debug_on_exit)
3242 val = do_debug_on_exit (val); 3242 val = do_debug_on_exit (val);
3308 } 3308 }
3309 } 3309 }
3310 else 3310 else
3311 { 3311 {
3312 invalid_function: 3312 invalid_function:
3313 return Fsignal (Qinvalid_function, list1 (function)); 3313 return signal_invalid_function_error (function);
3314 } 3314 }
3315 3315
3316 { 3316 {
3317 int argcount = 0; 3317 int argcount = 0;
3318 Lisp_Object arg; 3318 Lisp_Object arg;
3495 goto wrong_number_of_arguments; 3495 goto wrong_number_of_arguments;
3496 3496
3497 return unbind_to (speccount, Fprogn (body)); 3497 return unbind_to (speccount, Fprogn (body));
3498 3498
3499 wrong_number_of_arguments: 3499 wrong_number_of_arguments:
3500 return Fsignal (Qwrong_number_of_arguments, list2 (fun, make_int (nargs))); 3500 return signal_wrong_number_of_arguments_error (fun, nargs);
3501 3501
3502 invalid_function: 3502 invalid_function:
3503 return Fsignal (Qinvalid_function, list1 (fun)); 3503 return signal_invalid_function_error (fun);
3504 } 3504 }
3505 3505
3506 3506
3507 /************************************************************************/ 3507 /************************************************************************/
3508 /* Run hook variables in various ways. */ 3508 /* Run hook variables in various ways. */