summaryrefslogtreecommitdiffstatshomepage
path: root/py/objprivate.h
diff options
context:
space:
mode:
authorDamien <damien.p.george@gmail.com>2013-12-17 18:27:24 +0000
committerDamien <damien.p.george@gmail.com>2013-12-17 18:27:24 +0000
commit660365e14c7205581f38cf61923a7a88a84f893f (patch)
tree7add583ec920d36a670a79ae56ae891292cec99f /py/objprivate.h
parenta1b2693161183fb6052271d8ea1809e48d75d144 (diff)
downloadmicropython-660365e14c7205581f38cf61923a7a88a84f893f.tar.gz
micropython-660365e14c7205581f38cf61923a7a88a84f893f.zip
py: split runtime into map, obj, builtin.
Diffstat (limited to 'py/objprivate.h')
-rw-r--r--py/objprivate.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/py/objprivate.h b/py/objprivate.h
new file mode 100644
index 0000000000..70ee6560da
--- /dev/null
+++ b/py/objprivate.h
@@ -0,0 +1,140 @@
+// 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);