@@ -659,13 +659,18 @@ def gen_condition(self) -> None:
659659 self .return_value = Register (object_rprimitive )
660660 err = builder .add (LoadErrorValue (object_rprimitive , undefines = True ))
661661 builder .assign (self .return_value , err , line )
662+
663+ # Call generated generator helper method, passing a PyObject ** as the final
664+ # argument that will be used to store the return value in this register. This
665+ # is faster than raising StopIteration.
662666 ptr = builder .add (LoadAddress (object_pointer_rprimitive , self .return_value ))
663667 nn = builder .none_object ()
664668 helper_call = MethodCall (
665669 builder .read (self .iter_target ), GENERATOR_HELPER_NAME , [nn , nn , nn , nn , ptr ], line
666670 )
667671 # We provide custom handling for error values.
668672 helper_call .error_kind = ERR_NEVER
673+
669674 self .next_reg = builder .add (helper_call )
670675 builder .add (Branch (self .next_reg , self .loop_exit , self .body_block , Branch .IS_ERROR ))
671676
@@ -684,6 +689,8 @@ def gen_step(self) -> None:
684689 pass
685690
686691 def gen_cleanup (self ) -> None :
692+ # If return value is NULL (it wasn't assigned to by the generator helper method),
693+ # an exception was raised.
687694 self .builder .primitive_op (propagate_if_error_op , [self .return_value ], self .line )
688695
689696
0 commit comments