@@ -6049,7 +6049,202 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
6049
6049
ZEND_ASSERT(opline->op2_type == IS_CONST);
6050
6050
ZEND_ASSERT(op1_info & MAY_BE_OBJECT);
6051
6051
6052
- | brk #0 // TODO
6052
+ member = RT_CONSTANT(opline, opline->op2);
6053
+ ZEND_ASSERT(Z_TYPE_P(member) == IS_STRING && Z_STRVAL_P(member)[0] != '\0');
6054
+ prop_info = zend_get_known_property_info(op_array, ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
6055
+
6056
+ if (opline->op1_type == IS_UNUSED || use_this) {
6057
+ | brk #0 // TODO
6058
+ | GET_ZVAL_PTR FCARG1x, this_addr, TMP1
6059
+ } else {
6060
+ if (opline->op1_type == IS_VAR
6061
+ && opline->opcode == ZEND_FETCH_OBJ_W
6062
+ && (op1_info & MAY_BE_INDIRECT)
6063
+ && Z_REG(op1_addr) == ZREG_FP) {
6064
+ | brk #0 // TODO
6065
+ |1:
6066
+ op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
6067
+ }
6068
+ if (op1_info & MAY_BE_REF) {
6069
+ if (Z_REG(op1_addr) != ZREG_FCARG1x || Z_OFFSET(op1_addr) != 0) {
6070
+ | LOAD_ZVAL_ADDR FCARG1x, op1_addr
6071
+ }
6072
+ | ZVAL_DEREF FCARG1x, op1_info, TMP1w
6073
+ op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
6074
+ }
6075
+ if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY)- MAY_BE_OBJECT)) {
6076
+ if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
6077
+ int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
6078
+ const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
6079
+
6080
+ if (!exit_addr) {
6081
+ return 0;
6082
+ }
6083
+ | brk #0 // TODO
6084
+ } else {
6085
+ | IF_NOT_ZVAL_TYPE op1_addr, IS_OBJECT, >7, TMP1w, TMP2
6086
+ }
6087
+ }
6088
+ | GET_ZVAL_PTR FCARG1x, op1_addr, TMP1
6089
+ }
6090
+
6091
+ if (!prop_info && trace_ce && (trace_ce->ce_flags & ZEND_ACC_IMMUTABLE)) {
6092
+ prop_info = zend_get_known_property_info(op_array, trace_ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
6093
+ if (prop_info) {
6094
+ ce = trace_ce;
6095
+ ce_is_instanceof = 0;
6096
+ if (!(op1_info & MAY_BE_CLASS_GUARD)) {
6097
+ if (!zend_jit_class_guard(Dst, opline, trace_ce)) {
6098
+ return 0;
6099
+ }
6100
+ if (ssa->var_info && ssa_op->op1_use >= 0) {
6101
+ ssa->var_info[ssa_op->op1_use].type |= MAY_BE_CLASS_GUARD;
6102
+ ssa->var_info[ssa_op->op1_use].ce = ce;
6103
+ ssa->var_info[ssa_op->op1_use].is_instanceof = ce_is_instanceof;
6104
+ }
6105
+ }
6106
+ }
6107
+ }
6108
+
6109
+ if (!prop_info) {
6110
+ | ldr REG0, EX->run_time_cache
6111
+ | LOAD_32BIT_VAL TMP1, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS)
6112
+ | add TMP1, TMP1, REG0
6113
+ | ldr REG2, [TMP1]
6114
+ | ldr TMP1, [FCARG1x, #offsetof(zend_object, ce)]
6115
+ | cmp REG2, TMP1
6116
+ | bne >5
6117
+ | brk #0 // TODO: currently jump to Label 5.
6118
+ | LOAD_32BIT_VAL TMP1, (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*)
6119
+ | add TMP1, TMP1, REG0
6120
+ | ldr REG0, [TMP1]
6121
+ may_be_dynamic = zend_may_be_dynamic_property(ce, Z_STR_P(member), opline->op1_type == IS_UNUSED, op_array->filename);
6122
+ if (may_be_dynamic) {
6123
+ | brk #0 // TODO
6124
+ | tst REG0, REG0
6125
+ if (opline->opcode == ZEND_FETCH_OBJ_W) {
6126
+ | brk #0 // TODO
6127
+ | blt >5
6128
+ } else {
6129
+ | brk #0 // TODO
6130
+ | blt >8 // dynamic property
6131
+ }
6132
+ }
6133
+ | brk #0 // TODO
6134
+ prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, 0);
6135
+ if (opline->opcode == ZEND_FETCH_OBJ_W
6136
+ && (opline->extended_value & ZEND_FETCH_OBJ_FLAGS)
6137
+ && (!ce || ce_is_instanceof || (ce->ce_flags & ZEND_ACC_HAS_TYPE_HINTS))) {
6138
+ uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
6139
+
6140
+ | brk #0 // TODO
6141
+ |.cold_code
6142
+ |1:
6143
+ | brk #0 // TODO
6144
+ |.code
6145
+ }
6146
+ } else {
6147
+ prop_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1x, prop_info->offset);
6148
+ | brk #0 // TODO
6149
+ }
6150
+ if (op1_avoid_refcounting) {
6151
+ SET_STACK_REG(JIT_G(current_frame)->stack,
6152
+ EX_VAR_TO_NUM(opline->op1.var), ZREG_NONE);
6153
+ }
6154
+
6155
+ if (opline->opcode == ZEND_FETCH_OBJ_W) {
6156
+ if (Z_REG(prop_addr) != ZREG_FCARG1x || Z_OFFSET(prop_addr) != 0) {
6157
+ | brk #0 // TODO
6158
+ | LOAD_ZVAL_ADDR FCARG1x, prop_addr
6159
+ }
6160
+ | brk #0 // TODO
6161
+ | SET_ZVAL_PTR res_addr, FCARG1x, TMP1
6162
+ | SET_ZVAL_TYPE_INFO res_addr, IS_INDIRECT, TMP1w, TMP2
6163
+ if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && prop_info) {
6164
+ ssa->var_info[ssa_op->result_def].indirect_reference = 1;
6165
+ }
6166
+ } else {
6167
+ bool result_avoid_refcounting = 0;
6168
+
6169
+ if ((res_info & MAY_BE_GUARD) && JIT_G(current_frame) && prop_info) {
6170
+ uint32_t flags = 0;
6171
+ uint32_t old_info;
6172
+ zend_jit_trace_stack *stack = JIT_G(current_frame)->stack;
6173
+ int32_t exit_point;
6174
+ const void *exit_addr;
6175
+ zend_uchar type;
6176
+ zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
6177
+
6178
+ if ((opline->op1_type & (IS_VAR|IS_TMP_VAR))
6179
+ && !use_this
6180
+ && !op1_avoid_refcounting) {
6181
+ flags = ZEND_JIT_EXIT_FREE_OP1;
6182
+ }
6183
+
6184
+ | brk #0 // TODO
6185
+ } else {
6186
+ if (!zend_jit_zval_copy_deref(Dst, res_addr, prop_addr, ZREG_REG2)) {
6187
+ return 0;
6188
+ }
6189
+ }
6190
+ }
6191
+
6192
+ |.cold_code
6193
+
6194
+ if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE || !prop_info) {
6195
+ |5:
6196
+ | SET_EX_OPLINE opline, REG0
6197
+ if (opline->opcode == ZEND_FETCH_OBJ_W) {
6198
+ | brk #0 // TODO
6199
+ | EXT_CALL zend_jit_fetch_obj_w_slow, REG0
6200
+ } else if (opline->opcode != ZEND_FETCH_OBJ_IS) {
6201
+ | EXT_CALL zend_jit_fetch_obj_r_slow, REG0
6202
+ } else {
6203
+ | brk #0 // TODO
6204
+ | EXT_CALL zend_jit_fetch_obj_is_slow, REG0
6205
+ }
6206
+ | b >9
6207
+ }
6208
+
6209
+ if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
6210
+ |7:
6211
+ | brk #0 // TODO
6212
+ }
6213
+
6214
+ if (!prop_info
6215
+ && may_be_dynamic
6216
+ && opline->opcode != ZEND_FETCH_OBJ_W) {
6217
+ |8:
6218
+ | brk #0 // TODO
6219
+ }
6220
+
6221
+ |.code;
6222
+ |9: // END
6223
+ if (opline->op1_type != IS_UNUSED && !use_this && !op1_indirect) {
6224
+ if (opline->op1_type == IS_VAR
6225
+ && opline->opcode == ZEND_FETCH_OBJ_W
6226
+ && (op1_info & MAY_BE_RC1)) {
6227
+ zend_jit_addr orig_op1_addr = OP1_ADDR();
6228
+
6229
+ | brk #0 // TODO
6230
+ } else if (!op1_avoid_refcounting) {
6231
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 1, opline
6232
+ }
6233
+ }
6234
+
6235
+ if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE
6236
+ && prop_info
6237
+ && opline->op1_type != IS_VAR
6238
+ && opline->op1_type != IS_TMP_VAR) {
6239
+ may_throw = 0;
6240
+ }
6241
+
6242
+ if (may_throw) {
6243
+ if (!zend_jit_check_exception(Dst)) {
6244
+ return 0;
6245
+ }
6246
+ }
6247
+
6053
6248
return 1;
6054
6249
}
6055
6250
0 commit comments