@@ -270,62 +270,38 @@ static inline bool mp_obj_is_integer(mp_const_obj_t o) { return MP_OBJ_IS_INT(o)
270
270
// These macros are used to declare and define constant function objects
271
271
// You can put "static" in front of the definitions to make them local
272
272
273
- #define MP_DECLARE_CONST_FUN_OBJ_0 (obj_name ) extern const mp_obj_fun_builtin_fixed_t obj_name
274
- #define MP_DECLARE_CONST_FUN_OBJ_1 (obj_name ) extern const mp_obj_fun_builtin_fixed_t obj_name
275
- #define MP_DECLARE_CONST_FUN_OBJ_2 (obj_name ) extern const mp_obj_fun_builtin_fixed_t obj_name
276
- #define MP_DECLARE_CONST_FUN_OBJ_3 (obj_name ) extern const mp_obj_fun_builtin_fixed_t obj_name
273
+ // If using a C++ compiler then we can only initialise a const union with the
274
+ // first member, and so we use distinct struct types for all possible cases
275
+
276
+ #define MP_DECLARE_CONST_FUN_OBJ_0 (obj_name ) extern const mp_obj_fun_builtin_fixed0_t obj_name
277
+ #define MP_DECLARE_CONST_FUN_OBJ_1 (obj_name ) extern const mp_obj_fun_builtin_fixed1_t obj_name
278
+ #define MP_DECLARE_CONST_FUN_OBJ_2 (obj_name ) extern const mp_obj_fun_builtin_fixed2_t obj_name
279
+ #define MP_DECLARE_CONST_FUN_OBJ_3 (obj_name ) extern const mp_obj_fun_builtin_fixed3_t obj_name
277
280
#define MP_DECLARE_CONST_FUN_OBJ_VAR (obj_name ) extern const mp_obj_fun_builtin_var_t obj_name
278
281
#define MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN (obj_name ) extern const mp_obj_fun_builtin_var_t obj_name
279
- #define MP_DECLARE_CONST_FUN_OBJ_KW (obj_name ) extern const mp_obj_fun_builtin_var_t obj_name
282
+ #define MP_DECLARE_CONST_FUN_OBJ_KW (obj_name ) extern const mp_obj_fun_builtin_kw_t obj_name
280
283
281
- #ifdef __cplusplus
282
- // If using a C++ compiler then we can only initialise a const union with the
283
- // first member, and so we use a cast to get the function pointer to initialise.
284
284
#define MP_DEFINE_CONST_FUN_OBJ_0 (obj_name , fun_name ) \
285
- const mp_obj_fun_builtin_fixed_t obj_name = \
285
+ const mp_obj_fun_builtin_fixed0_t obj_name = \
286
286
{{&mp_type_fun_builtin_0}, fun_name}
287
287
#define MP_DEFINE_CONST_FUN_OBJ_1 (obj_name , fun_name ) \
288
- const mp_obj_fun_builtin_fixed_t obj_name = \
289
- {{&mp_type_fun_builtin_1}, (mp_fun_0_t) fun_name}
288
+ const mp_obj_fun_builtin_fixed1_t obj_name = \
289
+ {{&mp_type_fun_builtin_1}, fun_name}
290
290
#define MP_DEFINE_CONST_FUN_OBJ_2 (obj_name , fun_name ) \
291
- const mp_obj_fun_builtin_fixed_t obj_name = \
292
- {{&mp_type_fun_builtin_2}, (mp_fun_0_t) fun_name}
291
+ const mp_obj_fun_builtin_fixed2_t obj_name = \
292
+ {{&mp_type_fun_builtin_2}, fun_name}
293
293
#define MP_DEFINE_CONST_FUN_OBJ_3 (obj_name , fun_name ) \
294
- const mp_obj_fun_builtin_fixed_t obj_name = \
295
- {{&mp_type_fun_builtin_3}, (mp_fun_0_t) fun_name}
294
+ const mp_obj_fun_builtin_fixed3_t obj_name = \
295
+ {{&mp_type_fun_builtin_3}, fun_name}
296
296
#define MP_DEFINE_CONST_FUN_OBJ_VAR (obj_name , n_args_min , fun_name ) \
297
297
const mp_obj_fun_builtin_var_t obj_name = \
298
298
{{&mp_type_fun_builtin_var}, false, n_args_min, MP_OBJ_FUN_ARGS_MAX, fun_name}
299
299
#define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (obj_name , n_args_min , n_args_max , fun_name ) \
300
300
const mp_obj_fun_builtin_var_t obj_name = \
301
301
{{&mp_type_fun_builtin_var}, false, n_args_min, n_args_max, fun_name}
302
302
#define MP_DEFINE_CONST_FUN_OBJ_KW (obj_name , n_args_min , fun_name ) \
303
- const mp_obj_fun_builtin_var_t obj_name = \
304
- {{&mp_type_fun_builtin_var}, true, n_args_min, MP_OBJ_FUN_ARGS_MAX, (mp_fun_var_t)fun_name}
305
- #else
306
- // If using a C compiler then we can specify the member of a const union.
307
- #define MP_DEFINE_CONST_FUN_OBJ_0 (obj_name , fun_name ) \
308
- const mp_obj_fun_builtin_fixed_t obj_name = \
309
- {{&mp_type_fun_builtin_0}, .fun._0 = fun_name}
310
- #define MP_DEFINE_CONST_FUN_OBJ_1 (obj_name , fun_name ) \
311
- const mp_obj_fun_builtin_fixed_t obj_name = \
312
- {{&mp_type_fun_builtin_1}, .fun._1 = fun_name}
313
- #define MP_DEFINE_CONST_FUN_OBJ_2 (obj_name , fun_name ) \
314
- const mp_obj_fun_builtin_fixed_t obj_name = \
315
- {{&mp_type_fun_builtin_2}, .fun._2 = fun_name}
316
- #define MP_DEFINE_CONST_FUN_OBJ_3 (obj_name , fun_name ) \
317
- const mp_obj_fun_builtin_fixed_t obj_name = \
318
- {{&mp_type_fun_builtin_3}, .fun._3 = fun_name}
319
- #define MP_DEFINE_CONST_FUN_OBJ_VAR (obj_name , n_args_min , fun_name ) \
320
- const mp_obj_fun_builtin_var_t obj_name = \
321
- {{&mp_type_fun_builtin_var}, false, n_args_min, MP_OBJ_FUN_ARGS_MAX, .fun.var = fun_name}
322
- #define MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (obj_name , n_args_min , n_args_max , fun_name ) \
323
- const mp_obj_fun_builtin_var_t obj_name = \
324
- {{&mp_type_fun_builtin_var}, false, n_args_min, n_args_max, .fun.var = fun_name}
325
- #define MP_DEFINE_CONST_FUN_OBJ_KW (obj_name , n_args_min , fun_name ) \
326
- const mp_obj_fun_builtin_var_t obj_name = \
327
- {{&mp_type_fun_builtin_var}, true, n_args_min, MP_OBJ_FUN_ARGS_MAX, .fun.kw = fun_name}
328
- #endif
303
+ const mp_obj_fun_builtin_kw_t obj_name = \
304
+ {{&mp_type_fun_builtin_var}, true, n_args_min, MP_OBJ_FUN_ARGS_MAX, fun_name}
329
305
330
306
// These macros are used to define constant map/dict objects
331
307
// You can put "static" in front of the definition to make it local
@@ -805,28 +781,44 @@ void mp_obj_slice_get(mp_obj_t self_in, mp_obj_t *start, mp_obj_t *stop, mp_obj_
805
781
806
782
// functions
807
783
808
- typedef struct _mp_obj_fun_builtin_fixed_t {
784
+ typedef struct _mp_obj_fun_builtin_fixed0_t {
809
785
mp_obj_base_t base ;
810
- union {
811
- mp_fun_0_t _0 ;
812
- mp_fun_1_t _1 ;
813
- mp_fun_2_t _2 ;
814
- mp_fun_3_t _3 ;
815
- } fun ;
816
- } mp_obj_fun_builtin_fixed_t ;
786
+ mp_fun_0_t fun ;
787
+ } mp_obj_fun_builtin_fixed0_t ;
788
+
789
+ typedef struct _mp_obj_fun_builtin_fixed1_t {
790
+ mp_obj_base_t base ;
791
+ mp_fun_1_t fun ;
792
+ } mp_obj_fun_builtin_fixed1_t ;
793
+
794
+ typedef struct _mp_obj_fun_builtin_fixed2_t {
795
+ mp_obj_base_t base ;
796
+ mp_fun_2_t fun ;
797
+ } mp_obj_fun_builtin_fixed2_t ;
798
+
799
+ typedef struct _mp_obj_fun_builtin_fixed3_t {
800
+ mp_obj_base_t base ;
801
+ mp_fun_3_t fun ;
802
+ } mp_obj_fun_builtin_fixed3_t ;
817
803
818
804
#define MP_OBJ_FUN_ARGS_MAX (0xffff) // to set maximum value in n_args_max below
805
+
819
806
typedef struct _mp_obj_fun_builtin_var_t {
820
807
mp_obj_base_t base ;
821
808
bool is_kw : 1 ;
822
809
mp_uint_t n_args_min : 15 ; // inclusive
823
810
mp_uint_t n_args_max : 16 ; // inclusive
824
- union {
825
- mp_fun_var_t var ;
826
- mp_fun_kw_t kw ;
827
- } fun ;
811
+ mp_fun_var_t fun ;
828
812
} mp_obj_fun_builtin_var_t ;
829
813
814
+ typedef struct _mp_obj_fun_builtin_kw_t {
815
+ mp_obj_base_t base ;
816
+ bool is_kw : 1 ;
817
+ mp_uint_t n_args_min : 15 ; // inclusive
818
+ mp_uint_t n_args_max : 16 ; // inclusive
819
+ mp_fun_kw_t fun ;
820
+ } mp_obj_fun_builtin_kw_t ;
821
+
830
822
qstr mp_obj_fun_get_name (mp_const_obj_t fun );
831
823
qstr mp_obj_code_get_name (const byte * code_info );
832
824
0 commit comments