8000 py/obj.h: Add split mp_obj_type_t representation. · micropython/micropython@88662c9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 88662c9

Browse files
committed
py/obj.h: Add split mp_obj_type_t representation.
1 parent 6f9b29e commit 88662c9

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

py/mpconfig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122

123123
#define MICROPY_OBJ_TYPE_REPR_FULL (0)
124124
#define MICROPY_OBJ_TYPE_REPR_SLOT_INDEX (1)
125+
#define MICROPY_OBJ_TYPE_REPR_SPLIT (2)
125126

126127
#ifndef MICROPY_OBJ_TYPE_REPR
127128
#define MICROPY_OBJ_TYPE_REPR (MICROPY_OBJ_TYPE_REPR_FULL)

py/obj.h

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,19 @@ typedef mp_int_t (*mp_buffer_fun_t)(mp_obj_t obj, mp_buffer_info_t *bufinfo, mp_
522522
bool mp_get_buffer(mp_obj_t obj, mp_buffer_info_t *bufinfo, mp_uint_t flags);
523523
void mp_get_buffer_raise(mp_obj_t obj, mp_buffer_info_t *bufinfo, mp_uint_t flags);
524524

525+
#if MICROPY_OBJ_TYPE_REPR == MICROPY_OBJ_TYPE_REPR_SPLIT
526+
struct _mp_obj_type_ext_t {
527+
mp_call_fun_t call;
528+
mp_unary_op_fun_t unary_op;
529+
mp_subscr_fun_t subscr;
530+
mp_getiter_fun_t getiter;
531+
mp_fun_1_t iternext;
532+
mp_buffer_fun_t buffer;
533+
const void *protocol;
534+
mp_binary_op_fun_t binary_op;
535+
};
536+
#endif
537+
525538
struct _mp_obj_type_t {
526539
// A type is an object so must start with this entry, which points to mp_type_type.
527540
mp_obj_base_t base;
@@ -608,6 +621,15 @@ struct _mp_obj_type_t {
608621

609622
const void *slots[];
610623

624+
#elif MICROPY_OBJ_TYPE_REPR == MICROPY_OBJ_TYPE_REPR_SPLIT
625+
626+
mp_print_fun_t print;
627+
mp_attr_fun_t attr;
628+
const void *parent;
629+
struct _mp_obj_dict_t *locals_dict;
630+
631+
struct _mp_obj_type_ext_t ext[];
632+
611633
#endif
612634
};
613635

@@ -677,6 +699,58 @@ struct _mp_obj_type_t {
677699
#define MP_OBJ_TYPE_SET_SLOT(t, f, v, n) ((t)->slot_index_##f = n, (t)->slots[(t)->slot_index_##f - 1] = (void *)v)
< 8000 /code>
678700
#define MP_OBJ_TYPE_OFFSETOF_SLOT(t, f) (offsetof(mp_obj_type_t, slots) + (t)->slot_index_##f * sizeof(void *))
679701

702+
#elif MICROPY_OBJ_TYPE_REPR == MICROPY_OBJ_TYPE_REPR_SPLIT
703+
704+
#define MICROPY_OBJ_TYPE_EXTRA_ALLOC (sizeof(struct _mp_obj_type_ext_t))
705+
706+
#define MP_OBJ_TYPE_FLAG_EXTENDED (0x0080)
707+
708+
#define SLOT_IS_EXT_print (0)
709+
#define SLOT_IS_EXT_call (1)
710+
#define SLOT_IS_EXT_unary_op (1)
711+
#define SLOT_IS_EXT_binary_op (1)
712+
#define SLOT_IS_EXT_attr (0)
713+
#define SLOT_IS_EXT_subscr (1)
714+
#define SLOT_IS_EXT_getiter (1)
715+
#define SLOT_IS_EXT_iternext (1)
716+
#define SLOT_IS_EXT_buffer (1)
717+
#define SLOT_IS_EXT_protocol (1)
718+
#define SLOT_IS_EXT_parent (0)
719+
#define SLOT_IS_EXT_locals_dict (0)
720+
721+
#define SLOT_PATH_print print
722+
#define SLOT_PATH_call ext[0].call
723+
#define SLOT_PATH_unary_op ext[0].unary_op
724+
#define SLOT_PATH_binary_op ext[0].binary_op
725+
#define SLOT_PATH_attr attr
726+
#define SLOT_PATH_subscr ext[0].subscr
727+
#define SLOT_PATH_getiter ext[0].getiter
728+
#define SLOT_PATH_iternext ext[0].iternext
729+
#define SLOT_PATH_buffer ext[0].buffer
730+
#define SLOT_PATH_protocol ext[0].protocol
731+
#define SLOT_PATH_parent parent
732+
#define SLOT_PATH_locals_dict locals_dict
733+
734+
#define MP_DEFINE_CONST_OBJ_TYPE_0(_typename, _name, _flags, _make_new) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags, .make_new = _make_new }
735+
#define MP_DEFINE_CONST_OBJ_TYPE_1(_typename, _name, _flags, _make_new, f1, v1) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1)*MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1 }
736+
#define MP_DEFINE_CONST_OBJ_TYPE_2(_typename, _name, _flags, _make_new, f1, v1, f2, v2) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2 }
737+
#define MP_DEFINE_CONST_OBJ_TYPE_3(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3 }
738+
#define MP_DEFINE_CONST_OBJ_TYPE_4(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4 }
739+
#define MP_DEFINE_CONST_OBJ_TYPE_5(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5 }
740+
#define MP_DEFINE_CONST_OBJ_TYPE_6(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6 }
741+
#define MP_DEFINE_CONST_OBJ_TYPE_7(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6 | SLOT_IS_EXT_##f7) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6, .SLOT_PATH_##f7 = v7 }
742+
#define MP_DEFINE_CONST_OBJ_TYPE_8(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6 | SLOT_IS_EXT_##f7 | SLOT_IS_EXT_##f8) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6, .SLOT_PATH_##f7 = v7, .SLOT_PATH_##f8 = v8 }
743+
#define MP_DEFINE_CONST_OBJ_TYPE_9(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6 | SLOT_IS_EXT_##f7 | SLOT_IS_EXT_##f8 | SLOT_IS_EXT_##f9) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6, .SLOT_PATH_##f7 = v7, .SLOT_PATH_##f8 = v8, .SLOT_PATH_##f9 = v9 }
744+
#define MP_DEFINE_CONST_OBJ_TYPE_10(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6 | SLOT_IS_EXT_##f7 | SLOT_IS_EXT_##f8 | SLOT_IS_EXT_##f9 | SLOT_IS_EXT_##f10) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6, .SLOT_PATH_##f7 = v7, .SLOT_PATH_##f8 = v8, .SLOT_PATH_##f9 = v9, .SLOT_PATH_##f10 = v10 }
745+
#define MP_DEFINE_CONST_OBJ_TYPE_11(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10, f11, v11) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6 | SLOT_IS_EXT_##f7 | SLOT_IS_EXT_##f8 | SLOT_IS_EXT_##f9 | SLOT_IS_EXT_##f10 | SLOT_IS_EXT_##f11) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6, .SLOT_PATH_##f7 = v7, .SLOT_PATH_##f8 = v8, .SLOT_PATH_##f9 = v9, .SLOT_PATH_##f10 = v10, .SLOT_PATH_##f11 = v11 }
746+
#define MP_DEFINE_CONST_OBJ_TYPE_12(_typename, _name, _flags, _make_new, f1, v1, f2, v2, f3, v3, f4, v4, f5, v5, f6, v6, f7, v7, f8, v8, f9, v9, f10, v10, f11, v11, f12, v12) const mp_obj_type_t _typename = { .base = { &mp_type_type }, .name = _name, .flags = _flags | (SLOT_IS_EXT_##f1 | SLOT_IS_EXT_##f2 | SLOT_IS_EXT_##f3 | SLOT_IS_EXT_##f4 | SLOT_IS_EXT_##f5 | SLOT_IS_EXT_##f6 | SLOT_IS_EXT_##f7 | SLOT_IS_EXT_##f8 | SLOT_IS_EXT_##f9 | SLOT_IS_EXT_##f10 | SLOT_IS_EXT_##f11 | SLOT_IS_EXT_##f12) * MP_OBJ_TYPE_FLAG_EXTENDED, .make_new = _make_new, .SLOT_PATH_##f1 = v1, .SLOT_PATH_##f2 = v2, .SLOT_PATH_##f3 = v3, .SLOT_PATH_##f4 = v4, .SLOT_PATH_##f5 = v5, .SLOT_PATH_##f6 = v6, .SLOT_PATH_##f7 = v7, .SLOT_PATH_##f8 = v8, .SLOT_PATH_##f9 = v9, .SLOT_PATH_##f10 = v10, .SLOT_PATH_##f11 = v11, .SLOT_PATH_##f12 = v12 }
747+
748+
#define MP_OBJ_TYPE_HAS_SLOT(t, f) (SLOT_IS_EXT_##f ? (((t)->flags & MP_OBJ_TYPE_FLAG_EXTENDED) ? (t)->SLOT_PATH_##f : 0) : (t)->SLOT_PATH_##f)
749+
#define MP_OBJ_TYPE_GET_SLOT(t, f) ((t)->SLOT_PATH_##f)
750+
#define MP_OBJ_TYPE_GET_SLOT_OR_NULL(t, f) ((MP_OBJ_TYPE_HAS_SLOT(t, f) ? MP_OBJ_TYPE_GET_SLOT(t, f) : NULL))
751+
#define MP_OBJ_TYPE_SET_SLOT(t, f, v, n) ((t)->SLOT_PATH_##f = v)
752+
#define MP_OBJ_TYPE_OFFSETOF_SLOT(t, f) (offsetof(mp_obj_type_t, SLOT_PATH_##f))
753+
680754
#endif
681755

682756
#define MP_DEFINE_CONST_OBJ_TYPE_IMPL(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, N, ...) MP_DEFINE_CONST_OBJ_TYPE_##N

py/objtype.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,10 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
11411141
mp_obj_type_t *o = (mp_obj_type_t *)m_malloc0(sizeof(mp_obj_type_t) + MICROPY_OBJ_TYPE_EXTRA_ALLOC);
11421142
o->base.type = &mp_type_type;
11431143
o->flags = base_flags
1144+
#if MICROPY_OBJ_TYPE_REPR == MICROPY_OBJ_TYPE_REPR_SPLIT
1145+
| MP_OBJ_TYPE_FLAG_EXTENDED
1146+
#endif
1147+
;
11441148
o->name = name;
11451149
o->make_new = mp_obj_instance_make_new;
11461150
MP_OBJ_TYPE_SET_SLOT(o, print, instance_print, 1);

0 commit comments

Comments
 (0)
0