@@ -5291,7 +5291,8 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
5291
5291
znode_op val,
5292
5292
zend_jit_addr val_addr,
5293
5293
uint32_t val_info,
5294
- zend_jit_addr res_addr)
5294
+ zend_jit_addr res_addr,
5295
+ zend_bool check_exception)
5295
5296
/* Labels: 1,2,3,4,5,8 */
5296
5297
{
5297
5298
int done = 0;
@@ -5361,14 +5362,24 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
5361
5362
| jnz >8
5362
5363
}
5363
5364
| ZVAL_DTOR_FUNC var_info, opline
5365
+ if (in_cold || (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0)) {
5366
+ if (check_exception) {
5367
+ | MEM_OP2_1_ZTS cmp, aword, executor_globals, exception, 0, r0
5368
+ | je >8
5369
+ | jmp ->exception_handler
5370
+ } else {
5371
+ | jmp >8
5372
+ }
5373
+ }
5364
5374
if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) {
5365
- | jmp >8
5366
5375
|4:
5367
5376
| IF_GC_MAY_NOT_LEAK FCARG1a, >8
5368
5377
| EXT_CALL gc_possible_root, r0
5378
+ if (in_cold) {
5379
+ | jmp >8
5380
+ }
5369
5381
}
5370
5382
if (in_cold) {
5371
- | jmp >8
5372
5383
|.code
5373
5384
} else {
5374
5385
done = 1;
@@ -5508,7 +5519,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, const ze
5508
5519
var_info |= MAY_BE_REF;
5509
5520
}
5510
5521
| // value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
5511
- if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr)) {
5522
+ if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0 )) {
5512
5523
return 0;
5513
5524
}
5514
5525
}
@@ -7752,7 +7763,8 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
7752
7763
}
7753
7764
}
7754
7765
7755
- if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr)) {
7766
+ if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
7767
+ may_throw && !(op1_info & MAY_BE_REF) && (op1_info & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)))) {
7756
7768
return 0;
7757
7769
}
7758
7770
if (!zend_jit_store_var_if_necessary_ex(Dst, opline->op1.var, op1_addr, op1_def_info, op1_use_addr, op1_info)) {
@@ -7764,7 +7776,7 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
7764
7776
}
7765
7777
}
7766
7778
7767
- if (may_throw) {
7779
+ if (may_throw && (op1_info & MAY_BE_REF) ) {
7768
7780
zend_jit_check_exception(Dst);
7769
7781
}
7770
7782
0 commit comments