Skip to content

Commit 5f4a667

Browse files
committed
objgenerator: Finish refactor to use mp_setup_code_state().
1 parent f77d0c5 commit 5f4a667

1 file changed

Lines changed: 25 additions & 31 deletions

File tree

py/objgenerator.c

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,37 @@ typedef struct _mp_obj_gen_wrap_t {
4646
mp_obj_t *fun;
4747
} mp_obj_gen_wrap_t;
4848

49-
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);
49+
typedef struct _mp_obj_gen_instance_t {
50+
mp_obj_base_t base;
51+
mp_obj_dict_t *globals;
52+
mp_code_state code_state;
53+
} mp_obj_gen_instance_t;
5054

5155
STATIC mp_obj_t gen_wrap_call(mp_obj_t self_in, uint n_args, uint n_kw, const mp_obj_t *args) {
5256
mp_obj_gen_wrap_t *self = self_in;
5357
mp_obj_fun_bc_t *self_fun = (mp_obj_fun_bc_t*)self->fun;
5458
assert(MP_OBJ_IS_TYPE(self_fun, &mp_type_fun_bc));
5559

56-
return mp_obj_new_gen_instance(self_fun, n_args, n_kw, args);
60+
const byte *bytecode = self_fun->bytecode;
61+
// get code info size, and skip the line number table
62+
machine_uint_t code_info_size = bytecode[0] | (bytecode[1] << 8) | (bytecode[2] << 16) | (bytecode[3] << 24);
63+
bytecode += code_info_size;
64+
65+
// bytecode prelude: get state size and exception stack size
66+
machine_uint_t n_state = bytecode[0] | (bytecode[1] << 8);
67+
machine_uint_t n_exc_stack = bytecode[2] | (bytecode[3] << 8);
68+
bytecode += 4;
69+
70+
// allocate the generator object, with room for local stack and exception stack
71+
mp_obj_gen_instance_t *o = m_new_obj_var(mp_obj_gen_instance_t, byte,
72+
n_state * sizeof(mp_obj_t) + n_exc_stack * sizeof(mp_exc_stack_t));
73+
o->base.type = &mp_type_gen_instance;
74+
75+
o->globals = self_fun->globals;
76+
o->code_state.n_state = n_state;
77+
o->code_state.ip = bytecode;
78+
mp_setup_code_state(&o->code_state, self_fun, n_args, n_kw, args);
79+
return o;
5780
}
5881

5982
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) {
7295
/******************************************************************************/
7396
/* generator instance */
7497

75-
typedef struct _mp_obj_gen_instance_t {
76-
mp_obj_base_t base;
77-
mp_obj_dict_t *globals;
78-
mp_code_state code_state;
79-
} mp_obj_gen_instance_t;
80-
8198
void gen_instance_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
8299
mp_obj_gen_instance_t *self = self_in;
83100
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 = {
233250
.iternext = gen_instance_iternext,
234251
.locals_dict = (mp_obj_t)&gen_instance_locals_dict,
235252
};
236-
237-
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) {
238-
const byte *bytecode = self_fun->bytecode;
239-
// get code info size, and skip the line number table
240-
machine_uint_t code_info_size = bytecode[0] | (bytecode[1] << 8) | (bytecode[2] << 16) | (bytecode[3] << 24);
241-
bytecode += code_info_size;
242-
243-
// bytecode prelude: get state size and exception stack size
244-
machine_uint_t n_state = bytecode[0] | (bytecode[1] << 8);
245-
machine_uint_t n_exc_stack = bytecode[2] | (bytecode[3] << 8);
246-
bytecode += 4;
247-
248-
// allocate the generator object, with room for local stack and exception stack
249-
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));
250-
o->base.type = &mp_type_gen_instance;
251-
o->globals = self_fun->globals;
252-
253-
o->code_state.n_state = n_state;
254-
o->code_state.ip = bytecode;
255-
mp_setup_code_state(&o->code_state, self_fun, n_args, n_kw, args);
256-
257-
return o;
258-
}

0 commit comments

Comments
 (0)