@@ -1411,12 +1411,15 @@ static void* dasm_labels[zend_lb_MAX];
1411
1411
1412
1412
|.macro SEPARATE_ARRAY, addr, op_info, cold
1413
1413
|| if (RC_MAY_BE_N(op_info)) {
1414
- || if (Z_REG(addr) == ZREG_FCARG1a ) {
1414
+ || if (Z_REG(addr) != ZREG_FP ) {
1415
1415
| GET_ZVAL_LVAL ZREG_R0, addr
1416
1416
|| if (RC_MAY_BE_1(op_info)) {
1417
1417
| cmp dword [r0], 1 // if (GC_REFCOUNT() > 1)
1418
1418
| jbe >2
1419
1419
|| }
1420
+ || if (Z_REG(addr) != ZREG_FCARG1a || Z_OFFSET(addr) != 0) {
1421
+ | LOAD_ZVAL_ADDR FCARG1a, addr
1422
+ || }
1420
1423
| EXT_CALL zend_jit_zval_array_dup, r0
1421
1424
|2:
1422
1425
| mov FCARG1a, r0
@@ -11589,16 +11592,15 @@ static zend_bool zend_jit_fetch_reference(dasm_State **Dst, const zend_op *oplin
11589
11592
11590
11593
| IF_NOT_ZVAL_TYPE var_addr, IS_REFERENCE, &exit_addr
11591
11594
| GET_ZVAL_PTR FCARG1a, var_addr
11592
- | add FCARG1a, offsetof(zend_reference, val)
11593
11595
11594
- var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0 );
11596
+ var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, offsetof(zend_reference, val) );
11595
11597
*var_addr_ptr = var_addr;
11596
11598
11597
11599
var_type &= ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT);
11598
11600
if (add_type_guard
11599
11601
&& var_type != IS_UNKNOWN
11600
11602
&& (var_info & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << var_type)) {
11601
- | IF_NOT_Z_TYPE FCARG1a , var_type, &exit_addr
11603
+ | IF_NOT_ZVAL_TYPE var_addr , var_type, &exit_addr
11602
11604
11603
11605
ZEND_ASSERT(var_info & (1 << var_type));
11604
11606
if (var_type < IS_STRING) {
0 commit comments