@@ -270,14 +270,27 @@ static inline bool mp_obj_is_integer(mp_const_obj_t o) { return MP_OBJ_IS_INT(o)
270270
271271#define MP_DECLARE_CONST_FUN_OBJ (obj_name ) extern const mp_obj_fun_builtin_t obj_name
272272
273- #define MP_DEFINE_CONST_FUN_OBJ_VOID_PTR (obj_name , is_kw , n_args_min , n_args_max , fun_name ) const mp_obj_fun_builtin_t obj_name = {{&mp_type_fun_builtin}, is_kw, n_args_min, n_args_max, (void(*)(void))fun_name}
274- #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)
275- #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)
276- #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)
277- #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)
278- #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, MP_OBJ_FUN_ARGS_MAX, (mp_fun_var_t)fun_name)
279- #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)
280- #define MP_DEFINE_CONST_FUN_OBJ_KW (obj_name , n_args_min , fun_name ) MP_DEFINE_CONST_FUN_OBJ_VOID_PTR(obj_name, true, n_args_min, MP_OBJ_FUN_ARGS_MAX, (mp_fun_kw_t)fun_name)
273+ #define MP_DEFINE_CONST_FUN_OBJ_0 (obj_name , fun_name ) \
274+ const mp_obj_fun_builtin_t obj_name = \
275+ {{&mp_type_fun_builtin}, false, 0, 0, .fun._0 = fun_name}
276+ #define MP_DEFINE_CONST_FUN_OBJ_1 (obj_name , fun_name ) \
277+ const mp_obj_fun_builtin_t obj_name = \
278+ {{&mp_type_fun_builtin}, false, 1, 1, .fun._1 = fun_name}
279+ #define MP_DEFINE_CONST_FUN_OBJ_2 (obj_name , fun_name ) \
280+ const mp_obj_fun_builtin_t obj_name = \
281+ {{&mp_type_fun_builtin}, false, 2, 2, .fun._2 = fun_name}
282+ #define MP_DEFINE_CONST_FUN_OBJ_3 (obj_name , fun_name ) \
283+ const mp_obj_fun_builtin_t obj_name = \
284+ {{&mp_type_fun_builtin}, false, 3, 3, .fun._3 = fun_name}
285+ #define MP_DEFINE_CONST_FUN_OBJ_VAR (obj_name , n_args_min , fun_name ) \
286+ const mp_obj_fun_builtin_t obj_name = \
287+ {{&mp_type_fun_builtin}, false, n_args_min, MP_OBJ_FUN_ARGS_MAX, .fun.var = fun_name}
288+ #define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (obj_name , n_args_min , n_args_max , fun_name ) \
289+ const mp_obj_fun_builtin_t obj_name = \
290+ {{&mp_type_fun_builtin}, false, n_args_min, n_args_max, .fun.var = fun_name}
291+ #define MP_DEFINE_CONST_FUN_OBJ_KW (obj_name , n_args_min , fun_name ) \
292+ const mp_obj_fun_builtin_t obj_name = \
293+ {{&mp_type_fun_builtin}, true, n_args_min, MP_OBJ_FUN_ARGS_MAX, .fun.kw = fun_name}
281294
282295// These macros are used to define constant map/dict objects
283296// You can put "static" in front of the definition to make it local
@@ -744,7 +757,14 @@ typedef struct _mp_obj_fun_builtin_t { // use this to make const objects that go
744757 bool is_kw : 1 ;
745758 mp_uint_t n_args_min : 15 ; // inclusive
746759 mp_uint_t n_args_max : 16 ; // inclusive
747- void (* fun )(void ); // must be a pointer to a callable function in ROM
760+ union {
761+ mp_fun_0_t _0 ;
762+ mp_fun_1_t _1 ;
763+ mp_fun_2_t _2 ;
764+ mp_fun_3_t _3 ;
765+ mp_fun_var_t var ;
766+ mp_fun_kw_t kw ;
767+ } fun ;
748768} mp_obj_fun_builtin_t ;
749769
750770qstr mp_obj_fun_get_name (mp_const_obj_t fun );
0 commit comments