@@ -5341,7 +5341,7 @@ static int zend_jit_concat(dasm_State **Dst, const zend_op *opline, uint32_t op1
5341
5341
return zend_jit_concat_helper(Dst, opline, opline->op1_type, opline->op1, op1_addr, op1_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr, may_throw);
5342
5342
}
5343
5343
5344
- static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_op *opline, uint32_t type, uint32_t op1_info, uint32_t op2_info, const void *found_exit_addr, const void *not_found_exit_addr, const void *exit_addr)
5344
+ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_op *opline, uint32_t type, uint32_t op1_info, uint32_t op2_info, uint8_t dim_type, const void *found_exit_addr, const void *not_found_exit_addr, const void *exit_addr)
5345
5345
/* Labels: 1,2,3,4,5 */
5346
5346
{
5347
5347
zend_jit_addr op2_addr = OP2_ADDR();
@@ -5401,6 +5401,12 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
5401
5401
}
5402
5402
packed_loaded = 1;
5403
5403
}
5404
+
5405
+ if (dim_type == IS_UNDEF && type == BP_VAR_W && packed_loaded) {
5406
+ /* don't generate "fast" code for packed array */
5407
+ packed_loaded = 0;
5408
+ }
5409
+
5404
5410
if (packed_loaded) {
5405
5411
| // ZEND_HASH_INDEX_FIND(ht, hval, retval, num_undef);
5406
5412
if (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) {
@@ -5578,15 +5584,15 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
5578
5584
if (packed_loaded) {
5579
5585
| IF_NOT_Z_TYPE r0, IS_UNDEF, >8
5580
5586
}
5581
- if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded) {
5587
+ // if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (op1_info & MAY_BE_ARRAY_NUMERIC_HASH) || packed_loaded) {
5582
5588
|2:
5583
5589
|4:
5584
5590
if (!op2_loaded) {
5585
5591
| // hval = Z_LVAL_P(dim);
5586
5592
| GET_ZVAL_LVAL ZREG_FCARG2, op2_addr
5587
5593
}
5588
5594
| EXT_CALL zend_hash_index_lookup, r0
5589
- }
5595
+ // }
5590
5596
break;
5591
5597
default:
5592
5598
ZEND_UNREACHABLE();
@@ -6178,7 +6184,7 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
6178
6184
return 1;
6179
6185
}
6180
6186
6181
- static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t val_info, int may_throw)
6187
+ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t val_info, uint8_t dim_type, int may_throw)
6182
6188
{
6183
6189
zend_jit_addr op2_addr, op3_addr, res_addr;
6184
6190
@@ -6274,7 +6280,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t
6274
6280
uint32_t var_info = zend_array_element_type(op1_info, opline->op1_type, 0, 0);
6275
6281
zend_jit_addr var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0);
6276
6282
6277
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_W, op1_info, op2_info, NULL, NULL, NULL)) {
6283
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_W, op1_info, op2_info, dim_type, NULL, NULL, NULL)) {
6278
6284
return 0;
6279
6285
}
6280
6286
@@ -6404,7 +6410,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, uint32_t
6404
6410
return 1;
6405
6411
}
6406
6412
6407
- static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t op1_data_info, zend_ssa_range *op1_data_range, int may_throw)
6413
+ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, uint32_t op1_def_info, zend_jit_addr op1_addr, uint32_t op2_info, uint32_t op1_data_info, zend_ssa_range *op1_data_range, uint8_t dim_type, int may_throw)
6408
6414
{
6409
6415
zend_jit_addr op2_addr, op3_addr, var_addr;
6410
6416
@@ -6506,7 +6512,7 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3
6506
6512
var_info |= MAY_BE_RC1;
6507
6513
}
6508
6514
6509
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_RW, op1_info, op2_info, NULL, NULL, NULL)) {
6515
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_VAR_RW, op1_info, op2_info, dim_type, NULL, NULL, NULL)) {
6510
6516
return 0;
6511
6517
}
6512
6518
@@ -11553,7 +11559,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst,
11553
11559
}
11554
11560
}
11555
11561
| GET_ZVAL_LVAL ZREG_FCARG1, op1_addr
11556
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode != ZEND_FETCH_DIM_IS) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, res_exit_addr, not_found_exit_addr, exit_addr)) {
11562
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode != ZEND_FETCH_DIM_IS) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, IS_UNKNOWN, res_exit_addr, not_found_exit_addr, exit_addr)) {
11557
11563
return 0;
11558
11564
}
11559
11565
}
@@ -11870,7 +11876,7 @@ static int zend_jit_fetch_dim(dasm_State **Dst,
11870
11876
ZEND_UNREACHABLE();
11871
11877
}
11872
11878
11873
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, type, op1_info, op2_info, NULL, NULL, NULL)) {
11879
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, type, op1_info, op2_info, IS_UNKNOWN, NULL, NULL, NULL)) {
11874
11880
return 0;
11875
11881
}
11876
11882
@@ -12000,7 +12006,7 @@ static int zend_jit_isset_isempty_dim(dasm_State **Dst,
12000
12006
not_found_exit_addr = exit_addr;
12001
12007
}
12002
12008
}
12003
- if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_JIT_IS, op1_info, op2_info, found_exit_addr, not_found_exit_addr, NULL)) {
12009
+ if (!zend_jit_fetch_dimension_address_inner(Dst, opline, BP_JIT_IS, op1_info, op2_info, IS_UNKNOWN, found_exit_addr, not_found_exit_addr, NULL)) {
12004
12010
return 0;
12005
12011
}
12006
12012
0 commit comments