|
|
|
@ -7124,11 +7124,12 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
i_cleanup_unfinished_execution(execute_data, op_num, catch_op_num); |
|
|
|
cleanup_unfinished_calls(execute_data, op_num); |
|
|
|
|
|
|
|
if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) { |
|
|
|
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var); |
|
|
|
|
|
|
|
cleanup_live_vars(execute_data, op_num, finally_op_num); |
|
|
|
if (in_finally && Z_OBJ_P(fast_call)) { |
|
|
|
zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call)); |
|
|
|
} |
|
|
|
@ -7138,6 +7139,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY) |
|
|
|
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[finally_op_num]); |
|
|
|
ZEND_VM_CONTINUE(); |
|
|
|
} else { |
|
|
|
cleanup_live_vars(execute_data, op_num, catch_op_num); |
|
|
|
if (in_finally) { |
|
|
|
/* we are going out of current finally scope */ |
|
|
|
zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var); |
|
|
|
@ -7557,20 +7559,25 @@ ZEND_VM_HANDLER(163, ZEND_FAST_RET, ANY, ANY) |
|
|
|
USE_OPLINE |
|
|
|
|
|
|
|
if (opline->extended_value == ZEND_FAST_RET_TO_FINALLY) { |
|
|
|
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, opline->op2.opline_num); |
|
|
|
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]); |
|
|
|
ZEND_VM_CONTINUE(); |
|
|
|
} else { |
|
|
|
EG(exception) = Z_OBJ_P(fast_call); |
|
|
|
Z_OBJ_P(fast_call) = NULL; |
|
|
|
if (opline->extended_value == ZEND_FAST_RET_TO_CATCH) { |
|
|
|
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, opline->op2.opline_num); |
|
|
|
ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[opline->op2.opline_num]); |
|
|
|
ZEND_VM_CONTINUE(); |
|
|
|
} else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) { |
|
|
|
zend_generator *generator = zend_get_running_generator(execute_data); |
|
|
|
zend_generator_close(generator, 1); |
|
|
|
ZEND_VM_RETURN(); |
|
|
|
} else { |
|
|
|
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); |
|
|
|
cleanup_live_vars(execute_data, opline - EX(func)->op_array.opcodes, 0); |
|
|
|
if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) { |
|
|
|
zend_generator *generator = zend_get_running_generator(execute_data); |
|
|
|
zend_generator_close(generator, 1); |
|
|
|
ZEND_VM_RETURN(); |
|
|
|
} else { |
|
|
|
ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|