@@ -3405,63 +3405,67 @@ static int zend_update_type_info(const zend_op_array *op_array,
3405
3405
tmp |= t1 & (MAY_BE_RC1 |MAY_BE_RCN );
3406
3406
}
3407
3407
}
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 );
3463
3468
}
3464
- j = zend_ssa_next_use (ssa_ops , ssa_ops [i ].result_def , j );
3465
3469
}
3466
3470
if ((tmp & MAY_BE_ARRAY ) && (tmp & MAY_BE_ARRAY_KEY_ANY )) {
3467
3471
UPDATE_SSA_TYPE (tmp , ssa_ops [i ].op1_def );
0 commit comments