@@ -3176,7 +3176,39 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
3176
3176
zend_jit_addr val_addr,
3177
3177
bool check_exception)
3178
3178
{
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:
3179
3185
| 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
3180
3212
3181
3213
return 1;
3182
3214
}
@@ -3214,7 +3246,89 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
3214
3246
int done = 0;
3215
3247
zend_reg ref_reg, tmp_reg;
3216
3248
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
+
3218
3332
return 1;
3219
3333
}
3220
3334
0 commit comments