@@ -42,13 +42,17 @@ typedef struct _mp_obj_base_t mp_obj_base_t;
4242
4343#define MP_DECLARE_CONST_FUN_OBJ (obj_name ) extern const mp_obj_fun_native_t obj_name
4444
45- #define MP_DEFINE_CONST_FUN_OBJ_VOID_PTR (obj_name , n_args_min , n_args_max , fun_name ) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, n_args_min, n_args_max, (void *)fun_name}
46- #define MP_DEFINE_CONST_FUN_OBJ_0 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 0, 0, (mp_fun_0_t)fun_name)
47- #define MP_DEFINE_CONST_FUN_OBJ_1 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 1, 1, (mp_fun_1_t)fun_name)
48- #define MP_DEFINE_CONST_FUN_OBJ_2 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 2, 2, (mp_fun_2_t)fun_name)
49- #define MP_DEFINE_CONST_FUN_OBJ_3 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, 3, 3, (mp_fun_3_t)fun_name)
50- #define MP_DEFINE_CONST_FUN_OBJ_VAR (obj_name , n_args_min , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, n_args_min, (~((machine_uint_t)0)), (mp_fun_var_t)fun_name)
51- #define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (obj_name , n_args_min , n_args_max , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, n_args_min, n_args_max, (mp_fun_var_t)fun_name)
45+ #define MP_DEFINE_CONST_FUN_OBJ_VOID_PTR (obj_name , is_kw , n_args_min , n_args_max , fun_name ) const mp_obj_fun_native_t obj_name = {{&fun_native_type}, is_kw, n_args_min, n_args_max, (void *)fun_name}
46+ #define MP_DEFINE_CONST_FUN_OBJ_0 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 0, 0, (mp_fun_0_t)fun_name)
47+ #define MP_DEFINE_CONST_FUN_OBJ_1 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 1, 1, (mp_fun_1_t)fun_name)
48+ #define MP_DEFINE_CONST_FUN_OBJ_2 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 2, 2, (mp_fun_2_t)fun_name)
49+ #define MP_DEFINE_CONST_FUN_OBJ_3 (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, 3, 3, (mp_fun_3_t)fun_name)
50+ #define MP_DEFINE_CONST_FUN_OBJ_VAR (obj_name , n_args_min , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, n_args_min, (~((machine_uint_t)0)), (mp_fun_var_t)fun_name)
51+ #define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (obj_name , n_args_min , n_args_max , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, false, n_args_min, n_args_max, (mp_fun_var_t)fun_name)
52+ #define MP_DEFINE_CONST_FUN_OBJ_KW (obj_name , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, true, 0, (~((machine_uint_t)0)), (mp_fun_var_t)fun_name)
53+
54+ // Need to declare this here so we are not dependent on map.h
55+ struct _mp_map_t ;
5256
5357// Type definitions for methods
5458
@@ -58,10 +62,12 @@ typedef mp_obj_t (*mp_fun_2_t)(mp_obj_t, mp_obj_t);
5862typedef mp_obj_t (* mp_fun_3_t )(mp_obj_t , mp_obj_t , mp_obj_t );
5963typedef mp_obj_t (* mp_fun_t )(void );
6064typedef mp_obj_t (* mp_fun_var_t )(int n , const mp_obj_t * );
65+ typedef mp_obj_t (* mp_fun_kw_t )(mp_obj_t * , struct _mp_map_t * );
6166
6267typedef void (* mp_print_fun_t )(void (* print )(void * env , const char * fmt , ...), void * env , mp_obj_t o );
6368typedef mp_obj_t (* mp_make_new_fun_t )(mp_obj_t type_in , int n_args , const mp_obj_t * args ); // args are in reverse order in the array
6469typedef mp_obj_t (* mp_call_n_fun_t )(mp_obj_t fun , int n_args , const mp_obj_t * args ); // args are in reverse order in the array
70+ typedef mp_obj_t (* mp_call_n_kw_fun_t )(mp_obj_t fun , int n_args , int n_kw , const mp_obj_t * args ); // args are in reverse order in the array
6571typedef mp_obj_t (* mp_unary_op_fun_t )(int op , mp_obj_t );
6672typedef mp_obj_t (* mp_binary_op_fun_t )(int op , mp_obj_t , mp_obj_t );
6773
@@ -77,6 +83,7 @@ struct _mp_obj_type_t {
7783 mp_make_new_fun_t make_new ; // to make an instance of the type
7884
7985 mp_call_n_fun_t call_n ;
86+ mp_call_n_kw_fun_t call_n_kw ;
8087 mp_unary_op_fun_t unary_op ; // can return NULL if op not supported
8188 mp_binary_op_fun_t binary_op ; // can return NULL if op not supported
8289
@@ -120,10 +127,6 @@ extern const mp_obj_t mp_const_empty_tuple;
120127extern const mp_obj_t mp_const_ellipsis ;
121128extern const mp_obj_t mp_const_stop_iteration ; // special object indicating end of iteration (not StopIteration exception!)
122129
123- // Need to declare this here so we are not dependent on map.h
124-
125- struct _mp_map_t ;
126-
127130// General API for objects
128131
129132mp_obj_t mp_obj_new_none (void );
@@ -146,8 +149,8 @@ mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun);
146149mp_obj_t mp_obj_new_gen_wrap (uint n_locals , uint n_stack , mp_obj_t fun );
147150mp_obj_t mp_obj_new_gen_instance (const byte * bytecode , uint n_state , int n_args , const mp_obj_t * args );
148151mp_obj_t mp_obj_new_closure (mp_obj_t fun , mp_obj_t closure_tuple );
149- mp_obj_t mp_obj_new_tuple (uint n , mp_obj_t * items );
150- mp_obj_t mp_obj_new_tuple_reverse (uint n , mp_obj_t * items );
152+ mp_obj_t mp_obj_new_tuple (uint n , const mp_obj_t * items );
153+ mp_obj_t mp_obj_new_tuple_reverse (uint n , const mp_obj_t * items );
151154mp_obj_t mp_obj_new_list (uint n , mp_obj_t * items );
152155mp_obj_t mp_obj_new_list_reverse (uint n , mp_obj_t * items );
153156mp_obj_t mp_obj_new_dict (int n_args );
@@ -236,7 +239,8 @@ void mp_obj_slice_get(mp_obj_t self_in, machine_int_t *start, machine_int_t *sto
236239// functions
237240typedef struct _mp_obj_fun_native_t { // need this so we can define const objects (to go in ROM)
238241 mp_obj_base_t base ;
239- machine_uint_t n_args_min ; // inclusive
242+ bool is_kw : 1 ;
243+ machine_uint_t n_args_min : (sizeof (machine_uint_t ) - 1 ); // inclusive
240244 machine_uint_t n_args_max ; // inclusive
241245 void * fun ;
242246 // TODO add mp_map_t *globals
0 commit comments