@@ -3302,7 +3302,20 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
3302
3302
case BP_VAR_IS:
3303
3303
case BP_VAR_UNSET:
3304
3304
if (packed_loaded) {
3305
- | brk #0 // TODO
3305
+ if (op1_info & MAY_BE_ARRAY_HASH) {
3306
+ | IF_NOT_Z_TYPE REG0, IS_UNDEF, >8, TMP1w
3307
+ } else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) {
3308
+ /* perform IS_UNDEF check only after result type guard (during deoptimization) */
3309
+ if (!found_exit_addr || (op1_info & MAY_BE_ARRAY_HASH)) {
3310
+ | brk #0 // TODO
3311
+ }
3312
+ } else if (type == BP_VAR_IS && not_found_exit_addr) {
3313
+ | brk #0 // TODO
3314
+ } else if (type == BP_VAR_IS && found_exit_addr) {
3315
+ | brk #0 // TODO
3316
+ } else {
3317
+ | brk #0 // TODO
3318
+ }
3306
3319
}
3307
3320
if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (packed_loaded && (op1_info & MAY_BE_ARRAY_HASH))) {
3308
3321
| brk #0 // TODO
@@ -3331,7 +3344,19 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
3331
3344
|.code
3332
3345
break;
3333
3346
case BP_VAR_RW:
3334
- | brk #0 // TODO
3347
+ if (packed_loaded) {
3348
+ | brk #0 // TODO
3349
+ }
3350
+ |2:
3351
+ |4:
3352
+ if (!op2_loaded) {
3353
+ | // hval = Z_LVAL_P(dim);
3354
+ | GET_ZVAL_LVAL ZREG_FCARG2x, op2_addr, TMP1
3355
+ }
3356
+ | SET_EX_OPLINE opline, REG0
3357
+ | EXT_CALL zend_jit_hash_index_lookup_rw, REG0
3358
+ | mov REG0, RETVALx
3359
+ | cbz REG0, >9
3335
3360
break;
3336
3361
case BP_VAR_W:
3337
3362
if (packed_loaded) {
@@ -6073,7 +6098,28 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
6073
6098
}
6074
6099
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
6075
6100
(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
6076
- | brk #0 // TODO: test
6101
+ if (return_value_used == -1) {
6102
+ | beq >1
6103
+ |.cold_code
6104
+ |1:
6105
+ }
6106
+ if (return_value_used != 1) {
6107
+ if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
6108
+ | brk #0 // TODO
6109
+ }
6110
+ | brk #0 // TODO
6111
+ if (RC_MAY_BE_1(op1_info)) {
6112
+ | brk #0 // TODO
6113
+ }
6114
+ if (return_value_used == -1) {
6115
+ if (jit_return_label >= 0) {
6116
+ | brk #0 // TODO
6117
+ } else {
6118
+ | brk #0 // TODO
6119
+ }
6120
+ |.code
6121
+ }
6122
+ }
6077
6123
} else if (return_value_used == -1) {
6078
6124
if (jit_return_label >= 0) {
6079
6125
| brk #0 // TODO: test
@@ -6095,7 +6141,7 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
6095
6141
| brk #0 // TODO: test
6096
6142
}
6097
6143
} else if (opline->op1_type == IS_TMP_VAR) {
6098
- | brk #0 // TODO
6144
+ | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
6099
6145
} else if (opline->op1_type == IS_CV) {
6100
6146
if (op1_info & MAY_BE_REF) {
6101
6147
| brk #0 // TODO
@@ -6359,7 +6405,14 @@ static int zend_jit_fetch_dim(dasm_State **Dst,
6359
6405
}
6360
6406
if ((op1_info & MAY_BE_UNDEF)
6361
6407
&& opline->opcode == ZEND_FETCH_DIM_RW) {
6362
- | brk #0 // TODO
6408
+ if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) {
6409
+ | brk #0 // TODO
6410
+ | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1, TMP1w, TMP2
6411
+ }
6412
+ | SET_EX_OPLINE opline, REG0
6413
+ | LOAD_32BIT_VAL FCARG1w, opline->op1.var
6414
+ | EXT_CALL zend_jit_undefined_op_helper, REG0
6415
+ |1:
6363
6416
}
6364
6417
| // ZVAL_ARR(container, zend_new_array(8));
6365
6418
if (Z_REG(op1_addr) != ZREG_FP) {
0 commit comments