@@ -458,21 +458,23 @@ static void zend_generator_throw_exception(zend_generator *generator, zval *exce
458
458
{
459
459
zend_execute_data * original_execute_data = EG (current_execute_data );
460
460
461
- /* if we don't stop an array/iterator yield from, the exception will only reach the generator after the values were all iterated over */
462
- if (UNEXPECTED (Z_TYPE (generator -> values ) != IS_UNDEF )) {
463
- zval_ptr_dtor (& generator -> values );
464
- ZVAL_UNDEF (& generator -> values );
465
- }
466
-
467
461
/* Throw the exception in the context of the generator. Decrementing the opline
468
462
* to pretend the exception happened during the YIELD opcode. */
469
463
EG (current_execute_data ) = generator -> execute_data ;
470
464
generator -> execute_data -> opline -- ;
465
+
471
466
if (exception ) {
472
467
zend_throw_exception_object (exception );
473
468
} else {
474
469
zend_rethrow_exception (EG (current_execute_data ));
475
470
}
471
+
472
+ /* if we don't stop an array/iterator yield from, the exception will only reach the generator after the values were all iterated over */
473
+ if (UNEXPECTED (Z_TYPE (generator -> values ) != IS_UNDEF )) {
474
+ zval_ptr_dtor (& generator -> values );
475
+ ZVAL_UNDEF (& generator -> values );
476
+ }
477
+
476
478
generator -> execute_data -> opline ++ ;
477
479
EG (current_execute_data ) = original_execute_data ;
478
480
}
@@ -603,6 +605,8 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator
603
605
604
606
static zend_result zend_generator_get_next_delegated_value (zend_generator * generator ) /* {{{ */
605
607
{
608
+ -- generator -> execute_data -> opline ;
609
+
606
610
zval * value ;
607
611
if (Z_TYPE (generator -> values ) == IS_ARRAY ) {
608
612
HashTable * ht = Z_ARR (generator -> values );
@@ -683,11 +687,15 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener
683
687
ZVAL_LONG (& generator -> key , iter -> index );
684
688
}
685
689
}
690
+
691
+ ++ generator -> execute_data -> opline ;
686
692
return SUCCESS ;
687
693
688
694
failure :
689
695
zval_ptr_dtor (& generator -> values );
690
696
ZVAL_UNDEF (& generator -> values );
697
+
698
+ ++ generator -> execute_data -> opline ;
691
699
return FAILURE ;
692
700
}
693
701
/* }}} */
0 commit comments