summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-03-25 16:00:36 +0300
committerDmitry Stogov <dmitry@zend.com>2021-03-25 16:00:36 +0300
commit2f3538c2150eb2698fb024f97ff049bbb20642d7 (patch)
tree66093967282fb4b0fe9e69d4de7a6b60f8aecbc2 /Zend
parent56c18c4038e3b9033c3e9cd48d053065898a6b2f (diff)
downloadphp-git-2f3538c2150eb2698fb024f97ff049bbb20642d7.tar.gz
Improved type inference for FE_FETCH_R
Diffstat (limited to 'Zend')
-rw-r--r--Zend/Optimizer/zend_inference.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c
index 8ba67a4dab..4233a8f7ef 100644
--- a/Zend/Optimizer/zend_inference.c
+++ b/Zend/Optimizer/zend_inference.c
@@ -3210,12 +3210,18 @@ static zend_always_inline int _zend_update_type_info(
break;
case ZEND_FE_FETCH_R:
case ZEND_FE_FETCH_RW:
- tmp = t2 & MAY_BE_REF;
+ tmp = 0;
+ if (opline->op2_type == IS_CV) {
+ tmp = t2 & MAY_BE_REF;
+ }
if (t1 & MAY_BE_OBJECT) {
if (opline->opcode == ZEND_FE_FETCH_RW) {
tmp |= MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
} else {
- tmp |= MAY_BE_REF | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
+ tmp |= MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
+ if (opline->op2_type != IS_CV) {
+ tmp |= MAY_BE_REF;
+ }
}
}
if (t1 & MAY_BE_ARRAY) {
@@ -3228,6 +3234,9 @@ static zend_always_inline int _zend_update_type_info(
}
if (t1 & MAY_BE_ARRAY_OF_REF) {
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
+ if (opline->op2_type != IS_CV) {
+ tmp |= MAY_BE_REF;
+ }
} else if (tmp & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
tmp |= MAY_BE_RC1 | MAY_BE_RCN;
}