@@ -3176,7 +3176,39 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
31763176 zend_jit_addr val_addr,
31773177 bool check_exception)
31783178{
3179+ | // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
3180+ | ldr TMP1, [FCARG1x, #offsetof(zend_reference, sources.ptr)]
3181+ | cmp TMP1, #0
3182+ | bne >2
3183+ |.cold_code
3184+ |2:
31793185 | brk #0 // TODO
3186+ if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2x || Z_OFFSET(val_addr) != 0) {
3187+ | LOAD_ZVAL_ADDR FCARG2x, val_addr
3188+ }
3189+ if (opline) {
3190+ | SET_EX_OPLINE opline, REG0
3191+ }
3192+ if (val_type == IS_CONST) {
3193+ | EXT_CALL zend_jit_assign_const_to_typed_ref, REG0
3194+ } else if (val_type == IS_TMP_VAR) {
3195+ | EXT_CALL zend_jit_assign_tmp_to_typed_ref, REG0
3196+ } else if (val_type == IS_VAR) {
3197+ | EXT_CALL zend_jit_assign_var_to_typed_ref, REG0
3198+ } else if (val_type == IS_CV) {
3199+ | EXT_CALL zend_jit_assign_cv_to_typed_ref, REG0
3200+ } else {
3201+ ZEND_UNREACHABLE();
3202+ }
3203+ if (check_exception) {
3204+ | // if (UNEXPECTED(EG(exception) != NULL)) {
3205+ | MEM_LOAD_CMP_ZTS ldr, xzr, executor_globals, exception, REG0, TMP1
3206+ | beq >8 // END OF zend_jit_assign_to_variable()
3207+ | b ->exception_handler
3208+ } else {
3209+ | b >8
3210+ }
3211+ |.code
31803212
31813213 return 1;
31823214}
@@ -3214,7 +3246,89 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
32143246 int done = 0;
32153247 zend_reg ref_reg, tmp_reg;
32163248
3217- | brk #0 // TODO
3249+ if (Z_MODE(var_addr) == IS_REG || Z_REG(var_use_addr) != ZREG_REG0) {
3250+ ref_reg = ZREG_FCARG1x;
3251+ tmp_reg = ZREG_REG0;
3252+ } else {
3253+ /* ASSIGN_DIM */
3254+ ref_reg = ZREG_REG0;
3255+ tmp_reg = ZREG_FCARG1x;
3256+ }
3257+
3258+ if (var_info & MAY_BE_REF) {
3259+ if (Z_MODE(var_use_addr) != IS_MEM_ZVAL || Z_REG(var_use_addr) != ref_reg || Z_OFFSET(var_use_addr) != 0) {
3260+ | LOAD_ZVAL_ADDR Rx(ref_reg), var_use_addr
3261+ var_addr = var_use_addr = ZEND_ADDR_MEM_ZVAL(ref_reg, 0);
3262+ }
3263+ | // if (Z_ISREF_P(variable_ptr)) {
3264+ | IF_NOT_Z_TYPE Rx(ref_reg), IS_REFERENCE, >1, TMP1w
3265+ | // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
3266+ | GET_Z_PTR FCARG1x, Rx(ref_reg)
3267+ if (!zend_jit_assign_to_typed_ref(Dst, opline, val_type, val_addr, check_exception)) {
3268+ return 0;
3269+ }
3270+ | add Rx(ref_reg), FCARG1x, #offsetof(zend_reference, val)
3271+ |1:
3272+ }
3273+ if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
3274+ if (RC_MAY_BE_1(var_info)) {
3275+ int in_cold = 0;
3276+
3277+ if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
3278+ | IF_ZVAL_REFCOUNTED var_use_addr, >1, TMP1w, TMP2
3279+ |.cold_code
3280+ |1:
3281+ | brk #0 // TODO
3282+ in_cold = 1;
3283+ }
3284+ if (Z_REG(var_use_addr) == ZREG_FCARG1x || Z_REG(var_use_addr) == ZREG_REG0) {
3285+ bool keep_gc = 0;
3286+
3287+ | brk #0 // TODO
3288+ } else {
3289+ | brk #0 // TODO
3290+ | GET_ZVAL_PTR FCARG1x, var_use_addr, TMP1
3291+ if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, in_cold, 1)) {
3292+ return 0;
3293+ }
3294+ }
3295+ | GC_DELREF FCARG1x, TMP1w
3296+ if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) {
3297+ | brk #0 // TODO
3298+ } else {
3299+ | brk #0 // TODO
3300+ }
3301+ | ZVAL_DTOR_FUNC var_info, opline, TMP1
3302+ if (in_cold || (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0)) {
3303+ if (check_exception) {
3304+ | brk #0 // TODO
3305+ } else {
3306+ | brk #0 // TODO
3307+ }
3308+ }
3309+ if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) {
3310+ |4:
3311+ | brk #0 // TODO
3312+ if (in_cold) {
3313+ | brk #0 // TODO
3314+ }
3315+ }
3316+ if (in_cold) {
3317+ |.code
3318+ } else {
3319+ done = 1;
3320+ }
3321+ } else /* if (RC_MAY_BE_N(var_info)) */ {
3322+ | brk #0
3323+ }
3324+ }
3325+
3326+ if (!done && !zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, 0, 0)) {
3327+ return 0;
3328+ }
3329+
3330+ |8:
3331+
32183332 return 1;
32193333}
32203334
0 commit comments