Skip to content

Commit 55caaac

Browse files
committed
Make MAY_BE_ERROR handling more accurate
This ended up causing weird things like MAY_BE_ERROR CVs. Also make sure that ASSIGN result isn't MAY_BE_REF.
1 parent 3dc8f80 commit 55caaac

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

ext/opcache/Optimizer/zend_inference.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2888,7 +2888,7 @@ static void zend_update_type_info(const zend_op_array *op_array,
28882888
case ZEND_POST_INC:
28892889
case ZEND_POST_DEC:
28902890
if (ssa_ops[i].result_def >= 0) {
2891-
tmp = (MAY_BE_RC1 | t1) & ~(MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_RCN);
2891+
tmp = (MAY_BE_RC1 | t1) & ~(MAY_BE_UNDEF|MAY_BE_ERROR|MAY_BE_REF|MAY_BE_RCN);
28922892
if (t1 & MAY_BE_UNDEF) {
28932893
tmp |= MAY_BE_NULL;
28942894
}
@@ -3076,7 +3076,7 @@ static void zend_update_type_info(const zend_op_array *op_array,
30763076
}
30773077
}
30783078
if (ssa_ops[i].result_def >= 0) {
3079-
UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def);
3079+
UPDATE_SSA_TYPE(tmp & ~MAY_BE_REF, ssa_ops[i].result_def);
30803080
if ((t2 & MAY_BE_OBJECT) && ssa_ops[i].op2_use >= 0 && ssa_var_info[ssa_ops[i].op2_use].ce) {
30813081
UPDATE_SSA_OBJ_TYPE(ssa_var_info[ssa_ops[i].op2_use].ce, ssa_var_info[ssa_ops[i].op2_use].is_instanceof, ssa_ops[i].result_def);
30823082
} else {
@@ -3096,7 +3096,7 @@ static void zend_update_type_info(const zend_op_array *op_array,
30963096
if (opline->op2_type == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION) {
30973097
tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2) & ~MAY_BE_UNDEF;
30983098
} else {
3099-
tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN);
3099+
tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_ERROR|MAY_BE_RC1|MAY_BE_RCN);
31003100
}
31013101
if (t2 & MAY_BE_UNDEF) {
31023102
tmp |= MAY_BE_NULL;
@@ -3615,7 +3615,10 @@ static void zend_update_type_info(const zend_op_array *op_array,
36153615
}
36163616
}
36173617
if (ssa_ops[i].result_def >= 0) {
3618-
tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_ERROR;
3618+
tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
3619+
if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) {
3620+
tmp |= MAY_BE_ERROR;
3621+
}
36193622
if (opline->result_type == IS_TMP_VAR) {
36203623
tmp |= MAY_BE_RC1;
36213624
} else {

0 commit comments

Comments
 (0)