Skip to content

Commit 7b26ba2

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: fetch_obj_003.phpt
Opcode ASSIGN_OBJ_OP is used for statement "$x->a += 2;". The updates in function zend_jit_assign_obj_op() are made to support this opcode.
1 parent 1d5e845 commit 7b26ba2

File tree

1 file changed

+130
-1
lines changed

1 file changed

+130
-1
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 130 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7127,7 +7127,136 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
71277127
ZEND_ASSERT(op1_info & MAY_BE_OBJECT);
71287128
ZEND_ASSERT(opline->result_type == IS_UNUSED);
71297129

7130-
| brk #0 // TODO
7130+
member = RT_CONSTANT(opline, opline->op2);
7131+
ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
7132+
name = Z_STR_P(member);
7133+
prop_info = zend_get_known_property_info(op_array, ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
7134+
7135+
if (opline->op1_type == IS_UNUSED || use_this) {
7136+
| brk #0 // TODO
7137+
| GET_ZVAL_PTR FCARG1x, this_addr, TMP1
7138+
} else {
7139+
if (opline->op1_type == IS_VAR
7140+
&& (op1_info & MAY_BE_INDIRECT)
7141+
&& Z_REG(op1_addr) == ZREG_FP) {
7142+
| brk #0 // TODO
7143+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
7144+
}
7145+
if (op1_info & MAY_BE_REF) {
7146+
| brk #0 // TODO
7147+
op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
7148+
}
7149+
if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) {
7150+
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
7151+
int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
7152+
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
7153+
7154+
if (!exit_addr) {
7155+
return 0;
7156+
}
7157+
| brk #0 // TODO
7158+
} else {
7159+
| brk #0 // TODO
7160+
}
7161+
}
7162+
| GET_ZVAL_PTR FCARG1x, op1_addr, TMP1
7163+
}
7164+
7165+
if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
7166+
prop_info = zend_get_known_property_info(op_array, trace_ce, name, opline->op1_type == IS_UNUSED, op_array->filename);
7167+
if (prop_info) {
7168+
ce = trace_ce;
7169+
ce_is_instanceof = 0;
7170+
if (!(op1_info & MAY_BE_CLASS_GUARD)) {
7171+
if (!zend_jit_class_guard(Dst, opline, trace_ce)) {
7172+
return 0;
7173+
}
7174+
if (ssa->var_info && ssa_op->op1_use >= 0) {
7175+
ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD;
7176+
ssa->var_info[ssa_op->op1_use].ce = ce;
7177+
ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof;
7178+
}
7179+
if (ssa->var_info && ssa_op->op1_def >= 0) {
7180+
ssa->var_info[ssa_op->op1_def].type |= MAY_BE_CLASS_GUARD;
7181+
ssa->var_info[ssa_op->op1_def].ce = ce;
7182+
ssa->var_info[ssa_op->op1_def].is_instanceof = ce_is_instanceof;
7183+
}
7184+
}
7185+
}
7186+
}
7187+
7188+
if (!prop_info) {
7189+
needs_slow_path = 1;
7190+
7191+
| brk #0 // TODO
7192+
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
7193+
} else {
7194+
prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, prop_info->offset);
7195+
if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
7196+
int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
7197+
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
7198+
7199+
if (!exit_addr) {
7200+
return 0;
7201+
}
7202+
| brk #0 // TODO
7203+
} else {
7204+
| LOAD_32BIT_VAL TMP1w, (prop_info->offset + 8)
7205+
| ldrb TMP2w, [FCARG1x, TMP1]
7206+
| IF_TYPE TMP2w, IS_UNDEF, >7
7207+
needs_slow_path = 1;
7208+
}
7209+
if (ZEND_TYPE_IS_SET(prop_info->type)) {
7210+
uint32_t info = val_info;
7211+
7212+
| brk #0 // TODO
7213+
}
7214+
}
7215+
7216+
if (!prop_info || !ZEND_TYPE_IS_SET(prop_info->type)) {
7217+
zend_jit_addr var_addr = prop_addr;
7218+
uint32_t var_info = MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN;
7219+
uint32_t var_def_info = MAY_BE_ANY|MAY_BE_REF|MAY_BE_RC1|MAY_BE_RCN;
7220+
7221+
var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
7222+
| brk #0
7223+
}
7224+
7225+
if (needs_slow_path) {
7226+
|.cold_code
7227+
|7:
7228+
| SET_EX_OPLINE opline, REG0
7229+
| // value = zobj->handlers->write_property(zobj, name, value, CACHE_ADDR(opline->extended_value));
7230+
| LOAD_ADDR FCARG2x, name
7231+
| LOAD_ZVAL_ADDR CARG3, val_addr
7232+
| ldr CARG4, EX->run_time_cache
7233+
| LOAD_32BIT_VAL TMP1w, (opline+1)->extended_value
7234+
| add CARG4, CARG4, TMP1
7235+
| LOAD_ADDR CARG5, binary_op
7236+
| EXT_CALL zend_jit_assign_obj_op_helper, REG0
7237+
7238+
if (val_info & (MAY_BE_REF|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
7239+
val_info |= MAY_BE_RC1|MAY_BE_RCN;
7240+
}
7241+
7242+
|8:
7243+
| // FREE_OP_DATA();
7244+
| FREE_OP (opline+1)->op1_type, (opline+1)->op1, val_info, 0, opline
7245+
| b >9
7246+
|.code
7247+
}
7248+
7249+
|9:
7250+
if (opline->op1_type != IS_UNUSED && !use_this && !op1_indirect) {
7251+
| FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
7252+
}
7253+
7254+
if (may_throw) {
7255+
if (!zend_jit_check_exception(Dst)) {
7256+
return 0;
7257+
}
7258+
}
7259+
71317260
return 1;
71327261
}
71337262

0 commit comments

Comments
 (0)