--- /dev/null
+--TEST--
+Throwing undef var in verify return
+--FILE--
+<?php
+
+set_error_handler(function(int $severity, string $message, string $filename, int $lineNumber): void {
+ throw new ErrorException($message, 0, $severity, $filename, $lineNumber);
+});
+
+function test(): string {
+ return $test;
+}
+
+test();
+
+?>
+--EXPECTF--
+Fatal error: Uncaught ErrorException: Undefined variable $test in %s:%d
+Stack trace:
+#0 %s(%d): {closure}(2, 'Undefined varia...', '%s', 8)
+#1 %s(%d): test()
+#2 {main}
+ thrown in %s on line %d
}
/* }}} */
+static zend_always_inline zend_bool is_handle_exception_set() {
+ zend_execute_data *execute_data = EG(current_execute_data);
+ return !execute_data->func
+ || !ZEND_USER_CODE(execute_data->func->common.type)
+ || execute_data->opline->opcode == ZEND_HANDLE_EXCEPTION;
+}
+
ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception) /* {{{ */
{
#ifdef HAVE_DTRACE
zend_exception_set_previous(exception, EG(exception));
EG(exception) = exception;
if (previous) {
+ ZEND_ASSERT(is_handle_exception_set() && "HANDLE_EXCEPTION not set?");
return;
}
}
zend_throw_exception_hook(exception);
}
- if (!EG(current_execute_data)->func ||
- !ZEND_USER_CODE(EG(current_execute_data)->func->common.type) ||
- EG(current_execute_data)->opline->opcode == ZEND_HANDLE_EXCEPTION) {
+ if (is_handle_exception_set()) {
/* no need to rethrow the exception */
return;
}
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
SAVE_OPLINE();
retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
}
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
SAVE_OPLINE();
retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
}
if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
SAVE_OPLINE();
retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
}
if (IS_VAR == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
SAVE_OPLINE();
retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
}
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
SAVE_OPLINE();
retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
}
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(retval_ptr))) {
SAVE_OPLINE();
retval_ref = retval_ptr = ZVAL_UNDEFINED_OP1();
+ if (UNEXPECTED(EG(exception))) {
+ HANDLE_EXCEPTION();
+ }
if (ZEND_TYPE_FULL_MASK(ret_info->type) & MAY_BE_NULL) {
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
}