@@ -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
5155STATIC 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
5982const 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-
8198void 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