@@ -18,14 +18,29 @@ module CallGraph {
1818 }
1919
2020 pragma [ nomagic]
21- private DataFlow:: SourceNode backtrackStoreTarget ( ) {
22- shouldBackTrack ( result )
21+ private predicate methodHostToReceiverStep ( DataFlow:: SourceNode node1 , DataFlow:: SourceNode node2 ) {
22+ exists ( DataFlow:: PropWrite write |
23+ node1 = write .getBase ( ) .getALocalSource ( ) and
24+ node2 = write .getRhs ( ) .getALocalSource ( ) .( DataFlow:: FunctionNode ) .getReceiver ( )
25+ )
26+ }
27+
28+ pragma [ inline]
29+ private predicate step ( DataFlow:: SourceNode node1 , DataFlow:: SourceNode node2 ) {
30+ AccessPath:: step ( node1 .getALocalUse ( ) , node2 )
2331 or
24- AccessPath :: step ( result .getALocalUse ( ) , backtrackStoreTarget ( ) )
32+ propertyFlowStep ( node1 .getALocalUse ( ) , node2 )
2533 or
26- propertyFlowStep ( result . getALocalUse ( ) , backtrackStoreTarget ( ) )
34+ storeReadStep ( node1 , node2 )
2735 or
28- storeReadStep ( result , backtrackStoreTarget ( ) )
36+ methodHostToReceiverStep ( node1 , node2 )
37+ }
38+
39+ pragma [ nomagic]
40+ private DataFlow:: SourceNode backtrackStoreTarget ( ) {
41+ shouldBackTrack ( result )
42+ or
43+ step ( result , backtrackStoreTarget ( ) )
2944 }
3045
3146 pragma [ nomagic]
@@ -63,15 +78,9 @@ module CallGraph {
6378 pragma [ nomagic]
6479 private DataFlow:: SourceNode track ( DataFlow:: SourceNode source ) {
6580 shouldTrack ( source ) and
66- (
67- result = source
68- or
69- AccessPath:: step ( track ( source ) .getALocalUse ( ) , result )
70- or
71- propertyFlowStep ( track ( source ) .getALocalUse ( ) , result )
72- or
73- storeReadStep ( track ( source ) , result )
74- )
81+ result = source
82+ or
83+ step ( track ( source ) , result )
7584 }
7685
7786 /** Gets the function referenced by `node`, as determined by the type inference. */
0 commit comments