@@ -1426,6 +1426,15 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
1426
1426
ADD_OP2_TRACE_GUARD ();
1427
1427
}
1428
1428
break ;
1429
+ case ZEND_ASSIGN_OBJ :
1430
+ if (opline -> op2_type != IS_CONST
1431
+ || Z_TYPE_P (RT_CONSTANT (opline , opline -> op2 )) != IS_STRING
1432
+ || Z_STRVAL_P (RT_CONSTANT (opline , opline -> op2 ))[0 ] == '\0' ) {
1433
+ break ;
1434
+ }
1435
+ // ADD_OP1_DATA_TRACE_GUARD();
1436
+ ADD_OP1_TRACE_GUARD ();
1437
+ break ;
1429
1438
case ZEND_IS_EQUAL :
1430
1439
case ZEND_IS_NOT_EQUAL :
1431
1440
case ZEND_IS_SMALLER :
@@ -2795,7 +2804,8 @@ static zend_bool zend_jit_may_delay_fetch_this(zend_ssa *ssa, const zend_op **ss
2795
2804
}
2796
2805
} else if (opline -> opcode != ZEND_FETCH_OBJ_R
2797
2806
&& opline -> opcode != ZEND_FETCH_OBJ_IS
2798
- && opline -> opcode != ZEND_FETCH_OBJ_W ) {
2807
+ && opline -> opcode != ZEND_FETCH_OBJ_W
2808
+ && opline -> opcode != ZEND_ASSIGN_OBJ ) {
2799
2809
return 0 ;
2800
2810
}
2801
2811
@@ -3708,6 +3718,72 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
3708
3718
goto jit_failure ;
3709
3719
}
3710
3720
goto done ;
3721
+ case ZEND_ASSIGN_OBJ :
3722
+ if (opline -> op2_type != IS_CONST
3723
+ || Z_TYPE_P (RT_CONSTANT (opline , opline -> op2 )) != IS_STRING
3724
+ || Z_STRVAL_P (RT_CONSTANT (opline , opline -> op2 ))[0 ] == '\0' ) {
3725
+ break ;
3726
+ }
3727
+ ce = NULL ;
3728
+ ce_is_instanceof = 0 ;
3729
+ delayed_fetch_this = 0 ;
3730
+ op1_indirect = 0 ;
3731
+ if (opline -> op1_type == IS_UNUSED ) {
3732
+ op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3733
+ ce = op_array -> scope ;
3734
+ ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3735
+ op1_addr = 0 ;
3736
+ } else {
3737
+ if (ssa_op -> op1_use >= 0 ) {
3738
+ delayed_fetch_this = ssa -> var_info [ssa_op -> op1_use ].delayed_fetch_this ;
3739
+ }
3740
+ op1_info = OP1_INFO ();
3741
+ if (!(op1_info & MAY_BE_OBJECT )) {
3742
+ break ;
3743
+ }
3744
+ op1_addr = OP1_REG_ADDR ();
3745
+ if (opline -> op1_type == IS_VAR ) {
3746
+ if (orig_op1_type != IS_UNKNOWN
3747
+ && (orig_op1_type & IS_TRACE_INDIRECT )) {
3748
+ op1_indirect = 1 ;
3749
+ if (!zend_jit_fetch_indirect_var (& dasm_state , opline , orig_op1_type ,
3750
+ & op1_info , & op1_addr , !ssa -> var_info [ssa_op -> op1_use ].indirect_reference )) {
3751
+ goto jit_failure ;
3752
+ }
3753
+ }
3754
+ }
3755
+ if (orig_op1_type != IS_UNKNOWN
3756
+ && (orig_op1_type & IS_TRACE_REFERENCE )) {
3757
+ if (!zend_jit_fetch_reference (& dasm_state , opline , orig_op1_type , & op1_info , & op1_addr ,
3758
+ !ssa -> var_info [ssa_op -> op1_use ].guarded_reference , 1 )) {
3759
+ goto jit_failure ;
3760
+ }
3761
+ if (opline -> op1_type == IS_CV
3762
+ && zend_jit_var_may_alias (op_array , op_array_ssa , EX_VAR_TO_NUM (opline -> op1 .var )) == NO_ALIAS ) {
3763
+ ssa -> var_info [ssa_op -> op1_use ].guarded_reference = 1 ;
3764
+ }
3765
+ } else {
3766
+ CHECK_OP1_TRACE_TYPE ();
3767
+ }
3768
+ if (ssa -> var_info && ssa -> ops ) {
3769
+ if (ssa_op -> op1_use >= 0 ) {
3770
+ zend_ssa_var_info * op1_ssa = ssa -> var_info + ssa_op -> op1_use ;
3771
+ if (op1_ssa -> ce && !op1_ssa -> ce -> create_object ) {
3772
+ ce = op1_ssa -> ce ;
3773
+ ce_is_instanceof = op1_ssa -> is_instanceof ;
3774
+ }
3775
+ }
3776
+ }
3777
+ }
3778
+ op1_data_info = OP1_DATA_INFO ();
3779
+ CHECK_OP1_DATA_TRACE_TYPE ();
3780
+ if (!zend_jit_assign_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3781
+ op1_info , op1_addr , op1_data_info ,
3782
+ op1_indirect , ce , ce_is_instanceof , delayed_fetch_this , op1_ce ,
3783
+ zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3784
+ goto jit_failure ;
3785
+ }
3786
+ goto done ;
3711
3787
case ZEND_ASSIGN_DIM :
3712
3788
op1_info = OP1_INFO ();
3713
3789
op1_addr = OP1_REG_ADDR ();
0 commit comments