@@ -6049,7 +6049,202 @@ static int zend_jit_fetch_obj(dasm_State **Dst,
60496049 ZEND_ASSERT(opline->op2_type == IS_CONST);
60506050 ZEND_ASSERT(op1_info & MAY_BE_OBJECT);
60516051
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+
60536248 return 1;
60546249}
60556250
0 commit comments