1717
1818// mp_obj_fun_native_t defined in obj.h
1919
20+ void check_nargs (mp_obj_fun_native_t * self , int n_args , int n_kw ) {
21+ if (n_kw && !self -> is_kw ) {
22+ nlr_jump (mp_obj_new_exception_msg (MP_QSTR_TypeError ,
23+ "function does not take keyword arguments" ));
24+ }
25+
26+ if (self -> n_args_min == self -> n_args_max ) {
27+ if (n_args != self -> n_args_min ) {
28+ nlr_jump (mp_obj_new_exception_msg_2_args (MP_QSTR_TypeError ,
29+ "function takes %d positional arguments but %d were given" ,
30+ (const char * )(machine_int_t )self -> n_args_min ,
31+ (const char * )(machine_int_t )n_args ));
32+ }
33+ } else {
34+ if (n_args < self -> n_args_min ) {
35+ nlr_jump (mp_obj_new_exception_msg_1_arg (MP_QSTR_TypeError ,
36+ "<fun name>() missing %d required positional arguments: <list of names of params>" ,
37+ (const char * )(machine_int_t )(self -> n_args_min - n_args )));
38+ } else if (n_args > self -> n_args_max ) {
39+ nlr_jump (mp_obj_new_exception_msg_2_args (MP_QSTR_TypeError ,
40+ "<fun name> expected at most %d arguments, got %d" ,
41+ (void * )(machine_int_t )self -> n_args_max , (void * )(machine_int_t )n_args ));
42+ }
43+ }
44+ }
45+
2046mp_obj_t fun_native_call_n_kw (mp_obj_t self_in , int n_args , int n_kw , const mp_obj_t * args );
2147// args are in reverse order in the array
2248mp_obj_t fun_native_call_n (mp_obj_t self_in , int n_args , const mp_obj_t * args ) {
2349 mp_obj_fun_native_t * self = self_in ;
50+ // check number of arguments
51+ check_nargs (self , n_args , 0 );
2452 if (self -> is_kw ) {
2553 return fun_native_call_n_kw (self_in , n_args , 0 , args );
2654 }
2755 if (self -> n_args_min == self -> n_args_max ) {
2856 // function requires a fixed number of arguments
2957
30- // check number of arguments
31- if (n_args != self -> n_args_min ) {
32- nlr_jump (mp_obj_new_exception_msg_2_args (MP_QSTR_TypeError , "function takes %d positional arguments but %d were given" , (const char * )(machine_int_t )self -> n_args_min , (const char * )(machine_int_t )n_args ));
33- }
34-
3558 // dispatch function call
3659 switch (self -> n_args_min ) {
3760 case 0 :
@@ -54,12 +77,6 @@ mp_obj_t fun_native_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
5477 } else {
5578 // function takes a variable number of arguments
5679
57- if (n_args < self -> n_args_min ) {
58- nlr_jump (mp_obj_new_exception_msg_1_arg (MP_QSTR_TypeError , "<fun name>() missing %d required positional arguments: <list of names of params>" , (const char * )(machine_int_t )(self -> n_args_min - n_args )));
59- } else if (n_args > self -> n_args_max ) {
60- nlr_jump (mp_obj_new_exception_msg_2_args (MP_QSTR_TypeError , "<fun name> expected at most %d arguments, got %d" , (void * )(machine_int_t )self -> n_args_max , (void * )(machine_int_t )n_args ));
61- }
62-
6380 // TODO really the args need to be passed in as a Python tuple, as the form f(*[1,2]) can be used to pass var args
6481 mp_obj_t * args_ordered = m_new (mp_obj_t , n_args );
6582 for (int i = 0 ; i < n_args ; i ++ ) {
@@ -76,9 +93,7 @@ mp_obj_t fun_native_call_n(mp_obj_t self_in, int n_args, const mp_obj_t *args) {
7693mp_obj_t fun_native_call_n_kw (mp_obj_t self_in , int n_args , int n_kw , const mp_obj_t * args ) {
7794 mp_obj_fun_native_t * self = self_in ;
7895
79- if (!self -> is_kw ) {
80- nlr_jump (mp_obj_new_exception_msg (MP_QSTR_TypeError , "function does not take keyword arguments" ));
81- }
96+ check_nargs (self , n_args , n_kw );
8297
8398 mp_obj_t * vargs = mp_obj_new_tuple_reverse (n_args , args + 2 * n_kw );
8499 mp_map_t * kw_args = mp_map_new (n_kw );
0 commit comments