Skip to content

Commit a92e6d7

Browse files
committed
Merge branch 'PHP-7.4'
2 parents 8ae9e1b + 73fd2da commit a92e6d7

File tree

1 file changed

+60
-56
lines changed

1 file changed

+60
-56
lines changed

ext/opcache/Optimizer/zend_inference.c

Lines changed: 60 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3405,63 +3405,67 @@ static int zend_update_type_info(const zend_op_array *op_array,
34053405
tmp |= t1 & (MAY_BE_RC1|MAY_BE_RCN);
34063406
}
34073407
}
3408-
j = ssa_vars[ssa_ops[i].result_def].use_chain;
3409-
while (j >= 0) {
3410-
switch (op_array->opcodes[j].opcode) {
3411-
case ZEND_FETCH_DIM_W:
3412-
case ZEND_FETCH_DIM_RW:
3413-
case ZEND_FETCH_DIM_FUNC_ARG:
3414-
case ZEND_FETCH_LIST_W:
3415-
case ZEND_ASSIGN_DIM:
3416-
case ZEND_ASSIGN_DIM_OP:
3417-
tmp |= MAY_BE_ARRAY | MAY_BE_ARRAY_OF_ARRAY;
3418-
break;
3419-
case ZEND_FETCH_OBJ_W:
3420-
case ZEND_FETCH_OBJ_RW:
3421-
case ZEND_FETCH_OBJ_FUNC_ARG:
3422-
case ZEND_ASSIGN_OBJ:
3423-
case ZEND_ASSIGN_OBJ_OP:
3424-
case ZEND_ASSIGN_OBJ_REF:
3425-
case ZEND_PRE_INC_OBJ:
3426-
case ZEND_PRE_DEC_OBJ:
3427-
case ZEND_POST_INC_OBJ:
3428-
case ZEND_POST_DEC_OBJ:
3429-
tmp |= MAY_BE_ARRAY_OF_OBJECT;
3430-
break;
3431-
case ZEND_SEND_VAR_EX:
3432-
case ZEND_SEND_FUNC_ARG:
3433-
case ZEND_SEND_VAR_NO_REF:
3434-
case ZEND_SEND_VAR_NO_REF_EX:
3435-
case ZEND_SEND_REF:
3436-
case ZEND_ASSIGN_REF:
3437-
case ZEND_YIELD:
3438-
case ZEND_INIT_ARRAY:
3439-
case ZEND_ADD_ARRAY_ELEMENT:
3440-
case ZEND_RETURN_BY_REF:
3441-
case ZEND_VERIFY_RETURN_TYPE:
3442-
case ZEND_MAKE_REF:
3443-
tmp |= MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
3444-
break;
3445-
case ZEND_PRE_INC:
3446-
case ZEND_PRE_DEC:
3447-
case ZEND_POST_INC:
3448-
case ZEND_POST_DEC:
3449-
if (tmp & MAY_BE_ARRAY_OF_LONG) {
3450-
/* may overflow */
3451-
tmp |= MAY_BE_ARRAY_OF_DOUBLE;
3452-
} else if (!(tmp & (MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_DOUBLE))) {
3453-
tmp |= MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE;
3454-
}
3455-
break;
3456-
case ZEND_UNSET_DIM:
3457-
case ZEND_UNSET_OBJ:
3458-
case ZEND_FETCH_DIM_UNSET:
3459-
case ZEND_FETCH_OBJ_UNSET:
3460-
break;
3461-
default :
3462-
break;
3408+
if (opline->opcode == ZEND_FETCH_DIM_RW
3409+
|| opline->opcode == ZEND_FETCH_DIM_W
3410+
|| opline->opcode == ZEND_FETCH_DIM_FUNC_ARG
3411+
|| opline->opcode == ZEND_FETCH_LIST_W) {
3412+
j = ssa_vars[ssa_ops[i].result_def].use_chain;
3413+
while (j >= 0) {
3414+
switch (op_array->opcodes[j].opcode) {
3415+
case ZEND_FETCH_DIM_W:
3416+
case ZEND_FETCH_DIM_RW:
3417+
case ZEND_FETCH_DIM_FUNC_ARG:
3418+
case ZEND_FETCH_LIST_W:
3419+
case ZEND_ASSIGN_DIM:
3420+
case ZEND_ASSIGN_DIM_OP:
3421+
tmp |= MAY_BE_ARRAY | MAY_BE_ARRAY_OF_ARRAY;
3422+
break;
3423+
case ZEND_FETCH_OBJ_W:
3424+
case ZEND_FETCH_OBJ_RW:
3425+
case ZEND_FETCH_OBJ_FUNC_ARG:
3426+
case ZEND_ASSIGN_OBJ:
3427+
case ZEND_ASSIGN_OBJ_OP:
3428+
case ZEND_ASSIGN_OBJ_REF:
3429+
case ZEND_PRE_INC_OBJ:
3430+
case ZEND_PRE_DEC_OBJ:
3431+
case ZEND_POST_INC_OBJ:
3432+
case ZEND_POST_DEC_OBJ:
3433+
tmp |= MAY_BE_ARRAY_OF_OBJECT;
3434+
break;
3435+
case ZEND_SEND_VAR_EX:
3436+
case ZEND_SEND_FUNC_ARG:
3437+
case ZEND_SEND_VAR_NO_REF:
3438+
case ZEND_SEND_VAR_NO_REF_EX:
3439+
case ZEND_SEND_REF:
3440+
case ZEND_ASSIGN_REF:
3441+
case ZEND_YIELD:
3442+
case ZEND_INIT_ARRAY:
3443+
case ZEND_ADD_ARRAY_ELEMENT:
3444+
case ZEND_RETURN_BY_REF:
3445+
case ZEND_VERIFY_RETURN_TYPE:
3446+
case ZEND_MAKE_REF:
3447+
case ZEND_FE_RESET_RW:
3448+
tmp |= MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
3449+
break;
3450+
case ZEND_PRE_INC:
3451+
case ZEND_PRE_DEC:
3452+
case ZEND_POST_INC:
3453+
case ZEND_POST_DEC:
3454+
if (tmp & MAY_BE_ARRAY_OF_LONG) {
3455+
/* may overflow */
3456+
tmp |= MAY_BE_ARRAY_OF_DOUBLE;
3457+
} else if (!(tmp & (MAY_BE_ARRAY_OF_LONG|MAY_BE_ARRAY_OF_DOUBLE))) {
3458+
tmp |= MAY_BE_ARRAY_OF_LONG | MAY_BE_ARRAY_OF_DOUBLE;
3459+
}
3460+
break;
3461+
case ZEND_SEND_VAR:
3462+
/* This can occur if a DIM_FETCH_FUNC_ARG with UNUSED op2 is left
3463+
* behind, because it can't be converted to DIM_FETCH_R. */
3464+
break;
3465+
EMPTY_SWITCH_DEFAULT_CASE()
3466+
}
3467+
j = zend_ssa_next_use(ssa_ops, ssa_ops[i].result_def, j);
34633468
}
3464-
j = zend_ssa_next_use(ssa_ops, ssa_ops[i].result_def, j);
34653469
}
34663470
if ((tmp & MAY_BE_ARRAY) && (tmp & MAY_BE_ARRAY_KEY_ANY)) {
34673471
UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);

0 commit comments

Comments
 (0)