@@ -455,21 +455,23 @@ static void zend_generator_throw_exception(zend_generator *generator, zval *exce
455
455
{
456
456
zend_execute_data * original_execute_data = EG (current_execute_data );
457
457
458
- /* if we don't stop an array/iterator yield from, the exception will only reach the generator after the values were all iterated over */
459
- if (UNEXPECTED (Z_TYPE (generator -> values ) != IS_UNDEF )) {
460
- zval_ptr_dtor (& generator -> values );
461
- ZVAL_UNDEF (& generator -> values );
462
- }
463
-
464
458
/* Throw the exception in the context of the generator. Decrementing the opline
465
459
* to pretend the exception happened during the YIELD opcode. */
466
460
EG (current_execute_data ) = generator -> execute_data ;
467
461
generator -> execute_data -> opline -- ;
462
+
468
463
if (exception ) {
469
464
zend_throw_exception_object (exception );
470
465
} else {
471
466
zend_rethrow_exception (EG (current_execute_data ));
472
467
}
468
+
469
+ /* if we don't stop an array/iterator yield from, the exception will only reach the generator after the values were all iterated over */
470
+ if (UNEXPECTED (Z_TYPE (generator -> values ) != IS_UNDEF )) {
471
+ zval_ptr_dtor (& generator -> values );
472
+ ZVAL_UNDEF (& generator -> values );
473
+ }
474
+
473
475
generator -> execute_data -> opline ++ ;
474
476
EG (current_execute_data ) = original_execute_data ;
475
477
}
@@ -600,6 +602,8 @@ ZEND_API zend_generator *zend_generator_update_current(zend_generator *generator
600
602
601
603
static zend_result zend_generator_get_next_delegated_value (zend_generator * generator ) /* {{{ */
602
604
{
605
+ -- generator -> execute_data -> opline ;
606
+
603
607
zval * value ;
604
608
if (Z_TYPE (generator -> values ) == IS_ARRAY ) {
605
609
HashTable * ht = Z_ARR (generator -> values );
@@ -665,11 +669,15 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener
665
669
ZVAL_LONG (& generator -> key , iter -> index );
666
670
}
667
671
}
672
+
673
+ ++ generator -> execute_data -> opline ;
668
674
return SUCCESS ;
669
675
670
676
failure :
671
677
zval_ptr_dtor (& generator -> values );
672
678
ZVAL_UNDEF (& generator -> values );
679
+
680
+ ++ generator -> execute_data -> opline ;
673
681
return FAILURE ;
674
682
}
675
683
/* }}} */
0 commit comments