@@ -2693,6 +2693,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2693
2693
zend_jit_addr op1_addr , op1_def_addr , op2_addr , op2_def_addr , res_addr ;
2694
2694
zend_class_entry * ce ;
2695
2695
bool ce_is_instanceof ;
2696
+ bool on_this ;
2696
2697
2697
2698
if (JIT_G (bisect_limit )) {
2698
2699
jit_bisect_pos ++ ;
@@ -3153,11 +3154,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3153
3154
}
3154
3155
ce = NULL ;
3155
3156
ce_is_instanceof = 0 ;
3157
+ on_this = 0 ;
3156
3158
if (opline -> op1_type == IS_UNUSED ) {
3157
3159
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3158
3160
ce = op_array -> scope ;
3159
3161
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3160
3162
op1_addr = 0 ;
3163
+ on_this = 1 ;
3161
3164
} else {
3162
3165
op1_info = OP1_INFO ();
3163
3166
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3174,10 +3177,18 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3174
3177
}
3175
3178
}
3176
3179
}
3180
+ if (ssa -> ops && ssa -> vars ) {
3181
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3182
+ if (ssa_op -> op1_use >= 0 ) {
3183
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3184
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3185
+ }
3186
+ }
3187
+ }
3177
3188
}
3178
3189
if (!zend_jit_incdec_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3179
3190
op1_info , op1_addr ,
3180
- 0 , ce , ce_is_instanceof , 0 , NULL , IS_UNKNOWN ,
3191
+ 0 , ce , ce_is_instanceof , on_this , 0 , NULL , IS_UNKNOWN ,
3181
3192
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3182
3193
goto jit_failure ;
3183
3194
}
@@ -3200,11 +3211,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3200
3211
}
3201
3212
ce = NULL ;
3202
3213
ce_is_instanceof = 0 ;
3214
+ on_this = 0 ;
3203
3215
if (opline -> op1_type == IS_UNUSED ) {
3204
3216
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3205
3217
ce = op_array -> scope ;
3206
3218
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3207
3219
op1_addr = 0 ;
3220
+ on_this = 1 ;
3208
3221
} else {
3209
3222
op1_info = OP1_INFO ();
3210
3223
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3221,10 +3234,18 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3221
3234
}
3222
3235
}
3223
3236
}
3237
+ if (ssa -> ops && ssa -> vars ) {
3238
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3239
+ if (ssa_op -> op1_use >= 0 ) {
3240
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3241
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3242
+ }
3243
+ }
3244
+ }
3224
3245
}
3225
3246
if (!zend_jit_assign_obj_op (& dasm_state , opline , op_array , ssa , ssa_op ,
3226
3247
op1_info , op1_addr , OP1_DATA_INFO (), OP1_DATA_RANGE (),
3227
- 0 , ce , ce_is_instanceof , 0 , NULL , IS_UNKNOWN ,
3248
+ 0 , ce , ce_is_instanceof , on_this , 0 , NULL , IS_UNKNOWN ,
3228
3249
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3229
3250
goto jit_failure ;
3230
3251
}
@@ -3240,11 +3261,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3240
3261
}
3241
3262
ce = NULL ;
3242
3263
ce_is_instanceof = 0 ;
3264
+ on_this = 0 ;
3243
3265
if (opline -> op1_type == IS_UNUSED ) {
3244
3266
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3245
3267
ce = op_array -> scope ;
3246
3268
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3247
3269
op1_addr = 0 ;
3270
+ on_this = 1 ;
3248
3271
} else {
3249
3272
op1_info = OP1_INFO ();
3250
3273
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3261,10 +3284,18 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3261
3284
}
3262
3285
}
3263
3286
}
3287
+ if (ssa -> ops && ssa -> vars ) {
3288
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3289
+ if (ssa_op -> op1_use >= 0 ) {
3290
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3291
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3292
+ }
3293
+ }
3294
+ }
3264
3295
}
3265
3296
if (!zend_jit_assign_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3266
3297
op1_info , op1_addr , OP1_DATA_INFO (),
3267
- 0 , ce , ce_is_instanceof , 0 , NULL , IS_UNKNOWN ,
3298
+ 0 , ce , ce_is_instanceof , on_this , 0 , NULL , IS_UNKNOWN ,
3268
3299
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3269
3300
goto jit_failure ;
3270
3301
}
@@ -3748,11 +3779,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3748
3779
}
3749
3780
ce = NULL ;
3750
3781
ce_is_instanceof = 0 ;
3782
+ on_this = 0 ;
3751
3783
if (opline -> op1_type == IS_UNUSED ) {
3752
3784
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3753
3785
op1_addr = 0 ;
3754
3786
ce = op_array -> scope ;
3755
3787
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3788
+ on_this = 1 ;
3756
3789
} else {
3757
3790
op1_info = OP1_INFO ();
3758
3791
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3769,9 +3802,17 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3769
3802
}
3770
3803
}
3771
3804
}
3805
+ if (ssa -> ops && ssa -> vars ) {
3806
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3807
+ if (ssa_op -> op1_use >= 0 ) {
3808
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3809
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3810
+ }
3811
+ }
3812
+ }
3772
3813
}
3773
3814
if (!zend_jit_fetch_obj (& dasm_state , opline , op_array , ssa , ssa_op ,
3774
- op1_info , op1_addr , 0 , ce , ce_is_instanceof , 0 , 0 , NULL ,
3815
+ op1_info , op1_addr , 0 , ce , ce_is_instanceof , on_this , 0 , 0 , NULL ,
3775
3816
IS_UNKNOWN ,
3776
3817
zend_may_throw (opline , ssa_op , op_array , ssa ))) {
3777
3818
goto jit_failure ;
@@ -3897,11 +3938,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3897
3938
}
3898
3939
ce = NULL ;
3899
3940
ce_is_instanceof = 0 ;
3941
+ on_this = 0 ;
3900
3942
if (opline -> op1_type == IS_UNUSED ) {
3901
3943
op1_info = MAY_BE_OBJECT |MAY_BE_RC1 |MAY_BE_RCN ;
3902
3944
op1_addr = 0 ;
3903
3945
ce = op_array -> scope ;
3904
3946
ce_is_instanceof = (ce -> ce_flags & ZEND_ACC_FINAL ) != 0 ;
3947
+ on_this = 1 ;
3905
3948
} else {
3906
3949
op1_info = OP1_INFO ();
3907
3950
if (!(op1_info & MAY_BE_OBJECT )) {
@@ -3918,9 +3961,17 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3918
3961
}
3919
3962
}
3920
3963
}
3964
+ if (ssa -> ops && ssa -> vars ) {
3965
+ zend_ssa_op * ssa_op = & ssa -> ops [opline - op_array -> opcodes ];
3966
+ if (ssa_op -> op1_use >= 0 ) {
3967
+ if (ssa -> vars [ssa_op -> op1_use ].definition >= 0 ) {
3968
+ on_this = op_array -> opcodes [ssa -> vars [ssa_op -> op1_use ].definition ].opcode == ZEND_FETCH_THIS ;
3969
+ }
3970
+ }
3971
+ }
3921
3972
}
3922
3973
if (!zend_jit_init_method_call (& dasm_state , opline , b , op_array , ssa , ssa_op , call_level ,
3923
- op1_info , op1_addr , ce , ce_is_instanceof , 0 , NULL ,
3974
+ op1_info , op1_addr , ce , ce_is_instanceof , on_this , 0 , NULL ,
3924
3975
NULL , 0 , 0 )) {
3925
3976
goto jit_failure ;
3926
3977
}
0 commit comments