summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-06-11 20:17:38 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-06-11 20:43:47 +0300
commit5f4a667ea467c0452b9c2ed951f4b4afce711d61 (patch)
tree359d5027ca579437676ce425e1851959dbe7bdf8
parentf77d0c5bb3986238cbd5eb4982087b3fda3dfcc0 (diff)
downloadmicropython-5f4a667ea467c0452b9c2ed951f4b4afce711d61.tar.gz
micropython-5f4a667ea467c0452b9c2ed951f4b4afce711d61.zip
objgenerator: Finish refactor to use mp_setup_code_state().
-rw-r--r--py/objgenerator.c56
1 files changed, 25 insertions, 31 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c
index a98de2cb97..7eaeac9cce 100644
--- a/py/objgenerator.c
+++ b/py/objgenerator.c
@@ -46,14 +46,37 @@ typedef struct _mp_obj_gen_wrap_t {
mp_obj_t *fun;
} mp_obj_gen_wrap_t;
-mp_obj_t mp_obj_new_gen_instance(mp_obj_fun_bc_t *self_fun, uint n_args, uint n_kw, const mp_obj_t *args);
+typedef struct _mp_obj_gen_instance_t {
+ mp_obj_base_t base;
+ mp_obj_dict_t *globals;
+ mp_code_state code_state;
+} mp_obj_gen_instance_t;
STATIC mp_obj_t gen_wrap_call(mp_obj_t self_in, uint n_args, uint n_kw, const mp_obj_t *args) {
mp_obj_gen_wrap_t *self = self_in;
mp_obj_fun_bc_t *self_fun = (mp_obj_fun_bc_t*)self->fun;
assert(MP_OBJ_IS_TYPE(self_fun, &mp_type_fun_bc));
- return mp_obj_new_gen_instance(self_fun, n_args, n_kw, args);
+ const byte *bytecode = self_fun->bytecode;
+ // get code info size, and skip the line number table
+ machine_uint_t code_info_size = bytecode[0] | (bytecode[1] << 8) | (bytecode[2] << 16) | (bytecode[3] << 24);
+ bytecode += code_info_size;
+
+ // bytecode prelude: get state size and exception stack size
+ machine_uint_t n_state = bytecode[0] | (bytecode[1] << 8);
+ machine_uint_t n_exc_stack = bytecode[2] | (bytecode[3] << 8);
+ bytecode += 4;
+
+ // allocate the generator object, with room for local stack and exception stack
+ mp_obj_gen_instance_t *o = m_new_obj_var(mp_obj_gen_instance_t, byte,
+ n_state * sizeof(mp_obj_t) + n_exc_stack * sizeof(mp_exc_stack_t));
+ o->base.type = &mp_type_gen_instance;
+
+ o->globals = self_fun->globals;
+ o->code_state.n_state = n_state;
+ o->code_state.ip = bytecode;
+ mp_setup_code_state(&o->code_state, self_fun, n_args, n_kw, args);
+ return o;
}
const mp_obj_type_t mp_type_gen_wrap = {
@@ -72,12 +95,6 @@ mp_obj_t mp_obj_new_gen_wrap(mp_obj_t fun) {
/******************************************************************************/
/* generator instance */
-typedef struct _mp_obj_gen_instance_t {
- mp_obj_base_t base;
- mp_obj_dict_t *globals;
- mp_code_state code_state;
-} mp_obj_gen_instance_t;
-
void gen_instance_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
mp_obj_gen_instance_t *self = self_in;
print(env, "<generator object '%s' at %p>", mp_obj_code_get_name(self->code_state.code_info), self_in);
@@ -233,26 +250,3 @@ const mp_obj_type_t mp_type_gen_instance = {
.iternext = gen_instance_iternext,
.locals_dict = (mp_obj_t)&gen_instance_locals_dict,
};
-
-mp_obj_t mp_obj_new_gen_instance(mp_obj_fun_bc_t *self_fun, uint n_args, uint n_kw, const mp_obj_t *args) {
- const byte *bytecode = self_fun->bytecode;
- // get code info size, and skip the line number table
- machine_uint_t code_info_size = bytecode[0] | (bytecode[1] << 8) | (bytecode[2] << 16) | (bytecode[3] << 24);
- bytecode += code_info_size;
-
- // bytecode prelude: get state size and exception stack size
- machine_uint_t n_state = bytecode[0] | (bytecode[1] << 8);
- machine_uint_t n_exc_stack = bytecode[2] | (bytecode[3] << 8);
- bytecode += 4;
-
- // allocate the generator object, with room for local stack and exception stack
- mp_obj_gen_instance_t *o = m_new_obj_var(mp_obj_gen_instance_t, byte, n_state * sizeof(mp_obj_t) + n_exc_stack * sizeof(mp_exc_stack_t));
- o->base.type = &mp_type_gen_instance;
- o->globals = self_fun->globals;
-
- o->code_state.n_state = n_state;
- o->code_state.ip = bytecode;
- mp_setup_code_state(&o->code_state, self_fun, n_args, n_kw, args);
-
- return o;
-}