@@ -923,28 +923,29 @@ private module Stage2 {
923923
924924 ApOption apSome ( Ap ap ) { result = TBooleanSome ( ap ) }
925925
926- class Cc = boolean ;
927-
928- class CcCall extends Cc {
929- CcCall ( ) { this = true }
926+ class Cc = CallContext ;
930927
931- /** Holds if this call context may be `call`. */
932- predicate matchesCall ( DataFlowCall call ) { any ( ) }
933- }
928+ class CcCall = CallContextCall ;
934929
935- class CcNoCall extends Cc {
936- CcNoCall ( ) { this = false }
937- }
930+ class CcNoCall = CallContextNoCall ;
938931
939- Cc ccNone ( ) { result = false }
932+ Cc ccNone ( ) { result instanceof CallContextAny }
940933
941934 private class LocalCc = Unit ;
942935
943936 bindingset [ call, c, outercc]
944- private CcCall getCallContextCall ( DataFlowCall call , DataFlowCallable c , Cc outercc ) { any ( ) }
937+ private CcCall getCallContextCall ( DataFlowCall call , DataFlowCallable c , Cc outercc ) {
938+ checkCallContextCall ( outercc , call , c ) and
939+ if recordDataFlowCallSiteDispatch ( call , c )
940+ then result = TSpecificCall ( call )
941+ else result = TSomeCall ( )
942+ }
945943
946944 bindingset [ call, c, innercc]
947- private CcNoCall getCallContextReturn ( DataFlowCallable c , DataFlowCall call , Cc innercc ) { any ( ) }
945+ private CcNoCall getCallContextReturn ( DataFlowCallable c , DataFlowCall call , Cc innercc ) {
946+ checkCallContextReturn ( innercc , c , call ) and
947+ if reducedViableImplInReturn ( c , call ) then result = TReturn ( c , call ) else result = ccNone ( )
948+ }
948949
949950 bindingset [ node, cc, config]
950951 private LocalCc getLocalCc ( NodeEx node , Cc cc , Configuration config ) { any ( ) }
@@ -1172,7 +1173,8 @@ private module Stage2 {
11721173 fwdFlow ( out , pragma [ only_bind_into ] ( cc ) , pragma [ only_bind_into ] ( argAp ) , ap ,
11731174 pragma [ only_bind_into ] ( config ) ) and
11741175 fwdFlowOutFromArg ( call , out , argAp0 , ap , config ) and
1175- fwdFlowIsEntered ( call , pragma [ only_bind_into ] ( cc ) , pragma [ only_bind_into ] ( argAp ) , argAp0 ,
1176+ fwdFlowIsEntered ( pragma [ only_bind_into ] ( call ) , pragma [ only_bind_into ] ( cc ) ,
1177+ pragma [ only_bind_into ] ( argAp ) , pragma [ only_bind_into ] ( argAp0 ) ,
11761178 pragma [ only_bind_into ] ( config ) )
11771179 )
11781180 }
@@ -1860,7 +1862,8 @@ private module Stage3 {
18601862 fwdFlow ( out , pragma [ only_bind_into ] ( cc ) , pragma [ only_bind_into ] ( argAp ) , ap ,
18611863 pragma [ only_bind_into ] ( config ) ) and
18621864 fwdFlowOutFromArg ( call , out , argAp0 , ap , config ) and
1863- fwdFlowIsEntered ( call , pragma [ only_bind_into ] ( cc ) , pragma [ only_bind_into ] ( argAp ) , argAp0 ,
1865+ fwdFlowIsEntered ( pragma [ only_bind_into ] ( call ) , pragma [ only_bind_into ] ( cc ) ,
1866+ pragma [ only_bind_into ] ( argAp ) , pragma [ only_bind_into ] ( argAp0 ) ,
18641867 pragma [ only_bind_into ] ( config ) )
18651868 )
18661869 }
@@ -2117,7 +2120,7 @@ private module Stage3 {
21172120private predicate flowCandSummaryCtx ( NodeEx node , AccessPathFront argApf , Configuration config ) {
21182121 exists ( AccessPathFront apf |
21192122 Stage3:: revFlow ( node , true , _, apf , config ) and
2120- Stage3:: fwdFlow ( node , true , TAccessPathFrontSome ( argApf ) , apf , config )
2123+ Stage3:: fwdFlow ( node , any ( Stage3 :: CcCall ccc ) , TAccessPathFrontSome ( argApf ) , apf , config )
21212124 )
21222125}
21232126
@@ -2618,7 +2621,8 @@ private module Stage4 {
26182621 fwdFlow ( out , pragma [ only_bind_into ] ( cc ) , pragma [ only_bind_into ] ( argAp ) , ap ,
26192622 pragma [ only_bind_into ] ( config ) ) and
26202623 fwdFlowOutFromArg ( call , out , argAp0 , ap , config ) and
2621- fwdFlowIsEntered ( call , pragma [ only_bind_into ] ( cc ) , pragma [ only_bind_into ] ( argAp ) , argAp0 ,
2624+ fwdFlowIsEntered ( pragma [ only_bind_into ] ( call ) , pragma [ only_bind_into ] ( cc ) ,
2625+ pragma [ only_bind_into ] ( argAp ) , pragma [ only_bind_into ] ( argAp0 ) ,
26222626 pragma [ only_bind_into ] ( config ) )
26232627 )
26242628 }
@@ -3639,9 +3643,10 @@ private module Subpaths {
36393643 PathNode arg , ParamNodeEx par , SummaryCtxSome sc , CallContext innercc , ReturnKindExt kind ,
36403644 NodeEx out , AccessPath apout
36413645 ) {
3642- pathThroughCallable ( arg , out , _, apout ) and
3646+ pathThroughCallable ( arg , out , _, pragma [ only_bind_into ] ( apout ) ) and
36433647 pathIntoCallable ( arg , par , _, innercc , sc , _) and
3644- paramFlowsThrough ( kind , innercc , sc , apout , _, unbindConf ( arg .getConfiguration ( ) ) )
3648+ paramFlowsThrough ( kind , innercc , sc , pragma [ only_bind_into ] ( apout ) , _,
3649+ unbindConf ( arg .getConfiguration ( ) ) )
36453650 }
36463651
36473652 /**
@@ -3686,8 +3691,8 @@ private module Subpaths {
36863691 */
36873692 predicate subpaths ( PathNode arg , PathNodeImpl par , PathNodeMid ret , PathNodeMid out ) {
36883693 exists ( ParamNodeEx p , NodeEx o , AccessPath apout |
3689- arg .getASuccessor ( ) = par and
3690- arg .getASuccessor ( ) = out and
3694+ pragma [ only_bind_into ] ( arg ) .getASuccessor ( ) = par and
3695+ pragma [ only_bind_into ] ( arg ) .getASuccessor ( ) = out and
36913696 subpaths03 ( arg , p , ret , o , apout ) and
36923697 par .getNodeEx ( ) = p and
36933698 out .getNodeEx ( ) = o and
0 commit comments