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 /py/objgenerator.c | |
| parent | f77d0c5bb3986238cbd5eb4982087b3fda3dfcc0 (diff) | |
objgenerator: Finish refactor to use mp_setup_code_state().
Diffstat (limited to 'py/objgenerator.c')
| -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 a98de2cb9..7eaeac9cc 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; -}  | 
