diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-06-11 20:17:38 +0300 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-06-11 20:43:47 +0300 |
commit | 5f4a667ea467c0452b9c2ed951f4b4afce711d61 (patch) | |
tree | 359d5027ca579437676ce425e1851959dbe7bdf8 | |
parent | f77d0c5bb3986238cbd5eb4982087b3fda3dfcc0 (diff) | |
download | micropython-5f4a667ea467c0452b9c2ed951f4b4afce711d61.tar.gz micropython-5f4a667ea467c0452b9c2ed951f4b4afce711d61.zip |
objgenerator: Finish refactor to use mp_setup_code_state().
-rw-r--r-- | py/objgenerator.c | 56 |
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; -} |