@@ -233,71 +233,61 @@ private module Internal {
233
233
}
234
234
235
235
pragma [ noinline]
236
- private predicate hasOverrider ( OverridableCallable oc , ValueOrRefType t ) {
237
- exists ( oc .getAnOverrider ( t ) )
236
+ private predicate hasOverrider ( OverridableCallable oc , Gvn :: GvnType t ) {
237
+ exists ( oc .getAnOverrider ( any ( ValueOrRefType t0 | Gvn :: getGlobalValueNumber ( t0 ) = t ) ) )
238
238
}
239
239
240
240
pragma [ noinline]
241
- private predicate hasCallable ( OverridableCallable source , ValueOrRefType t , OverridableCallable c ) {
241
+ private predicate hasCallable ( OverridableCallable source , Gvn :: GvnType t , OverridableCallable c ) {
242
242
c .getUnboundDeclaration ( ) = source and
243
- t .hasCallable ( c ) and
243
+ any ( ValueOrRefType t0 | Gvn :: getGlobalValueNumber ( t0 ) = t ) .hasCallable ( c ) and
244
244
hasOverrider ( c , t ) and
245
- hasQualifierTypeOverridden0 ( t , _) and
246
- hasQualifierTypeOverridden1 ( source , _)
245
+ source = any ( DispatchMethodOrAccessorCall call ) .getAStaticTargetExt ( )
247
246
}
248
247
249
- pragma [ noinline]
250
- private Unification:: ConstrainedTypeParameter getAConstrainedTypeParameterQualifierType (
251
- DispatchMethodOrAccessorCall call
252
- ) {
253
- result = getAPossibleType ( call .getQualifier ( ) , false )
254
- }
248
+ abstract private class DispatchMethodOrAccessorCall extends DispatchCallImpl {
249
+ pragma [ noinline]
250
+ OverridableCallable getAStaticTargetExt ( ) {
251
+ exists ( OverridableCallable target | this .getAStaticTarget ( ) = target |
252
+ result = target .getUnboundDeclaration ( )
253
+ or
254
+ result = target .getAnUltimateImplementor ( ) .getUnboundDeclaration ( )
255
+ )
256
+ }
255
257
256
- pragma [ noinline]
257
- private predicate constrainedTypeParameterQualifierTypeSubsumes (
258
- ValueOrRefType t , Unification:: ConstrainedTypeParameter tp
259
- ) {
260
- tp = getAConstrainedTypeParameterQualifierType ( _) and
261
- tp .subsumes ( t )
262
- }
258
+ pragma [ nomagic]
259
+ predicate hasQualifierTypeInherited ( Type t ) { t = getAPossibleType ( this .getQualifier ( ) , _) }
263
260
264
- pragma [ noinline]
265
- private predicate hasQualifierTypeOverridden0 ( ValueOrRefType t , DispatchMethodOrAccessorCall call ) {
266
- hasOverrider ( _, t ) and
267
- (
268
- exists ( Type t0 , Type t1 |
269
- t0 = getAPossibleType ( call .getQualifier ( ) , false ) and
270
- t1 = [ t0 , t0 .( Unification:: UnconstrainedTypeParameter ) .getAnUltimatelySuppliedType ( ) ]
261
+ pragma [ noinline]
262
+ private predicate hasSubsumedQualifierType ( Gvn:: GvnType t ) {
263
+ hasOverrider ( _, t ) and
264
+ exists ( Type t0 |
265
+ t0 = getAPossibleType ( this .getQualifier ( ) , false ) and
266
+ not t0 instanceof TypeParameter
271
267
|
272
- t = t1
268
+ t = Gvn :: getGlobalValueNumber ( t0 )
273
269
or
274
- Unification :: subsumes ( t1 , t )
270
+ Gvn :: subsumes ( Gvn :: getGlobalValueNumber ( t0 ) , t )
275
271
)
276
- or
277
- constrainedTypeParameterQualifierTypeSubsumes ( t ,
278
- getAConstrainedTypeParameterQualifierType ( call ) )
279
- )
280
- }
272
+ }
281
273
282
- pragma [ noinline]
283
- private predicate hasQualifierTypeOverridden1 (
284
- OverridableCallable c , DispatchMethodOrAccessorCall call
285
- ) {
286
- exists ( OverridableCallable target | call .getAStaticTarget ( ) = target |
287
- c = target .getUnboundDeclaration ( )
288
- or
289
- c = target .getAnUltimateImplementor ( ) .getUnboundDeclaration ( )
290
- )
291
- }
274
+ pragma [ noinline]
275
+ private predicate hasConstrainedTypeParameterQualifierType (
276
+ Unification:: ConstrainedTypeParameter tp
277
+ ) {
278
+ tp = getAPossibleType ( this .getQualifier ( ) , false )
279
+ }
292
280
293
- abstract private class DispatchMethodOrAccessorCall extends DispatchCallImpl {
294
- pragma [ nomagic]
295
- predicate hasQualifierTypeInherited ( Type t ) { t = getAPossibleType ( this .getQualifier ( ) , _) }
281
+ pragma [ noinline]
282
+ private predicate hasUnconstrainedTypeParameterQualifierType ( ) {
283
+ getAPossibleType ( this .getQualifier ( ) , false ) instanceof
284
+ Unification:: UnconstrainedTypeParameter
285
+ }
296
286
297
287
pragma [ nomagic]
298
- predicate hasQualifierTypeOverridden ( ValueOrRefType t , OverridableCallable c ) {
299
- hasQualifierTypeOverridden0 ( t , this ) and
300
- hasCallable ( any ( OverridableCallable oc | hasQualifierTypeOverridden1 ( oc , this ) ) , t , c )
288
+ predicate hasSubsumedQualifierTypeOverridden ( Gvn :: GvnType t , OverridableCallable c ) {
289
+ this . hasSubsumedQualifierType ( t ) and
290
+ hasCallable ( any ( OverridableCallable oc | oc = this . getAStaticTargetExt ( ) ) , t , c )
301
291
}
302
292
303
293
/**
@@ -357,12 +347,33 @@ private module Internal {
357
347
}
358
348
359
349
pragma [ nomagic]
360
- private Callable getASubsumedStaticTarget0 ( Type t ) {
350
+ private predicate contextArgHasConstrainedTypeParameterType (
351
+ DispatchCall ctx , Unification:: ConstrainedTypeParameter tp
352
+ ) {
353
+ this .contextArgHasType ( ctx , tp , false )
354
+ }
355
+
356
+ pragma [ nomagic]
357
+ private predicate contextArgHasUnconstrainedTypeParameterType ( DispatchCall ctx ) {
358
+ this .contextArgHasType ( ctx , any ( Unification:: UnconstrainedTypeParameter t ) , false )
359
+ }
360
+
361
+ pragma [ nomagic]
362
+ private predicate contextArgHasNonTypeParameterType ( DispatchCall ctx , Gvn:: GvnType t ) {
363
+ exists ( Type t0 |
364
+ this .contextArgHasType ( ctx , t0 , false ) and
365
+ not t0 instanceof TypeParameter and
366
+ t = Gvn:: getGlobalValueNumber ( t0 )
367
+ )
368
+ }
369
+
370
+ pragma [ nomagic]
371
+ private Callable getASubsumedStaticTarget0 ( Gvn:: GvnType t ) {
361
372
exists ( Callable staticTarget , Type declType |
362
373
staticTarget = this .getAStaticTarget ( ) and
363
374
declType = staticTarget .getDeclaringType ( ) and
364
375
result = staticTarget .getUnboundDeclaration ( ) and
365
- Unification :: subsumes ( declType , t )
376
+ Gvn :: subsumes ( Gvn :: getGlobalValueNumber ( declType ) , t )
366
377
)
367
378
}
368
379
@@ -375,7 +386,8 @@ private module Internal {
375
386
private Callable getASubsumedStaticTarget ( ) {
376
387
result = this .getAStaticTarget ( )
377
388
or
378
- result .getUnboundDeclaration ( ) = this .getASubsumedStaticTarget0 ( result .getDeclaringType ( ) )
389
+ result .getUnboundDeclaration ( ) =
390
+ this .getASubsumedStaticTarget0 ( Gvn:: getGlobalValueNumber ( result .getDeclaringType ( ) ) )
379
391
}
380
392
381
393
/**
@@ -426,6 +438,12 @@ private module Internal {
426
438
)
427
439
}
428
440
441
+ pragma [ noinline]
442
+ NonConstructedOverridableCallable getAViableOverrider0 ( ) {
443
+ getAPossibleType ( this .getQualifier ( ) , false ) instanceof TypeParameter and
444
+ result .getAConstructingCallableOrSelf ( ) = this .getAStaticTargetExt ( )
445
+ }
446
+
429
447
/**
430
448
* Gets a callable that is defined in a subtype of the qualifier type of this
431
449
* call, and which overrides a static target of this call.
@@ -468,9 +486,22 @@ private module Internal {
468
486
*/
469
487
private RuntimeCallable getAViableOverrider ( ) {
470
488
exists ( ValueOrRefType t , NonConstructedOverridableCallable c |
471
- this .hasQualifierTypeOverridden ( t , c .getAConstructingCallableOrSelf ( ) ) and
489
+ this .hasSubsumedQualifierTypeOverridden ( Gvn:: getGlobalValueNumber ( t ) ,
490
+ c .getAConstructingCallableOrSelf ( ) ) and
472
491
result = c .getAnOverrider ( t )
473
492
)
493
+ or
494
+ exists ( NonConstructedOverridableCallable c |
495
+ c = this .getAViableOverrider0 ( ) and
496
+ result = c .getAnOverrider ( _)
497
+ |
498
+ this .hasUnconstrainedTypeParameterQualifierType ( )
499
+ or
500
+ exists ( Unification:: ConstrainedTypeParameter tp |
501
+ this .hasConstrainedTypeParameterQualifierType ( tp ) and
502
+ tp .subsumes ( result .getDeclaringType ( ) )
503
+ )
504
+ )
474
505
}
475
506
476
507
override RuntimeCallable getADynamicTarget ( ) {
@@ -510,36 +541,40 @@ private module Internal {
510
541
}
511
542
512
543
pragma [ nomagic]
513
- private RuntimeCallable getAViableOverriderInCallContext0 (
514
- NonConstructedOverridableCallable c , ValueOrRefType t
515
- ) {
516
- result = this .getAViableOverrider ( ) and
517
- this .contextArgHasType ( _, _, false ) and
518
- result = c .getAnOverrider ( t )
544
+ private RuntimeCallable getAViableOverriderInCallContext0 ( Gvn:: GvnType t ) {
545
+ exists ( NonConstructedOverridableCallable c |
546
+ result = this .getAViableOverrider ( ) and
547
+ this .contextArgHasType ( _, _, false ) and
548
+ result = c .getAnOverrider ( any ( Type t0 | t = Gvn:: getGlobalValueNumber ( t0 ) ) ) and
549
+ this .getAStaticTarget ( ) = c .getAConstructingCallableOrSelf ( )
550
+ )
519
551
}
520
552
521
553
pragma [ nomagic]
522
- private RuntimeCallable getAViableOverriderInCallContext1 (
523
- NonConstructedOverridableCallable c , DispatchCall ctx
524
- ) {
525
- exists ( ValueOrRefType t |
526
- result = this .getAViableOverriderInCallContext0 ( c , t ) and
527
- exists ( Type t0 , Type t1 |
528
- this .contextArgHasType ( ctx , t0 , false ) and
529
- t1 = [ t0 , t0 .( Unification:: UnconstrainedTypeParameter ) .getAnUltimatelySuppliedType ( ) ]
530
- |
531
- t = t1
532
- or
533
- Unification:: subsumes ( t1 , t )
534
- )
554
+ private predicate contextArgHasSubsumedType ( DispatchCall ctx , Gvn:: GvnType t ) {
555
+ hasOverrider ( _, t ) and
556
+ exists ( Gvn:: GvnType t0 | this .contextArgHasNonTypeParameterType ( ctx , t0 ) |
557
+ t = t0
558
+ or
559
+ Gvn:: subsumes ( t0 , t )
535
560
)
536
561
}
537
562
538
563
pragma [ nomagic]
539
564
private RuntimeCallable getAViableOverriderInCallContext ( DispatchCall ctx ) {
540
- exists ( NonConstructedOverridableCallable c |
541
- result = this .getAViableOverriderInCallContext1 ( c , ctx ) and
542
- this .getAStaticTarget ( ) = c .getAConstructingCallableOrSelf ( )
565
+ exists ( Gvn:: GvnType t |
566
+ result = this .getAViableOverriderInCallContext0 ( t ) and
567
+ this .contextArgHasSubsumedType ( ctx , t )
568
+ )
569
+ or
570
+ result = this .getAViableOverrider ( ) and
571
+ (
572
+ this .contextArgHasUnconstrainedTypeParameterType ( ctx )
573
+ or
574
+ exists ( Unification:: ConstrainedTypeParameter tp |
575
+ this .contextArgHasConstrainedTypeParameterType ( ctx , tp ) and
576
+ tp .subsumes ( result .getDeclaringType ( ) )
577
+ )
543
578
)
544
579
}
545
580
0 commit comments