@@ -12739,10 +12739,19 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
12739
12739
}
12740
12740
} else if (flags == ZEND_FETCH_REF) {
12741
12741
| IF_TYPE dl, IS_REFERENCE, >1
12742
+ if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) {
12743
+ | LOAD_ADDR FCARG2a, prop_info
12744
+ } else {
12745
+ int prop_info_offset =
12746
+ (((prop_info->offset - (sizeof(zend_object) - sizeof(zval))) / sizeof(zval)) * sizeof(void*));
12747
+
12748
+ | mov r0, aword [FCARG1a + offsetof(zend_object, ce)]
12749
+ | mov r0, aword [r0 + offsetof(zend_class_entry, properties_info_table)]
12750
+ | mov FCARG2a, aword[r0 + prop_info_offset]
12751
+ }
12742
12752
if (Z_REG(prop_addr) != ZREG_FCARG1a || Z_OFFSET(prop_addr) != 0) {
12743
12753
| LOAD_ZVAL_ADDR FCARG1a, prop_addr
12744
12754
}
12745
- | LOAD_ADDR FCARG2a, prop_info
12746
12755
|.if X64
12747
12756
| LOAD_ZVAL_ADDR CARG3, res_addr
12748
12757
|.else
@@ -13466,8 +13475,32 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
13466
13475
if (ZEND_TYPE_IS_SET(prop_info->type)) {
13467
13476
uint32_t info = val_info;
13468
13477
13478
+ if (opline) {
13479
+ | SET_EX_OPLINE opline, r0
13480
+ }
13481
+
13482
+ | IF_ZVAL_TYPE prop_addr, IS_REFERENCE, >1
13483
+ |.cold_code
13484
+ |1:
13485
+ | GET_ZVAL_PTR FCARG1a, prop_addr
13486
+ if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2a || Z_OFFSET(val_addr) != 0) {
13487
+ | LOAD_ZVAL_ADDR FCARG2a, val_addr
13488
+ }
13489
+ |.if X64
13490
+ | LOAD_ADDR CARG3, binary_op
13491
+ |.else
13492
+ | sub r4, 12
13493
+ | PUSH_ADDR binary_op, r0
13494
+ |.endif
13495
+ | EXT_CALL zend_jit_assign_op_to_typed_ref, r0
13496
+ |.if not(X64)
13497
+ | add r4, 12
13498
+ |.endif
13499
+ | jmp >9
13500
+ |.code
13501
+
13469
13502
| // value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
13470
- | SET_EX_OPLINE opline, r0
13503
+
13471
13504
if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) {
13472
13505
| LOAD_ADDR FCARG2a, prop_info
13473
13506
} else {
0 commit comments