diff options
author | Damien <damien.p.george@gmail.com> | 2013-12-21 18:17:45 +0000 |
---|---|---|
committer | Damien <damien.p.george@gmail.com> | 2013-12-21 18:17:45 +0000 |
commit | d99b05282d14ceb0163cbcd059aa37bdb415af43 (patch) | |
tree | 978135f9fe83d3c4d5b3c95f84cb104c0092936a /py/objprivate.h | |
parent | e2880aa2fdc75298df487df7519d483acb03959c (diff) |
Change object representation from 1 big union to individual structs.
A big change. Micro Python objects are allocated as individual structs
with the first element being a pointer to the type information (which
is itself an object). This scheme follows CPython. Much more flexible,
not necessarily slower, uses same heap memory, and can allocate objects
statically.
Also change name prefix, from py_ to mp_ (mp for Micro Python).
Diffstat (limited to 'py/objprivate.h')
-rw-r--r-- | py/objprivate.h | 140 |
1 files changed, 0 insertions, 140 deletions
diff --git a/py/objprivate.h b/py/objprivate.h deleted file mode 100644 index 70ee6560d..000000000 --- a/py/objprivate.h +++ /dev/null @@ -1,140 +0,0 @@ -// internal py_obj_t representation -// not for general use, instead access using py_obj_xxx functions - -#define IS_O(o, k) (((((py_small_int_t)(o)) & 1) == 0) && (((py_obj_base_t*)(o))->kind == (k))) -#define IS_SMALL_INT(o) (((py_small_int_t)(o)) & 1) -#define FROM_SMALL_INT(o) (((py_small_int_t)(o)) >> 1) -#define TO_SMALL_INT(o) ((py_obj_t)(((o) << 1) | 1)) - -typedef enum { - O_CONST, - O_STR, -#if MICROPY_ENABLE_FLOAT - O_FLOAT, - O_COMPLEX, -#endif - O_CELL, - O_EXCEPTION_0, - O_EXCEPTION_N, - O_RANGE, - O_RANGE_IT, - O_FUN_0, - O_FUN_1, - O_FUN_2, - O_FUN_N, - O_FUN_VAR, - O_FUN_BC, - O_FUN_ASM, - O_GEN_WRAP, - O_GEN_INSTANCE, - O_BOUND_METH, - O_CLOSURE, - O_TUPLE, - O_LIST, - O_TUPLE_IT, - O_LIST_IT, - O_SET, - O_MAP, - O_CLASS, - O_OBJ, - O_USER, -} py_obj_kind_t; - -typedef struct _py_obj_base_t py_obj_base_t; - -struct _py_obj_base_t { - py_obj_kind_t kind; - union { - const char *id; - qstr u_str; -#if MICROPY_ENABLE_FLOAT - py_float_t u_float; // for O_FLOAT - struct { // for O_COMPLEX - py_float_t real; - py_float_t imag; - } u_complex; -#endif - py_obj_t u_cell; // for O_CELL - struct { // for O_EXCEPTION_0 - qstr id; - } u_exc0; - struct { // for O_EXCEPTION_N - // TODO make generic object or something - qstr id; - int n_args; - const void **args; - } u_exc_n; - struct { // for O_RANGE - // TODO make generic object or something - machine_int_t start; - machine_int_t stop; - machine_int_t step; - } u_range; - struct { // for O_RANGE_IT - // TODO make generic object or something - machine_int_t cur; - machine_int_t stop; - machine_int_t step; - } u_range_it; - struct { // for O_FUN_[012N], O_FUN_VAR - int n_args; - void *fun; - } u_fun; - struct { // for O_FUN_BC - int n_args; - uint n_state; - byte *code; - } u_fun_bc; - struct { // for O_FUN_ASM - int n_args; - void *fun; - } u_fun_asm; - struct { // for O_GEN_WRAP - int n_state; - py_obj_base_t *fun; - } u_gen_wrap; - struct { // for O_GEN_INSTANCE - py_obj_t *state; - const byte *ip; - py_obj_t *sp; - } u_gen_instance; - struct { // for O_BOUND_METH - py_obj_t meth; - py_obj_t self; - } u_bound_meth; - struct { // for O_CLOSURE - py_obj_t fun; - py_obj_t vars; - } u_closure; - struct { // for O_TUPLE, O_LIST - machine_uint_t alloc; - machine_uint_t len; - py_obj_t *items; - } u_tuple_list; - struct { // for O_TUPLE_IT, O_LIST_IT - py_obj_base_t *obj; - machine_uint_t cur; - } u_tuple_list_it; - struct { // for O_SET - machine_uint_t alloc; - machine_uint_t used; - py_obj_t *table; - } u_set; - py_map_t u_map; // for O_MAP - struct { // for O_CLASS - py_map_t *locals; - } u_class; - struct { // for O_OBJ - py_obj_base_t *class; // points to a O_CLASS object - py_map_t *members; - } u_obj; - struct { // for O_USER - const py_user_info_t *info; - machine_uint_t data1; - machine_uint_t data2; - } u_user; - }; -}; - -py_obj_t py_obj_new_tuple_iterator(py_obj_base_t *tuple, int cur); -py_obj_t py_obj_new_list_iterator(py_obj_base_t *list, int cur); |