@@ -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