@@ -10672,13 +10672,24 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, cons
10672
10672
if (op1_info & MAY_BE_ARRAY_OF_REF) {
10673
10673
| ZVAL_DEREF r0, MAY_BE_REF
10674
10674
}
10675
- | IF_NOT_ZVAL_TYPE val_addr, type, &res_exit_addr
10676
- | // ZVAL_COPY
10677
- | ZVAL_COPY_VALUE res_addr, -1, val_addr, res_info, ZREG_R1, ZREG_R2
10678
- if (!(res_info & AVOID_REFCOUNTING)) {
10679
- | TRY_ADDREF res_info, ch, r2
10675
+ if ( type < IS_STRING) {
10676
+ | IF_NOT_ZVAL_TYPE val_addr, type, &res_exit_addr
10677
+ } else {
10678
+ | GET_ZVAL_TYPE_INFO edx, val_addr
10679
+ | IF_NOT_TYPE dl, type, &res_exit_addr
10680
10680
}
10681
- if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) {
10681
+ | // ZVAL_COPY
10682
+ | ZVAL_COPY_VALUE_V res_addr, -1, val_addr, res_info, ZREG_R0, ZREG_R1
10683
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
10684
+ if (type < IS_STRING) {
10685
+ | SET_ZVAL_TYPE_INFO res_addr, type
10686
+ } else {
10687
+ | SET_ZVAL_TYPE_INFO res_addr, edx
10688
+ if (!(res_info & AVOID_REFCOUNTING)) {
10689
+ | TRY_ADDREF res_info, dh, r1
10690
+ }
10691
+ }
10692
+ } else if (!zend_jit_store_var_if_necessary(Dst, opline->result.var, res_addr, res_info)) {
10682
10693
return 0;
10683
10694
}
10684
10695
} else if (op1_info & MAY_BE_ARRAY_OF_REF) {
@@ -11511,7 +11522,7 @@ static int zend_jit_fetch_obj(dasm_State **Dst, const zend_op *opline, const zen
11511
11522
| IF_NOT_TYPE dl, type, &exit_addr
11512
11523
}
11513
11524
| // ZVAL_COPY
11514
- | ZVAL_COPY_VALUE_V res_addr, -1, val_addr, res_info, ZREG_R2 , ZREG_R1
11525
+ | ZVAL_COPY_VALUE_V res_addr, -1, val_addr, res_info, ZREG_R0 , ZREG_R1
11515
11526
if (type < IS_STRING) {
11516
11527
| SET_ZVAL_TYPE_INFO res_addr, type
11517
11528
} else {
0 commit comments