Skip to content

Commit d29998d

Browse files
committed
Pass correct retval from generator on uncaught exception
1 parent 836ef0b commit d29998d

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

Zend/zend_vm_def.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7719,15 +7719,19 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
77197719
}
77207720

77217721
/* Uncaught exception */
7722-
if (zend_observer_fcall_op_array_extension != -1) {
7723-
zend_observer_fcall_end(execute_data, EX(return_value));
7724-
}
7725-
cleanup_live_vars(execute_data, op_num, 0);
77267722
if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
77277723
zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
7724+
if (zend_observer_fcall_op_array_extension != -1) {
7725+
zend_observer_fcall_end(execute_data, &generator->retval);
7726+
}
7727+
cleanup_live_vars(execute_data, op_num, 0);
77287728
zend_generator_close(generator, 1);
77297729
ZEND_VM_RETURN();
77307730
} else {
7731+
if (zend_observer_fcall_op_array_extension != -1) {
7732+
zend_observer_fcall_end(execute_data, EX(return_value));
7733+
}
7734+
cleanup_live_vars(execute_data, op_num, 0);
77317735
/* We didn't execute RETURN, and have to initialize return_value */
77327736
if (EX(return_value)) {
77337737
ZVAL_UNDEF(EX(return_value));

Zend/zend_vm_execute.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2904,15 +2904,19 @@ static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_dispatch_try
29042904
}
29052905

29062906
/* Uncaught exception */
2907-
if (zend_observer_fcall_op_array_extension != -1) {
2908-
zend_observer_fcall_end(execute_data, EX(return_value));
2909-
}
2910-
cleanup_live_vars(execute_data, op_num, 0);
29112907
if (UNEXPECTED((EX_CALL_INFO() & ZEND_CALL_GENERATOR) != 0)) {
29122908
zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
2909+
if (zend_observer_fcall_op_array_extension != -1) {
2910+
zend_observer_fcall_end(execute_data, &generator->retval);
2911+
}
2912+
cleanup_live_vars(execute_data, op_num, 0);
29132913
zend_generator_close(generator, 1);
29142914
ZEND_VM_RETURN();
29152915
} else {
2916+
if (zend_observer_fcall_op_array_extension != -1) {
2917+
zend_observer_fcall_end(execute_data, EX(return_value));
2918+
}
2919+
cleanup_live_vars(execute_data, op_num, 0);
29162920
/* We didn't execute RETURN, and have to initialize return_value */
29172921
if (EX(return_value)) {
29182922
ZVAL_UNDEF(EX(return_value));

0 commit comments

Comments
 (0)