summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer/zend_optimizer.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/opcache/Optimizer/zend_optimizer.c')
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index 9437a22ed0..fe258adbba 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -380,6 +380,20 @@ int zend_optimizer_replace_by_const(zend_op_array *op_array,
zval_dtor(val);
return 1;
}
+ case ZEND_VERIFY_RETURN_TYPE: {
+ zend_arg_info *ret_info = op_array->arg_info - 1;
+ ZEND_ASSERT((opline + 1)->opcode == ZEND_RETURN || (opline + 1)->opcode == ZEND_RETURN_BY_REF);
+ if (ret_info->class_name
+ || ret_info->type_hint == IS_CALLABLE
+ || !ZEND_SAME_FAKE_TYPE(ret_info->type_hint, Z_TYPE_P(val))
+ || (op_array->fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
+ zval_dtor(val);
+ return 0;
+ }
+ MAKE_NOP(opline);
+ zend_optimizer_update_op1_const(op_array, opline + 1, val);
+ return 1;
+ }
default:
break;
}