@@ -710,14 +710,14 @@ def register_int_ptr_type(convertor, *types):
710710#define LV_OBJ_T {obj_type}
711711
712712typedef struct mp_lv_obj_type_t {{
713- mp_obj_type_t mp_obj_type;
713+ mp_obj_full_type_t mp_obj_type;
714714 const lv_obj_class_t *lv_obj_class;
715715}} mp_lv_obj_type_t;
716716
717717STATIC const mp_lv_obj_type_t mp_lv_{base_obj}_type;
718718STATIC const mp_lv_obj_type_t *mp_lv_obj_types[];
719719
720- STATIC inline const mp_obj_type_t *get_BaseObj_type()
720+ STATIC inline const mp_obj_full_type_t *get_BaseObj_type()
721721{{
722722 return &mp_lv_{base_obj}_type.mp_obj_type;
723723}}
@@ -744,6 +744,8 @@ def register_int_ptr_type(convertor, *types):
744744#define GENMPY_UNUSED
745745#endif // __GNUC__
746746#endif // GENMPY_UNUSED
747+
748+ #define MP_DEFINE_CONST_OBJ_FULL_TYPE(...) MP_DEFINE_CONST_OBJ_TYPE_EXPAND(MP_DEFINE_CONST_OBJ_TYPE_NARGS(__VA_ARGS__, _INV, 12, _INV, 11, _INV, 10, _INV, 9, _INV, 8, _INV, 7, _INV, 6, _INV, 5, _INV, 4, _INV, 3, _INV, 2, _INV, 1, _INV, 0)(mp_obj_full_type_t, __VA_ARGS__))
747749
748750// Custom function mp object
749751
@@ -759,23 +761,23 @@ def register_int_ptr_type(convertor, *types):
759761STATIC mp_obj_t lv_fun_builtin_var_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args);
760762STATIC mp_int_t mp_func_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags);
761763
762- GENMPY_UNUSED STATIC const mp_obj_type_t mp_lv_type_fun_builtin_var = {
763- { &mp_type_type } ,
764- .flags = MP_TYPE_FLAG_BINDS_SELF | MP_TYPE_FLAG_BUILTIN_FUN ,
765- .name = MP_QSTR_function ,
766- . call = lv_fun_builtin_var_call,
767- . unary_op = mp_generic_unary_op,
768- .buffer_p = { .get_buffer = mp_func_get_buffer }
769- } ;
764+ GENMPY_UNUSED STATIC MP_DEFINE_CONST_OBJ_TYPE(
765+ mp_lv_type_fun_builtin_var ,
766+ MP_QSTR_function ,
767+ MP_TYPE_FLAG_BINDS_SELF | MP_TYPE_FLAG_BUILTIN_FUN ,
768+ call, lv_fun_builtin_var_call,
769+ unary_op, mp_generic_unary_op,
770+ buffer, mp_func_get_buffer
771+ ) ;
770772
771- GENMPY_UNUSED STATIC const mp_obj_type_t mp_lv_type_fun_builtin_static_var = {
772- { &mp_type_type } ,
773- .flags = MP_TYPE_FLAG_BUILTIN_FUN ,
774- .name = MP_QSTR_function ,
775- . call = lv_fun_builtin_var_call,
776- . unary_op = mp_generic_unary_op,
777- .buffer_p = { .get_buffer = mp_func_get_buffer }
778- } ;
773+ GENMPY_UNUSED STATIC MP_DEFINE_CONST_OBJ_TYPE(
774+ mp_lv_type_fun_builtin_static_var ,
775+ MP_QSTR_function ,
776+ MP_TYPE_FLAG_BUILTIN_FUN ,
777+ call, lv_fun_builtin_var_call,
778+ unary_op, mp_generic_unary_op,
779+ buffer, mp_func_get_buffer
780+ ) ;
779781
780782STATIC mp_obj_t lv_fun_builtin_var_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
781783 assert(MP_OBJ_IS_TYPE(self_in, &mp_lv_type_fun_builtin_var) ||
@@ -829,11 +831,11 @@ def register_int_ptr_type(convertor, *types):
829831 const mp_obj_type_t *native_type = ((mp_obj_base_t*)mp_obj)->type;
830832 if (native_type == NULL)
831833 return NULL;
832- if (native_type-> parent == NULL ||
833- (native_type->buffer_p.get_buffer == mp_blob_get_buffer) ||
834- (native_type->buffer_p.get_buffer == mp_lv_obj_get_buffer))
834+ if (MP_OBJ_TYPE_GET_SLOT_OR_NULL( native_type, parent) == NULL ||
835+ (MP_OBJ_TYPE_GET_SLOT_OR_NULL( native_type, buffer) == mp_blob_get_buffer) ||
836+ (MP_OBJ_TYPE_GET_SLOT_OR_NULL( native_type, buffer) == mp_lv_obj_get_buffer))
835837 return mp_obj;
836- while (native_type-> parent) native_type = native_type-> parent;
838+ while (MP_OBJ_TYPE_GET_SLOT_OR_NULL( native_type, parent)) native_type = MP_OBJ_TYPE_GET_SLOT( native_type, parent) ;
837839 return mp_obj_cast_to_native_base(mp_obj, MP_OBJ_FROM_PTR(native_type));
838840}
839841
@@ -848,15 +850,15 @@ def register_int_ptr_type(convertor, *types):
848850STATIC mp_obj_t cast(mp_obj_t mp_obj, const mp_obj_type_t *mp_type)
849851{
850852 mp_obj_t res = NULL;
851- if (mp_obj == mp_const_none && mp_type-> make_new == &make_new_lv_struct) {
853+ if (mp_obj == mp_const_none && MP_OBJ_TYPE_GET_SLOT_OR_NULL( mp_type, make_new) == &make_new_lv_struct) {
852854 res = MP_OBJ_FROM_PTR(&mp_lv_null_obj);
853855 } else if (MP_OBJ_IS_OBJ(mp_obj)) {
854856 res = get_native_obj(mp_obj);
855857 if (res){
856858 const mp_obj_type_t *res_type = ((mp_obj_base_t*)res)->type;
857859 if (res_type != mp_type){
858860 if (res_type == &mp_type_dict &&
859- mp_type-> make_new == &make_new_lv_struct)
861+ MP_OBJ_TYPE_GET_SLOT_OR_NULL( mp_type, make_new) == &make_new_lv_struct)
860862 res = dict_to_struct(res, mp_type);
861863 else res = NULL;
862864 }
@@ -883,7 +885,7 @@ def register_int_ptr_type(convertor, *types):
883885{
884886 if (mp_obj == NULL || mp_obj == mp_const_none) return NULL;
885887 mp_obj_t native_obj = get_native_obj(mp_obj);
886- if (mp_obj_get_type(native_obj)->buffer_p.get_buffer != mp_lv_obj_get_buffer)
888+ if (MP_OBJ_TYPE_GET_SLOT_OR_NULL( mp_obj_get_type(native_obj), buffer) != mp_lv_obj_get_buffer)
887889 return NULL;
888890 mp_lv_obj_t *mp_lv_obj = MP_OBJ_TO_PTR(native_obj);
889891 if (mp_lv_obj->lv_obj == NULL) {
@@ -906,7 +908,7 @@ def register_int_ptr_type(convertor, *types):
906908 return mp_lv_obj->callbacks;
907909}
908910
909- STATIC inline const mp_obj_type_t *get_BaseObj_type();
911+ STATIC inline const mp_obj_full_type_t *get_BaseObj_type();
910912
911913STATIC void mp_lv_delete_cb(lv_event_t * e)
912914{
@@ -926,7 +928,7 @@ def register_int_ptr_type(convertor, *types):
926928 if (!self)
927929 {
928930 // Find the object type
929- const mp_obj_type_t *mp_obj_type = get_BaseObj_type();
931+ const mp_obj_full_type_t *mp_obj_type = get_BaseObj_type();
930932 const lv_obj_class_t *lv_obj_class = lv_obj_get_class(lv_obj);
931933 const mp_lv_obj_type_t **iter = &mp_lv_obj_types[0];
932934 for (; *iter; iter++) {
@@ -939,7 +941,7 @@ def register_int_ptr_type(convertor, *types):
939941 // Create the MP object
940942 self = m_new_obj(mp_lv_obj_t);
941943 *self = (mp_lv_obj_t){
942- .base = {mp_obj_type},
944+ .base = {(const mp_obj_type_t *) mp_obj_type},
943945 .lv_obj = lv_obj,
944946 .callbacks = NULL,
945947 };
@@ -1028,6 +1030,7 @@ def register_int_ptr_type(convertor, *types):
10281030
10291031// Register LVGL root pointers
10301032MP_REGISTER_ROOT_POINTER(struct lvgl_root_pointers_t *lvgl_root_pointers);
1033+ MP_REGISTER_ROOT_POINTER(void *mp_lv_user_data);
10311034
10321035#else // LV_OBJ_T
10331036
@@ -1069,7 +1072,7 @@ def register_int_ptr_type(convertor, *types):
10691072{
10701073 if (mp_obj == NULL || mp_obj == mp_const_none) return NULL;
10711074 mp_obj_t native_obj = get_native_obj(mp_obj);
1072- if ( (!MP_OBJ_IS_OBJ(native_obj)) || (mp_obj_get_type(native_obj)-> make_new != &make_new_lv_struct) ) nlr_raise(
1075+ if ( (!MP_OBJ_IS_OBJ(native_obj)) || (MP_OBJ_TYPE_GET_SLOT_OR_NULL( mp_obj_get_type(native_obj), make_new) != &make_new_lv_struct) ) nlr_raise(
10731076 mp_obj_new_exception_msg(
10741077 &mp_type_SyntaxError, MP_ERROR_TEXT("Expected Struct object!")));
10751078 mp_lv_struct_t *mp_lv_struct = MP_OBJ_TO_PTR(native_obj);
@@ -1078,7 +1081,7 @@ def register_int_ptr_type(convertor, *types):
10781081
10791082STATIC inline size_t get_lv_struct_size(const mp_obj_type_t *type)
10801083{
1081- mp_obj_t size_obj = mp_obj_dict_get(type-> locals_dict, MP_OBJ_NEW_QSTR(MP_QSTR___SIZE__));
1084+ mp_obj_t size_obj = mp_obj_dict_get(MP_OBJ_TYPE_GET_SLOT( type, locals_dict) , MP_OBJ_NEW_QSTR(MP_QSTR___SIZE__));
10821085 return (size_t)mp_obj_get_int(size_obj);
10831086}
10841087
@@ -1088,7 +1091,7 @@ def register_int_ptr_type(convertor, *types):
10881091 size_t n_kw,
10891092 const mp_obj_t *args)
10901093{
1091- if ((!MP_OBJ_IS_TYPE(type, &mp_type_type)) || type-> make_new != &make_new_lv_struct)
1094+ if ((!MP_OBJ_IS_TYPE(type, &mp_type_type)) || MP_OBJ_TYPE_GET_SLOT_OR_NULL( type, make_new) != &make_new_lv_struct)
10921095 nlr_raise(
10931096 mp_obj_new_exception_msg(
10941097 &mp_type_SyntaxError, MP_ERROR_TEXT("Argument is not a struct type!")));
@@ -1187,21 +1190,21 @@ def register_int_ptr_type(convertor, *types):
11871190STATIC void call_parent_methods(mp_obj_t obj, qstr attr, mp_obj_t *dest)
11881191{
11891192 const mp_obj_type_t *type = mp_obj_get_type(obj);
1190- while (type->locals_dict != NULL ) {
1193+ while (MP_OBJ_TYPE_HAS_SLOT( type, locals_dict) ) {
11911194 // generic method lookup
11921195 // this is a lookup in the object (ie not class or type)
1193- assert(type-> locals_dict->base.type == &mp_type_dict); // MicroPython restriction, for now
1194- mp_map_t *locals_map = &type-> locals_dict->map;
1196+ assert(MP_OBJ_TYPE_GET_SLOT( type, locals_dict) ->base.type == &mp_type_dict); // MicroPython restriction, for now
1197+ mp_map_t *locals_map = &MP_OBJ_TYPE_GET_SLOT( type, locals_dict) ->map;
11951198 mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP);
11961199 if (elem != NULL) {
11971200 mp_convert_member_lookup(obj, type, elem->value, dest);
11981201 break;
11991202 }
1200- if (type-> parent == NULL) {
1203+ if (MP_OBJ_TYPE_GET_SLOT_OR_NULL( type, parent) == NULL) {
12011204 break;
12021205 }
12031206 // search parents
1204- type = type-> parent;
1207+ type = MP_OBJ_TYPE_GET_SLOT( type, parent) ;
12051208 }
12061209}
12071210
@@ -1218,7 +1221,7 @@ def register_int_ptr_type(convertor, *types):
12181221 mp_obj_t value = map->table[i].value;
12191222 if (key != MP_OBJ_NULL) {
12201223 mp_obj_t dest[] = {MP_OBJ_SENTINEL, value};
1221- type-> attr(mp_struct, mp_obj_str_get_qstr(key), dest);
1224+ MP_OBJ_TYPE_GET_SLOT( type, attr) (mp_struct, mp_obj_str_get_qstr(key), dest);
12221225 if (dest[0]) nlr_raise(
12231226 mp_obj_new_exception_msg_varg(
12241227 &mp_type_SyntaxError, MP_ERROR_TEXT("Cannot set field %s on struct %s!"), qstr_str(mp_obj_str_get_qstr(key)), qstr_str(type->name)));
@@ -1318,15 +1321,15 @@ def register_int_ptr_type(convertor, *types):
13181321
13191322STATIC MP_DEFINE_CONST_DICT(mp_blob_locals_dict, mp_blob_locals_dict_table);
13201323
1321- STATIC const mp_obj_type_t mp_blob_type = {
1322- { &mp_type_type } ,
1323- .name = MP_QSTR_Blob,
1324- .binary_op = lv_struct_binary_op ,
1325- .print = mp_blob_print ,
1326- //.make_new = make_new_blob ,
1327- . locals_dict = (mp_obj_dict_t*) &mp_blob_locals_dict,
1328- .buffer_p = { .get_buffer = mp_blob_get_buffer }
1329- } ;
1324+ STATIC MP_DEFINE_CONST_OBJ_TYPE(
1325+ mp_blob_type ,
1326+ MP_QSTR_Blob,
1327+ MP_TYPE_FLAG_NONE ,
1328+ binary_op, lv_struct_binary_op ,
1329+ print, mp_blob_print ,
1330+ locals_dict, &mp_blob_locals_dict,
1331+ buffer, mp_blob_get_buffer
1332+ ) ;
13301333
13311334STATIC const mp_lv_struct_t mp_lv_null_obj = { {&mp_blob_type}, NULL };
13321335
@@ -1536,25 +1539,27 @@ def register_int_ptr_type(convertor, *types):
15361539
15371540STATIC MP_DEFINE_CONST_DICT(mp_base_struct_locals_dict, mp_base_struct_locals_dict_table);
15381541
1539- STATIC const mp_obj_type_t mp_lv_base_struct_type = {
1540- { &mp_type_type },
1541- .name = MP_QSTR_Struct,
1542- .binary_op = lv_struct_binary_op,
1543- .subscr = lv_struct_subscr,
1544- .locals_dict = (mp_obj_dict_t*)&mp_base_struct_locals_dict,
1545- .buffer_p = { .get_buffer = mp_blob_get_buffer }
1546- };
1542+ MP_DEFINE_CONST_OBJ_TYPE(
1543+ mp_lv_base_struct_type,
1544+ MP_QSTR_Struct,
1545+ MP_TYPE_FLAG_NONE,
1546+ binary_op, lv_struct_binary_op,
1547+ subscr, lv_struct_subscr,
1548+ buffer, mp_blob_get_buffer,
1549+ locals_dict, &mp_base_struct_locals_dict
1550+ );
15471551
1548- STATIC const mp_obj_type_t mp_lv_array_type = {
1549- { &mp_type_type },
1550- .name = MP_QSTR_C_Array,
1551- .print = mp_lv_array_print,
1552- .make_new = NULL, // TODO: provide constructor
1553- .binary_op = lv_struct_binary_op,
1554- .subscr = lv_array_subscr,
1555- .buffer_p = { .get_buffer = mp_blob_get_buffer },
1556- .locals_dict = (mp_obj_dict_t*)&mp_base_struct_locals_dict,
1557- };
1552+ // TODO: provide constructor
1553+ MP_DEFINE_CONST_OBJ_TYPE(
1554+ mp_lv_array_type,
1555+ MP_QSTR_C_Array,
1556+ MP_TYPE_FLAG_NONE,
1557+ print, mp_lv_array_print,
1558+ binary_op, lv_struct_binary_op,
1559+ subscr, lv_array_subscr,
1560+ buffer, mp_blob_get_buffer,
1561+ locals_dict, &mp_base_struct_locals_dict
1562+ );
15581563
15591564GENMPY_UNUSED STATIC mp_obj_t mp_array_from_ptr(void *lv_arr, size_t element_size, bool is_signed)
15601565{
@@ -1937,18 +1942,19 @@ def try_generate_struct(struct_name, struct):
19371942
19381943STATIC const mp_obj_dict_t mp_{sanitized_struct_name}_locals_dict;
19391944
1940- STATIC const mp_obj_type_t mp_{sanitized_struct_name}_type = {{
1941- {{ &mp_type_type }},
1942- .name = MP_QSTR_{sanitized_struct_name},
1943- .print = mp_{sanitized_struct_name}_print,
1944- .make_new = make_new_lv_struct,
1945- .binary_op = lv_struct_binary_op,
1946- .subscr = lv_struct_subscr,
1947- .attr = mp_{sanitized_struct_name}_attr,
1948- .locals_dict = (mp_obj_dict_t*)&mp_{sanitized_struct_name}_locals_dict,
1949- .buffer_p = {{ .get_buffer = mp_blob_get_buffer }},
1950- .parent = &mp_lv_base_struct_type
1951- }};
1945+ STATIC MP_DEFINE_CONST_OBJ_TYPE(
1946+ mp_{sanitized_struct_name}_type,
1947+ MP_QSTR_{sanitized_struct_name},
1948+ MP_TYPE_FLAG_NONE,
1949+ print, mp_{sanitized_struct_name}_print,
1950+ make_new, make_new_lv_struct,
1951+ binary_op, lv_struct_binary_op,
1952+ subscr, lv_struct_subscr,
1953+ attr, mp_{sanitized_struct_name}_attr,
1954+ locals_dict, &mp_{sanitized_struct_name}_locals_dict,
1955+ buffer, mp_blob_get_buffer,
1956+ parent, &mp_lv_base_struct_type
1957+ );
19521958
19531959STATIC inline const mp_obj_type_t *get_mp_{sanitized_struct_name}_type()
19541960{{
@@ -2578,7 +2584,7 @@ def gen_obj(obj_name):
25782584 try :
25792585 gen_mp_func (ctor_func , obj_name )
25802586 except MissingConversionException as exp :
2581- gen_func_error (cctor_func , exp )
2587+ gen_func_error (ctor_func , exp )
25822588
25832589 # print([method.name for method in methods])
25842590 ctor = """
@@ -2616,20 +2622,23 @@ def gen_obj(obj_name):
26162622
26172623{ctor}
26182624
2625+ STATIC MP_DEFINE_CONST_OBJ_FULL_TYPE(
2626+ mp_lv_{obj}_type_base,
2627+ MP_QSTR_{obj},
2628+ MP_TYPE_FLAG_NONE,
2629+ print, {obj}_print,
2630+ {make_new}
2631+ {binary_op}
2632+ attr, call_parent_methods,
2633+ {buffer}
2634+ {parent}
2635+ locals_dict, &{obj}_locals_dict
2636+ );
2637+
26192638STATIC const mp_lv_obj_type_t mp_lv_{obj}_type = {{
2620- {{
2621- {{ &mp_type_type }},
2622- .name = MP_QSTR_{obj},
2623- .print = {obj}_print,
2624- {make_new}
2625- {binary_op}
2626- .attr = call_parent_methods,
2627- .locals_dict = (mp_obj_dict_t*)&{obj}_locals_dict,
2628- {buffer_p}
2629- .parent = {parent}
2630- }},
2639+ .mp_obj_type = mp_lv_{obj}_type_base,
26312640#ifdef LV_OBJ_T
2632- {lv_class}
2641+ .lv_obj_class = {lv_class}
26332642#endif
26342643}};
26352644 """ .format (
@@ -2638,10 +2647,10 @@ def gen_obj(obj_name):
26382647 base_class = '&mp_%s_type' % base_obj_name if should_add_base_methods else 'NULL' ,
26392648 locals_dict_entries = ",\n " .join (gen_obj_methods (obj_name )),
26402649 ctor = ctor .format (obj = obj_name , ctor_name = ctor_func .name ) if has_ctor (obj_name ) else '' ,
2641- make_new = '. make_new = %s_make_new,' % obj_name if is_obj else '' ,
2642- binary_op = '. binary_op = mp_lv_obj_binary_op,' if is_obj else '' ,
2643- buffer_p = '.buffer_p = { .get_buffer = mp_lv_obj_get_buffer } ,' if is_obj else '' ,
2644- parent = '&mp_lv_%s_type.mp_obj_type' % parent_obj_names [obj_name ] if obj_name in parent_obj_names and parent_obj_names [obj_name ] else 'NULL ' ,
2650+ make_new = 'make_new, %s_make_new,' % obj_name if is_obj else '' ,
2651+ binary_op = 'binary_op, mp_lv_obj_binary_op,' if is_obj else '' ,
2652+ buffer = 'buffer, mp_lv_obj_get_buffer,' if is_obj else '' ,
2653+ parent = 'parent, &mp_lv_%s_type.mp_obj_type, ' % parent_obj_names [obj_name ] if obj_name in parent_obj_names and parent_obj_names [obj_name ] else '' ,
26452654 lv_class = '&lv_%s_class' % obj_name if is_obj else 'NULL' ,
26462655 ))
26472656
0 commit comments