@@ -5527,6 +5527,7 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
5527
5527
static int zend_jit_assign_to_variable(dasm_State **Dst,
5528
5528
const zend_op *opline,
5529
5529
const zend_op_array *op_array,
5530
+ zend_jit_addr var_use_addr,
5530
5531
zend_jit_addr var_addr,
5531
5532
uint32_t var_info,
5532
5533
uint32_t var_def_info,
@@ -5540,11 +5541,10 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
5540
5541
{
5541
5542
int done = 0;
5542
5543
5543
- //ZEND_ASSERT(Z_MODE(var_addr) == IS_MEM_ZVAL);
5544
5544
if (var_info & MAY_BE_REF) {
5545
- if (Z_MODE(var_addr ) != IS_MEM_ZVAL || Z_REG(var_addr ) != ZREG_FCARG1a || Z_OFFSET(var_addr ) != 0) {
5546
- | LOAD_ZVAL_ADDR FCARG1a, var_addr
5547
- var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
5545
+ if (Z_MODE(var_use_addr ) != IS_MEM_ZVAL || Z_REG(var_use_addr ) != ZREG_FCARG1a || Z_OFFSET(var_use_addr ) != 0) {
5546
+ | LOAD_ZVAL_ADDR FCARG1a, var_use_addr
5547
+ var_addr = var_use_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
5548
5548
}
5549
5549
| // if (Z_ISREF_P(variable_ptr)) {
5550
5550
| IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >1
@@ -5557,27 +5557,27 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
5557
5557
|1:
5558
5558
}
5559
5559
if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
5560
- ZEND_ASSERT(Z_REG(var_addr ) != ZREG_R0);
5560
+ ZEND_ASSERT(Z_REG(var_use_addr ) != ZREG_R0);
5561
5561
if (RC_MAY_BE_1(var_info)) {
5562
5562
int in_cold = 0;
5563
5563
5564
5564
if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
5565
- | IF_ZVAL_REFCOUNTED var_addr , >1
5565
+ | IF_ZVAL_REFCOUNTED var_use_addr , >1
5566
5566
|.cold_code
5567
5567
|1:
5568
5568
in_cold = 1;
5569
5569
}
5570
- if (Z_REG(var_addr ) == ZREG_FCARG1a) {
5571
- | GET_ZVAL_PTR r0, var_addr
5570
+ if (Z_REG(var_use_addr ) == ZREG_FCARG1a) {
5571
+ | GET_ZVAL_PTR r0, var_use_addr
5572
5572
| mov aword T1, r0 // save
5573
5573
if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 0)) {
5574
5574
return 0;
5575
5575
}
5576
- if (Z_REG(var_addr ) == ZREG_FCARG1a) {
5576
+ if (Z_REG(var_use_addr ) == ZREG_FCARG1a) {
5577
5577
| mov FCARG1a, aword T1 // restore
5578
5578
}
5579
5579
} else {
5580
- | GET_ZVAL_PTR FCARG1a, var_addr
5580
+ | GET_ZVAL_PTR FCARG1a, var_use_addr
5581
5581
if (!zend_jit_simple_assign(Dst, opline, op_array, var_addr, var_info, var_def_info, val_type, val, val_addr, val_info, res_addr, in_cold, 1)) {
5582
5582
return 0;
5583
5583
}
@@ -5613,27 +5613,27 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
5613
5613
}
5614
5614
} else /* if (RC_MAY_BE_N(var_info)) */ {
5615
5615
if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
5616
- | IF_NOT_ZVAL_REFCOUNTED var_addr , >5
5616
+ | IF_NOT_ZVAL_REFCOUNTED var_use_addr , >5
5617
5617
}
5618
- | GET_ZVAL_PTR r0, var_addr
5618
+ | GET_ZVAL_PTR r0, var_use_addr
5619
5619
| GC_DELREF r0
5620
5620
if (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) {
5621
- if (Z_REG(var_addr ) == ZREG_FP) {
5622
- | GET_ZVAL_PTR FCARG1a, var_addr
5621
+ if (Z_REG(var_use_addr ) == ZREG_FP) {
5622
+ | GET_ZVAL_PTR FCARG1a, var_use_addr
5623
5623
| IF_GC_MAY_NOT_LEAK FCARG1a, >5
5624
- } else if (Z_REG(var_addr ) != ZREG_FCARG1a) {
5625
- | GET_ZVAL_PTR FCARG1a, var_addr
5624
+ } else if (Z_REG(var_use_addr ) != ZREG_FCARG1a) {
5625
+ | GET_ZVAL_PTR FCARG1a, var_use_addr
5626
5626
| IF_GC_MAY_NOT_LEAK FCARG1a, >5
5627
- | mov T1, Ra(Z_REG(var_addr )) // save
5627
+ | mov T1, Ra(Z_REG(var_use_addr )) // save
5628
5628
} else {
5629
- | GET_ZVAL_PTR r0, var_addr
5629
+ | GET_ZVAL_PTR r0, var_use_addr
5630
5630
| IF_GC_MAY_NOT_LEAK r0, >5
5631
- | mov T1, Ra(Z_REG(var_addr )) // save
5632
- | GET_ZVAL_PTR FCARG1a, var_addr
5631
+ | mov T1, Ra(Z_REG(var_use_addr )) // save
5632
+ | GET_ZVAL_PTR FCARG1a, var_use_addr
5633
5633
}
5634
5634
| EXT_CALL gc_possible_root, r0
5635
- if (Z_REG(var_addr ) != ZREG_FP) {
5636
- | mov Ra(Z_REG(var_addr )), T1 // restore
5635
+ if (Z_REG(var_use_addr ) != ZREG_FP) {
5636
+ | mov Ra(Z_REG(var_use_addr )), T1 // restore
5637
5637
}
5638
5638
}
5639
5639
|5:
@@ -5749,7 +5749,7 @@ static int zend_jit_assign_dim(dasm_State **Dst, const zend_op *opline, const ze
5749
5749
var_info |= MAY_BE_RC1;
5750
5750
}
5751
5751
| // value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
5752
- 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)) {
5752
+ if (!zend_jit_assign_to_variable(Dst, opline, op_array, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, (opline+1)->op1, op3_addr, val_info, res_addr, 0)) {
5753
5753
return 0;
5754
5754
}
5755
5755
}
@@ -8011,7 +8011,7 @@ static int zend_jit_assign(dasm_State **Dst, const zend_op *opline, const zend_o
8011
8011
/* Force type update */
8012
8012
op1_info |= MAY_BE_UNDEF;
8013
8013
}
8014
- 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,
8014
+ if (!zend_jit_assign_to_variable(Dst, opline, op_array, op1_use_addr, op1_addr, op1_info, op1_def_info, opline->op2_type, opline->op2, op2_addr, op2_info, res_addr,
8015
8015
may_throw)) {
8016
8016
return 0;
8017
8017
}
0 commit comments