@@ -2679,6 +2679,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2679
2679
zend_jit_addr op1_addr , op1_def_addr , op2_addr , op2_def_addr , res_addr ;
2680
2680
zend_class_entry * ce ;
2681
2681
bool ce_is_instanceof ;
2682
+ bool on_this ;
2682
2683
2683
2684
if (JIT_G (bisect_limit )) {
2684
2685
jit_bisect_pos ++ ;
@@ -3139,11 +3140,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3139
3140
}
3140
3141
ce = NULL ;
3141
3142
ce_is_instanceof = 0 ;
3143
+ on_this = 0 ;
3142
3144
if (opline -> op1_type == IS_UNUSED ) {
3143
3145
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3144
3146
ce = op_array -> scope ;
3145
3147
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3146
3148
op1_addr = 0 ;
3149
+ on_this = 1 ;
3147
3150
} else {
3148
3151
op1_info = OP1_INFO ();
3149
3152
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3160,10 +3163,18 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3160
3163
}
3161
3164
}
3162
3165
}
3166
+ if (ssa -> ops && ssa -> vars ) {
3167
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3168
+ if (ssa_op -> op1_use >= 0 ) {
3169
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3170
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3171
+ }
3172
+ }
3173
+ }
3163
3174
}
3164
3175
if (!zend_jit_incdec_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3165
3176
op1_info , op1_addr ,
3166
- 0 , ce , ce_is_instanceof , 0 , NULL , IS_UNKNOWN ,
3177
+ 0 , ce , ce_is_instanceof , on_this , 0 , NULL , IS_UNKNOWN ,
3167
3178
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3168
3179
goto jit_failure ;
3169
3180
}
@@ -3186,11 +3197,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3186
3197
}
3187
3198
ce = NULL ;
3188
3199
ce_is_instanceof = 0 ;
3200
+ on_this = 0 ;
3189
3201
if (opline -> op1_type == IS_UNUSED ) {
3190
3202
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3191
3203
ce = op_array -> scope ;
3192
3204
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3193
3205
op1_addr = 0 ;
3206
+ on_this = 1 ;
3194
3207
} else {
3195
3208
op1_info = OP1_INFO ();
3196
3209
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3207,10 +3220,18 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3207
3220
}
3208
3221
}
3209
3222
}
3223
+ if (ssa -> ops && ssa -> vars ) {
3224
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3225
+ if (ssa_op -> op1_use >= 0 ) {
3226
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3227
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3228
+ }
3229
+ }
3230
+ }
3210
3231
}
3211
3232
if (!zend_jit_assign_obj_op (& dasm_state , opline , op_array , ssa , ssa_op ,
3212
3233
op1_info , op1_addr , OP1_DATA_INFO (), OP1_DATA_RANGE (),
3213
- 0 , ce , ce_is_instanceof , 0 , NULL , IS_UNKNOWN ,
3234
+ 0 , ce , ce_is_instanceof , on_this , 0 , NULL , IS_UNKNOWN ,
3214
3235
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3215
3236
goto jit_failure ;
3216
3237
}
@@ -3226,11 +3247,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3226
3247
}
3227
3248
ce = NULL ;
3228
3249
ce_is_instanceof = 0 ;
3250
+ on_this = 0 ;
3229
3251
if (opline -> op1_type == IS_UNUSED ) {
3230
3252
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3231
3253
ce = op_array -> scope ;
3232
3254
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3233
3255
op1_addr = 0 ;
3256
+ on_this = 1 ;
3234
3257
} else {
3235
3258
op1_info = OP1_INFO ();
3236
3259
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3247,10 +3270,18 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3247
3270
}
3248
3271
}
3249
3272
}
3273
+ if (ssa -> ops && ssa -> vars ) {
3274
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3275
+ if (ssa_op -> op1_use >= 0 ) {
3276
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3277
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3278
+ }
3279
+ }
3280
+ }
3250
3281
}
3251
3282
if (!zend_jit_assign_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3252
3283
op1_info , op1_addr , OP1_DATA_INFO (),
3253
- 0 , ce , ce_is_instanceof , 0 , NULL , IS_UNKNOWN ,
3284
+ 0 , ce , ce_is_instanceof , on_this , 0 , NULL , IS_UNKNOWN ,
3254
3285
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3255
3286
goto jit_failure ;
3256
3287
}
@@ -3734,11 +3765,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3734
3765
}
3735
3766
ce = NULL ;
3736
3767
ce_is_instanceof = 0 ;
3768
+ on_this = 0 ;
3737
3769
if (opline -> op1_type == IS_UNUSED ) {
3738
3770
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3739
3771
op1_addr = 0 ;
3740
3772
ce = op_array -> scope ;
3741
3773
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3774
+ on_this = 1 ;
3742
3775
} else {
3743
3776
op1_info = OP1_INFO ();
3744
3777
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3755,9 +3788,17 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3755
3788
}
3756
3789
}
3757
3790
}
3791
+ if (ssa -> ops && ssa -> vars ) {
3792
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3793
+ if (ssa_op -> op1_use >= 0 ) {
3794
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3795
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3796
+ }
3797
+ }
3798
+ }
3758
3799
}
3759
3800
if (!zend_jit_fetch_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3760
- op1_info , op1_addr , 0 , ce , ce_is_instanceof , 0 , 0 , NULL ,
3801
+ op1_info , op1_addr , 0 , ce , ce_is_instanceof , on_this , 0 , 0 , NULL ,
3761
3802
IS_UNKNOWN ,
3762
3803
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3763
3804
goto jit_failure ;
@@ -3883,11 +3924,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3883
3924
}
3884
3925
ce = NULL ;
3885
3926
ce_is_instanceof = 0 ;
3927
+ on_this = 0 ;
3886
3928
if (opline -> op1_type == IS_UNUSED ) {
3887
3929
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3888
3930
op1_addr = 0 ;
3889
3931
ce = op_array -> scope ;
3890
3932
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3933
+ on_this = 1 ;
3891
3934
} else {
3892
3935
op1_info = OP1_INFO ();
3893
3936
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3904,9 +3947,17 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3904
3947
}
3905
3948
}
3906
3949
}
3950
+ if (ssa -> ops && ssa -> vars ) {
3951
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3952
+ if (ssa_op -> op1_use >= 0 ) {
3953
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3954
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3955
+ }
3956
+ }
3957
+ }
3907
3958
}
3908
3959
if (!zend_jit_init_method_call (& dasm_state , opline , b , op_array , ssa , ssa_op , call_level ,
3909
- op1_info , op1_addr , ce , ce_is_instanceof , 0 , NULL ,
3960
+ op1_info , op1_addr , ce , ce_is_instanceof , on_this , 0 , NULL ,
3910
3961
NULL , 0 , 0 )) {
3911
3962
goto jit_failure ;
3912
3963
}
0 commit comments