@@ -7127,7 +7127,136 @@ static int zend_jit_assign_obj_op(dasm_State **Dst,
7127
7127
ZEND_ASSERT(op1_info & MAY_BE_OBJECT);
7128
7128
ZEND_ASSERT(opline->result_type == IS_UNUSED);
7129
7129
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
+
7131
7260
return 1;
7132
7261
}
7133
7262
0 commit comments