@@ -73,8 +73,15 @@ mp_obj_t gen_instance_getiter(mp_obj_t self_in) {
7373 return self_in ;
7474}
7575
76- mp_obj_t gen_instance_iternext (mp_obj_t self_in ) {
76+ static mp_obj_t gen_send (mp_obj_t self_in , mp_obj_t send_value ) {
7777 mp_obj_gen_instance_t * self = self_in ;
78+ if (self -> sp == self -> state - 1 ) {
79+ if (send_value != mp_const_none ) {
80+ nlr_jump (mp_obj_new_exception_msg (MP_QSTR_TypeError , "can't send non-None value to a just-started generator" ));
81+ }
82+ } else {
83+ * self -> sp = send_value ;
84+ }
7885 bool yield = mp_execute_byte_code_2 (self -> code_info , & self -> ip , & self -> state [self -> n_state - 1 ], & self -> sp );
7986 if (yield ) {
8087 return * self -> sp ;
@@ -87,13 +94,24 @@ mp_obj_t gen_instance_iternext(mp_obj_t self_in) {
8794 }
8895 }
8996}
97+ static MP_DEFINE_CONST_FUN_OBJ_2 (gen_send_obj , gen_send ) ;
98+
99+ mp_obj_t gen_instance_iternext (mp_obj_t self_in ) {
100+ return gen_send (self_in , mp_const_none );
101+ }
102+
103+ static const mp_method_t gen_type_methods [] = {
104+ { "send" , & gen_send_obj },
105+ { NULL , NULL }, // end-of-list sentinel
106+ };
90107
91108const mp_obj_type_t gen_instance_type = {
92109 { & mp_const_type },
93110 "generator" ,
94111 .print = gen_instance_print ,
95112 .getiter = gen_instance_getiter ,
96113 .iternext = gen_instance_iternext ,
114+ .methods = gen_type_methods ,
97115};
98116
99117mp_obj_t mp_obj_new_gen_instance (const byte * bytecode , uint n_state , int n_args , const mp_obj_t * args ) {
0 commit comments