Skip to content

Commit 45e2b9a

Browse files
committed
Fixed support for typed references
1 parent 682357c commit 45e2b9a

File tree

1 file changed

+35
-2
lines changed

1 file changed

+35
-2
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12739,10 +12739,19 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
1273912739
}
1274012740
} else if (flags == ZEND_FETCH_REF) {
1274112741
| 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+
}
1274212752
if (Z_REG(prop_addr) != ZREG_FCARG1a || Z_OFFSET(prop_addr) != 0) {
1274312753
| LOAD_ZVAL_ADDR FCARG1a, prop_addr
1274412754
}
12745-
| LOAD_ADDR FCARG2a, prop_info
1274612755
|.if X64
1274712756
| LOAD_ZVAL_ADDR CARG3, res_addr
1274812757
|.else
@@ -13466,8 +13475,32 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
1346613475
if (ZEND_TYPE_IS_SET(prop_info->type)) {
1346713476
uint32_t info = val_info;
1346813477

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+
1346913502
| // value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
13470-
| SET_EX_OPLINE opline, r0
13503+
1347113504
if (ce && ce->ce_flags & ZEND_ACC_IMMUTABLE) {
1347213505
| LOAD_ADDR FCARG2a, prop_info
1347313506
} else {

0 commit comments

Comments
 (0)