Skip to content

Commit fe94eb4

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: fetch_obj_004.phpt
Opcode ASSIGN_OBJ is generated for statement "$x->a = 1;" and one new path in function zend_jit_assign_obj() is covered. Note that function zend_jit_assign_to_variable_call() is invoked along this new path. Besides, helper function zend_objects_store_del() is used as the dtor for objects.
1 parent 6ae4196 commit fe94eb4

File tree

1 file changed

+54
-4
lines changed

1 file changed

+54
-4
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ static void* dasm_labels[zend_lb_MAX];
10111011
|| if (opline) {
10121012
| brk #0 // TODO
10131013
|| }
1014-
| brk #0 // TODO
1014+
| EXT_CALL zend_objects_store_del, REG0
10151015
|| break;
10161016
|| }
10171017
|| }
@@ -1833,14 +1833,15 @@ static int zend_jit_assign_tmp_stub(dasm_State **Dst)
18331833
uint32_t val_info = MAY_BE_ANY|MAY_BE_RC1|MAY_BE_RCN;
18341834

18351835
|->assign_tmp:
1836-
| brk #0 // TODO
1836+
| sub sp, sp, #16
18371837
if (!zend_jit_assign_to_variable(
18381838
Dst, NULL,
18391839
var_addr, var_addr, -1, -1,
18401840
IS_TMP_VAR, val_addr, val_info,
18411841
0, 0)) {
18421842
return 0;
18431843
}
1844+
| add sp, sp, #16
18441845
| ret
18451846
return 1;
18461847
}
@@ -3673,7 +3674,36 @@ static int zend_jit_assign_to_variable_call(dasm_State **Dst,
36733674
zend_jit_addr __res_addr,
36743675
bool __check_exception)
36753676
{
3676-
| brk #0 // TODO
3677+
if (Z_MODE(var_addr) != IS_MEM_ZVAL || Z_REG(var_addr) != ZREG_FCARG1x || Z_OFFSET(var_addr) != 0) {
3678+
| LOAD_ZVAL_ADDR FCARG1x, var_addr
3679+
}
3680+
if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2x || Z_OFFSET(val_addr) != 0) {
3681+
| LOAD_ZVAL_ADDR FCARG2x, val_addr
3682+
}
3683+
if (opline) {
3684+
| SET_EX_OPLINE opline, REG0
3685+
}
3686+
if (!(val_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
3687+
| bl ->assign_tmp
3688+
} else if (val_type == IS_CONST) {
3689+
| brk #0 // TODO
3690+
} else if (val_type == IS_TMP_VAR) {
3691+
| brk #0 // TODO
3692+
} else if (val_type == IS_VAR) {
3693+
if (!(val_info & MAY_BE_REF)) {
3694+
| brk #0 // TODO
3695+
} else {
3696+
| brk #0 // TODO
3697+
}
3698+
} else if (val_type == IS_CV) {
3699+
if (!(val_info & MAY_BE_REF)) {
3700+
| brk #0 // TODO
3701+
} else {
3702+
| brk #0 // TODO
3703+
}
3704+
} else {
3705+
ZEND_UNREACHABLE();
3706+
}
36773707

36783708
return 1;
36793709
}
@@ -7151,7 +7181,27 @@ static int zend_jit_assign_obj(dasm_State **Dst,
71517181
}
71527182
} else {
71537183
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, prop_info->offset);
7154-
| brk #0 // TODO
7184+
if (!ce || ce_is_instanceof || !(ce->ce_flags & ZEND_ACC_IMMUTABLE) || ce->__get || ce->__set) {
7185+
// Undefined property with magic __get()/__set()
7186+
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
7187+
int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
7188+
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
7189+
7190+
if (!exit_addr) {
7191+
return 0;
7192+
}
7193+
| brk #0 // TODO
7194+
} else {
7195+
| brk #0 // TODO
7196+
needs_slow_path = 1;
7197+
}
7198+
}
7199+
if (ZEND_TYPE_IS_SET(prop_info->type)) {
7200+
uint32_t info = val_info;
7201+
7202+
| // value = zend_assign_to_typed_prop(prop_info, property_val, value EXECUTE_DATA_CC);
7203+
| brk #0 // TODO
7204+
}
71557205
}
71567206

71577207
if (!prop_info || !ZEND_TYPE_IS_SET(prop_info->type)) {

0 commit comments

Comments
 (0)