Skip to content

Commit 449c4ff

Browse files
committed
Add support for micropython > v1.19.1
1 parent b0ac8b6 commit 449c4ff

File tree

3 files changed

+110
-101
lines changed

3 files changed

+110
-101
lines changed

driver/include/common.h

+7-5
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ STATIC mp_int_t mp_ptr_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, m
3434
#define PTR_OBJ(ptr_global) ptr_global ## _obj
3535

3636
#define DEFINE_PTR_OBJ_TYPE(ptr_obj_type, ptr_type_qstr)\
37-
STATIC const mp_obj_type_t ptr_obj_type = {\
38-
{ &mp_type_type },\
39-
.name = ptr_type_qstr,\
40-
.buffer_p = { .get_buffer = mp_ptr_get_buffer }\
41-
}
37+
STATIC MP_DEFINE_CONST_OBJ_TYPE(\
38+
ptr_obj_type,\
39+
ptr_type_qstr,\
40+
MP_TYPE_FLAG_NONE,\
41+
buffer, mp_ptr_get_buffer\
42+
);
43+
4244

4345
#define DEFINE_PTR_OBJ(ptr_global)\
4446
DEFINE_PTR_OBJ_TYPE(ptr_global ## _type, MP_QSTR_ ## ptr_global);\

gen/gen_mpy.py

+98-92
Original file line numberDiff line numberDiff line change
@@ -707,14 +707,14 @@ def register_int_ptr_type(convertor, *types):
707707
#define LV_OBJ_T {obj_type}
708708
709709
typedef struct mp_lv_obj_type_t {{
710-
mp_obj_type_t mp_obj_type;
710+
mp_obj_full_type_t mp_obj_type;
711711
const lv_obj_class_t *lv_obj_class;
712712
}} mp_lv_obj_type_t;
713713
714714
STATIC const mp_lv_obj_type_t mp_lv_{base_obj}_type;
715715
STATIC const mp_lv_obj_type_t *mp_lv_obj_types[];
716716
717-
STATIC inline const mp_obj_type_t *get_BaseObj_type()
717+
STATIC inline const mp_obj_full_type_t *get_BaseObj_type()
718718
{{
719719
return &mp_lv_{base_obj}_type.mp_obj_type;
720720
}}
@@ -756,23 +756,23 @@ def register_int_ptr_type(convertor, *types):
756756
STATIC 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);
757757
STATIC mp_int_t mp_func_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags);
758758
759-
GENMPY_UNUSED STATIC const mp_obj_type_t mp_lv_type_fun_builtin_var = {
760-
{ &mp_type_type },
761-
.flags = MP_TYPE_FLAG_BINDS_SELF | MP_TYPE_FLAG_BUILTIN_FUN,
762-
.name = MP_QSTR_function,
763-
.call = lv_fun_builtin_var_call,
764-
.unary_op = mp_generic_unary_op,
765-
.buffer_p = { .get_buffer = mp_func_get_buffer }
766-
};
759+
GENMPY_UNUSED STATIC MP_DEFINE_CONST_OBJ_TYPE(
760+
mp_lv_type_fun_builtin_var,
761+
MP_QSTR_function,
762+
MP_TYPE_FLAG_BINDS_SELF | MP_TYPE_FLAG_BUILTIN_FUN,
763+
call, lv_fun_builtin_var_call,
764+
unary_op, mp_generic_unary_op,
765+
buffer, mp_func_get_buffer
766+
);
767767
768-
GENMPY_UNUSED STATIC const mp_obj_type_t mp_lv_type_fun_builtin_static_var = {
769-
{ &mp_type_type },
770-
.flags = MP_TYPE_FLAG_BUILTIN_FUN,
771-
.name = MP_QSTR_function,
772-
.call = lv_fun_builtin_var_call,
773-
.unary_op = mp_generic_unary_op,
774-
.buffer_p = { .get_buffer = mp_func_get_buffer }
775-
};
768+
GENMPY_UNUSED STATIC MP_DEFINE_CONST_OBJ_TYPE(
769+
mp_lv_type_fun_builtin_static_var,
770+
MP_QSTR_function,
771+
MP_TYPE_FLAG_BUILTIN_FUN,
772+
call, lv_fun_builtin_var_call,
773+
unary_op, mp_generic_unary_op,
774+
buffer, mp_func_get_buffer
775+
);
776776
777777
STATIC 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) {
778778
assert(MP_OBJ_IS_TYPE(self_in, &mp_lv_type_fun_builtin_var) ||
@@ -826,11 +826,11 @@ def register_int_ptr_type(convertor, *types):
826826
const mp_obj_type_t *native_type = ((mp_obj_base_t*)mp_obj)->type;
827827
if (native_type == NULL)
828828
return NULL;
829-
if (native_type->parent == NULL ||
830-
(native_type->buffer_p.get_buffer == mp_blob_get_buffer) ||
831-
(native_type->buffer_p.get_buffer == mp_lv_obj_get_buffer))
829+
if (MP_OBJ_TYPE_GET_SLOT_OR_NULL(native_type, parent) == NULL ||
830+
(MP_OBJ_TYPE_GET_SLOT_OR_NULL(native_type, buffer) == mp_blob_get_buffer) ||
831+
(MP_OBJ_TYPE_GET_SLOT_OR_NULL(native_type, buffer) == mp_lv_obj_get_buffer))
832832
return mp_obj;
833-
while (native_type->parent) native_type = native_type->parent;
833+
while (MP_OBJ_TYPE_GET_SLOT_OR_NULL(native_type, parent)) native_type = MP_OBJ_TYPE_GET_SLOT(native_type, parent);
834834
return mp_obj_cast_to_native_base(mp_obj, MP_OBJ_FROM_PTR(native_type));
835835
}
836836
@@ -845,15 +845,15 @@ def register_int_ptr_type(convertor, *types):
845845
STATIC mp_obj_t cast(mp_obj_t mp_obj, const mp_obj_type_t *mp_type)
846846
{
847847
mp_obj_t res = NULL;
848-
if (mp_obj == mp_const_none && mp_type->make_new == &make_new_lv_struct) {
848+
if (mp_obj == mp_const_none && MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_type, make_new) == &make_new_lv_struct) {
849849
res = MP_OBJ_FROM_PTR(&mp_lv_null_obj);
850850
} else if (MP_OBJ_IS_OBJ(mp_obj)) {
851851
res = get_native_obj(mp_obj);
852852
if (res){
853853
const mp_obj_type_t *res_type = ((mp_obj_base_t*)res)->type;
854854
if (res_type != mp_type){
855855
if (res_type == &mp_type_dict &&
856-
mp_type->make_new == &make_new_lv_struct)
856+
MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_type, make_new) == &make_new_lv_struct)
857857
res = dict_to_struct(res, mp_type);
858858
else res = NULL;
859859
}
@@ -880,7 +880,7 @@ def register_int_ptr_type(convertor, *types):
880880
{
881881
if (mp_obj == NULL || mp_obj == mp_const_none) return NULL;
882882
mp_obj_t native_obj = get_native_obj(mp_obj);
883-
if (mp_obj_get_type(native_obj)->buffer_p.get_buffer != mp_lv_obj_get_buffer)
883+
if (MP_OBJ_TYPE_GET_SLOT_OR_NULL(mp_obj_get_type(native_obj), buffer) != mp_lv_obj_get_buffer)
884884
return NULL;
885885
mp_lv_obj_t *mp_lv_obj = MP_OBJ_TO_PTR(native_obj);
886886
if (mp_lv_obj->lv_obj == NULL) {
@@ -903,7 +903,7 @@ def register_int_ptr_type(convertor, *types):
903903
return mp_lv_obj->callbacks;
904904
}
905905
906-
STATIC inline const mp_obj_type_t *get_BaseObj_type();
906+
STATIC inline const mp_obj_full_type_t *get_BaseObj_type();
907907
908908
STATIC void mp_lv_delete_cb(lv_event_t * e)
909909
{
@@ -923,7 +923,7 @@ def register_int_ptr_type(convertor, *types):
923923
if (!self)
924924
{
925925
// Find the object type
926-
const mp_obj_type_t *mp_obj_type = get_BaseObj_type();
926+
const mp_obj_full_type_t *mp_obj_type = get_BaseObj_type();
927927
const lv_obj_class_t *lv_obj_class = lv_obj_get_class(lv_obj);
928928
const mp_lv_obj_type_t **iter = &mp_lv_obj_types[0];
929929
for (; *iter; iter++) {
@@ -936,7 +936,7 @@ def register_int_ptr_type(convertor, *types):
936936
// Create the MP object
937937
self = m_new_obj(mp_lv_obj_t);
938938
*self = (mp_lv_obj_t){
939-
.base = {mp_obj_type},
939+
.base = {(const mp_obj_type_t *)mp_obj_type},
940940
.lv_obj = lv_obj,
941941
.callbacks = NULL,
942942
};
@@ -1026,7 +1026,7 @@ def register_int_ptr_type(convertor, *types):
10261026
#else // LV_OBJ_T
10271027
10281028
typedef struct mp_lv_obj_type_t {
1029-
mp_obj_type_t mp_obj_type;
1029+
mp_obj_full_type_t mp_obj_type;
10301030
} mp_lv_obj_type_t;
10311031
10321032
#endif
@@ -1063,7 +1063,7 @@ def register_int_ptr_type(convertor, *types):
10631063
{
10641064
if (mp_obj == NULL || mp_obj == mp_const_none) return NULL;
10651065
mp_obj_t native_obj = get_native_obj(mp_obj);
1066-
if ( (!MP_OBJ_IS_OBJ(native_obj)) || (mp_obj_get_type(native_obj)->make_new != &make_new_lv_struct) ) nlr_raise(
1066+
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(
10671067
mp_obj_new_exception_msg(
10681068
&mp_type_SyntaxError, MP_ERROR_TEXT("Expected Struct object!")));
10691069
mp_lv_struct_t *mp_lv_struct = MP_OBJ_TO_PTR(native_obj);
@@ -1072,7 +1072,7 @@ def register_int_ptr_type(convertor, *types):
10721072
10731073
STATIC inline size_t get_lv_struct_size(const mp_obj_type_t *type)
10741074
{
1075-
mp_obj_t size_obj = mp_obj_dict_get(type->locals_dict, MP_OBJ_NEW_QSTR(MP_QSTR___SIZE__));
1075+
mp_obj_t size_obj = mp_obj_dict_get(MP_OBJ_TYPE_GET_SLOT(type, locals_dict), MP_OBJ_NEW_QSTR(MP_QSTR___SIZE__));
10761076
return (size_t)mp_obj_get_int(size_obj);
10771077
}
10781078
@@ -1082,7 +1082,7 @@ def register_int_ptr_type(convertor, *types):
10821082
size_t n_kw,
10831083
const mp_obj_t *args)
10841084
{
1085-
if ((!MP_OBJ_IS_TYPE(type, &mp_type_type)) || type->make_new != &make_new_lv_struct)
1085+
if ((!MP_OBJ_IS_TYPE(type, &mp_type_type)) || MP_OBJ_TYPE_GET_SLOT_OR_NULL(type, make_new) != &make_new_lv_struct)
10861086
nlr_raise(
10871087
mp_obj_new_exception_msg(
10881088
&mp_type_SyntaxError, MP_ERROR_TEXT("Argument is not a struct type!")));
@@ -1181,21 +1181,21 @@ def register_int_ptr_type(convertor, *types):
11811181
STATIC void call_parent_methods(mp_obj_t obj, qstr attr, mp_obj_t *dest)
11821182
{
11831183
const mp_obj_type_t *type = mp_obj_get_type(obj);
1184-
while (type->locals_dict != NULL) {
1184+
while (MP_OBJ_TYPE_HAS_SLOT(type, locals_dict)) {
11851185
// generic method lookup
11861186
// this is a lookup in the object (ie not class or type)
1187-
assert(type->locals_dict->base.type == &mp_type_dict); // MicroPython restriction, for now
1188-
mp_map_t *locals_map = &type->locals_dict->map;
1187+
assert(MP_OBJ_TYPE_GET_SLOT(type, locals_dict)->base.type == &mp_type_dict); // MicroPython restriction, for now
1188+
mp_map_t *locals_map = &MP_OBJ_TYPE_GET_SLOT(type, locals_dict)->map;
11891189
mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP);
11901190
if (elem != NULL) {
11911191
mp_convert_member_lookup(obj, type, elem->value, dest);
11921192
break;
11931193
}
1194-
if (type->parent == NULL) {
1194+
if (MP_OBJ_TYPE_GET_SLOT_OR_NULL(type, parent) == NULL) {
11951195
break;
11961196
}
11971197
// search parents
1198-
type = type->parent;
1198+
type = MP_OBJ_TYPE_GET_SLOT(type, parent);
11991199
}
12001200
}
12011201
@@ -1212,7 +1212,7 @@ def register_int_ptr_type(convertor, *types):
12121212
mp_obj_t value = map->table[i].value;
12131213
if (key != MP_OBJ_NULL) {
12141214
mp_obj_t dest[] = {MP_OBJ_SENTINEL, value};
1215-
type->attr(mp_struct, mp_obj_str_get_qstr(key), dest);
1215+
MP_OBJ_TYPE_GET_SLOT(type, attr)(mp_struct, mp_obj_str_get_qstr(key), dest);
12161216
if (dest[0]) nlr_raise(
12171217
mp_obj_new_exception_msg_varg(
12181218
&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)));
@@ -1312,15 +1312,15 @@ def register_int_ptr_type(convertor, *types):
13121312
13131313
STATIC MP_DEFINE_CONST_DICT(mp_blob_locals_dict, mp_blob_locals_dict_table);
13141314
1315-
STATIC const mp_obj_type_t mp_blob_type = {
1316-
{ &mp_type_type },
1317-
.name = MP_QSTR_Blob,
1318-
.binary_op = lv_struct_binary_op,
1319-
.print = mp_blob_print,
1320-
//.make_new = make_new_blob,
1321-
.locals_dict = (mp_obj_dict_t*)&mp_blob_locals_dict,
1322-
.buffer_p = { .get_buffer = mp_blob_get_buffer }
1323-
};
1315+
STATIC MP_DEFINE_CONST_OBJ_TYPE(
1316+
mp_blob_type,
1317+
MP_QSTR_Blob,
1318+
MP_TYPE_FLAG_NONE,
1319+
binary_op, lv_struct_binary_op,
1320+
print, mp_blob_print,
1321+
locals_dict, &mp_blob_locals_dict,
1322+
buffer, mp_blob_get_buffer
1323+
);
13241324
13251325
STATIC const mp_lv_struct_t mp_lv_null_obj = { {&mp_blob_type}, NULL };
13261326
@@ -1512,25 +1512,27 @@ def register_int_ptr_type(convertor, *types):
15121512
15131513
STATIC MP_DEFINE_CONST_DICT(mp_base_struct_locals_dict, mp_base_struct_locals_dict_table);
15141514
1515-
STATIC const mp_obj_type_t mp_lv_base_struct_type = {
1516-
{ &mp_type_type },
1517-
.name = MP_QSTR_Struct,
1518-
.binary_op = lv_struct_binary_op,
1519-
.subscr = lv_struct_subscr,
1520-
.locals_dict = (mp_obj_dict_t*)&mp_base_struct_locals_dict,
1521-
.buffer_p = { .get_buffer = mp_blob_get_buffer }
1522-
};
1515+
MP_DEFINE_CONST_OBJ_TYPE(
1516+
mp_lv_base_struct_type,
1517+
MP_QSTR_Struct,
1518+
MP_TYPE_FLAG_NONE,
1519+
binary_op, lv_struct_binary_op,
1520+
subscr, lv_struct_subscr,
1521+
buffer, mp_blob_get_buffer,
1522+
locals_dict, &mp_base_struct_locals_dict
1523+
);
15231524
1524-
STATIC const mp_obj_type_t mp_lv_array_type = {
1525-
{ &mp_type_type },
1526-
.name = MP_QSTR_C_Array,
1527-
.print = mp_lv_array_print,
1528-
.make_new = NULL, // TODO: provide constructor
1529-
.binary_op = lv_struct_binary_op,
1530-
.subscr = lv_array_subscr,
1531-
.buffer_p = { .get_buffer = mp_blob_get_buffer },
1532-
.locals_dict = (mp_obj_dict_t*)&mp_base_struct_locals_dict,
1533-
};
1525+
// TODO: provide constructor
1526+
MP_DEFINE_CONST_OBJ_TYPE(
1527+
mp_lv_array_type,
1528+
MP_QSTR_C_Array,
1529+
MP_TYPE_FLAG_NONE,
1530+
print, mp_lv_array_print,
1531+
binary_op, lv_struct_binary_op,
1532+
subscr, lv_array_subscr,
1533+
buffer, mp_blob_get_buffer,
1534+
locals_dict, &mp_base_struct_locals_dict
1535+
);
15341536
15351537
GENMPY_UNUSED STATIC mp_obj_t mp_array_from_ptr(void *lv_arr, size_t element_size, bool is_signed)
15361538
{
@@ -1894,18 +1896,19 @@ def try_generate_struct(struct_name, struct):
18941896
18951897
STATIC const mp_obj_dict_t mp_{sanitized_struct_name}_locals_dict;
18961898
1897-
STATIC const mp_obj_type_t mp_{sanitized_struct_name}_type = {{
1898-
{{ &mp_type_type }},
1899-
.name = MP_QSTR_{sanitized_struct_name},
1900-
.print = mp_{sanitized_struct_name}_print,
1901-
.make_new = make_new_lv_struct,
1902-
.binary_op = lv_struct_binary_op,
1903-
.subscr = lv_struct_subscr,
1904-
.attr = mp_{sanitized_struct_name}_attr,
1905-
.locals_dict = (mp_obj_dict_t*)&mp_{sanitized_struct_name}_locals_dict,
1906-
.buffer_p = {{ .get_buffer = mp_blob_get_buffer }},
1907-
.parent = &mp_lv_base_struct_type
1908-
}};
1899+
STATIC MP_DEFINE_CONST_OBJ_TYPE(
1900+
mp_{sanitized_struct_name}_type,
1901+
MP_QSTR_{sanitized_struct_name},
1902+
MP_TYPE_FLAG_NONE,
1903+
print, mp_{sanitized_struct_name}_print,
1904+
make_new, make_new_lv_struct,
1905+
binary_op, lv_struct_binary_op,
1906+
subscr, lv_struct_subscr,
1907+
attr, mp_{sanitized_struct_name}_attr,
1908+
locals_dict, &mp_{sanitized_struct_name}_locals_dict,
1909+
buffer, mp_blob_get_buffer,
1910+
parent, &mp_lv_base_struct_type
1911+
);
19091912
19101913
STATIC inline const mp_obj_type_t *get_mp_{sanitized_struct_name}_type()
19111914
{{
@@ -2558,20 +2561,23 @@ def gen_obj(obj_name):
25582561
25592562
{ctor}
25602563
2561-
STATIC const mp_lv_obj_type_t mp_lv_{obj}_type = {{
2562-
{{
2563-
{{ &mp_type_type }},
2564-
.name = MP_QSTR_{obj},
2565-
.print = {obj}_print,
2564+
STATIC MP_DEFINE_CONST_OBJ_FULL_TYPE(
2565+
mp_lv_{obj}_type_base,
2566+
MP_QSTR_{obj},
2567+
MP_TYPE_FLAG_NONE,
2568+
print, {obj}_print,
25662569
{make_new}
25672570
{binary_op}
2568-
.attr = call_parent_methods,
2569-
.locals_dict = (mp_obj_dict_t*)&{obj}_locals_dict,
2570-
{buffer_p}
2571-
.parent = {parent}
2572-
}},
2571+
attr, call_parent_methods,
2572+
{buffer}
2573+
{parent}
2574+
locals_dict, &{obj}_locals_dict
2575+
);
2576+
2577+
STATIC const mp_lv_obj_type_t mp_lv_{obj}_type = {{
2578+
.mp_obj_type = mp_lv_{obj}_type_base,
25732579
#ifdef LV_OBJ_T
2574-
{lv_class}
2580+
.lv_obj_class = {lv_class}
25752581
#endif
25762582
}};
25772583
""".format(
@@ -2580,10 +2586,10 @@ def gen_obj(obj_name):
25802586
base_class = '&mp_%s_type' % base_obj_name if should_add_base_methods else 'NULL',
25812587
locals_dict_entries = ",\n ".join(gen_obj_methods(obj_name)),
25822588
ctor = ctor.format(obj = obj_name, ctor_name = ctor_func.name) if has_ctor(obj_name) else '',
2583-
make_new = '.make_new = %s_make_new,' % obj_name if is_obj else '',
2584-
binary_op = '.binary_op = mp_lv_obj_binary_op,' if is_obj else '',
2585-
buffer_p = '.buffer_p = { .get_buffer = mp_lv_obj_get_buffer },' if is_obj else '',
2586-
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',
2589+
make_new = 'make_new, %s_make_new,' % obj_name if is_obj else '',
2590+
binary_op = 'binary_op, mp_lv_obj_binary_op,' if is_obj else '',
2591+
buffer = 'buffer, mp_lv_obj_get_buffer,' if is_obj else '',
2592+
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 '',
25872593
lv_class = '&lv_%s_class' % obj_name if is_obj else 'NULL',
25882594
))
25892595

lv_conf.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@
5959
#endif /*LV_USE_BUILTIN_SNPRINTF*/
6060

6161
#define LV_STDLIB_INCLUDE "include/lv_mp_mem_custom_include.h"
62-
#define LV_MALLOC m_malloc
63-
#define LV_REALLOC m_realloc
64-
#define LV_FREE m_free
62+
#define LV_MALLOC(size) gc_alloc(size, 0)
63+
#define LV_REALLOC(ptr, size) gc_realloc(ptr, size, true)
64+
#define LV_FREE gc_free
65+
6566
#define LV_MEMSET lv_memset_builtin
6667
#define LV_MEMCPY lv_memcpy_builtin
6768
#define LV_SNPRINTF lv_snprintf_builtin
@@ -732,7 +733,7 @@
732733
/*Quick access bar, 1:use, 0:not use*/
733734
/*Requires: lv_list*/
734735
#define LV_FILE_EXPLORER_QUICK_ACCESS 1
735-
#endif
736+
#endif
736737

737738
/*==================
738739
* EXAMPLES

0 commit comments

Comments
 (0)