@@ -785,6 +785,10 @@ module API {
785785
786786 private predicate hasSemantics ( DataFlow:: Node nd ) { not nd .getTopLevel ( ) .isExterns ( ) }
787787
788+ bindingset [ nd]
789+ pragma [ inline_late]
790+ private predicate hasSemanticsLate ( DataFlow:: Node nd ) { hasSemantics ( nd ) }
791+
788792 private signature module StageInputSig {
789793 predicate isAdditionalUseRoot ( Node node ) ;
790794
@@ -1264,9 +1268,13 @@ module API {
12641268 nd = MkUse ( ref )
12651269 or
12661270 S:: isAdditionalUseRoot ( nd ) and
1267- nd = MkUse ( ref )
1271+ nd = mkUseLate ( ref )
12681272 }
12691273
1274+ bindingset [ node]
1275+ pragma [ inline_late]
1276+ private TApiNode mkUseLate ( DataFlow:: Node node ) { result = MkUse ( node ) }
1277+
12701278 private import semmle.javascript.dataflow.TypeTracking
12711279
12721280 /**
@@ -1552,18 +1560,31 @@ module API {
15521560 }
15531561
15541562 private module Stage2Input implements StageInputSig {
1555- bindingset [ node]
15561563 overlay [ global]
1557- pragma [ inline_late ]
1564+ pragma [ nomagic ]
15581565 private predicate isInOverlayChangedFile ( DataFlow:: Node node ) {
15591566 overlayChangedFiles ( node .getFile ( ) .getAbsolutePath ( ) )
15601567 }
15611568
1569+ bindingset [ node]
1570+ overlay [ global]
1571+ pragma [ inline_late]
1572+ private predicate isInOverlayChangedFileLate ( DataFlow:: Node node ) {
1573+ isInOverlayChangedFile ( node )
1574+ }
1575+
1576+ pragma [ nomagic]
1577+ private predicate stepIntoOverlay ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
1578+ StepSummary:: step ( node1 , node2 , _) and
1579+ isInOverlayChangedFile ( node2 ) and
1580+ not isInOverlayChangedFileLate ( node1 ) and
1581+ hasSemanticsLate ( node1 )
1582+ }
1583+
15621584 pragma [ nomagic]
15631585 private predicate shouldTrackIntoOverlay ( DataFlow:: SourceNode nd ) {
15641586 exists ( DataFlow:: Node overlayNode |
1565- StepSummary:: step ( Stage1Local:: trackUseNodeAnyState ( nd ) , overlayNode , _) and
1566- isInOverlayChangedFile ( overlayNode )
1587+ stepIntoOverlay ( Stage1Local:: trackUseNodeAnyState ( nd ) , overlayNode )
15671588 )
15681589 }
15691590
@@ -1575,11 +1596,18 @@ module API {
15751596 )
15761597 }
15771598
1599+ pragma [ nomagic]
1600+ private predicate stepOutOfOverlay ( DataFlow:: Node node1 , DataFlow:: Node node2 ) {
1601+ StepSummary:: step ( node1 , node2 , _) and
1602+ isInOverlayChangedFile ( node1 ) and
1603+ not isInOverlayChangedFileLate ( node2 ) and
1604+ hasSemanticsLate ( node2 )
1605+ }
1606+
15781607 pragma [ nomagic]
15791608 private predicate shouldBacktrackIntoOverlay ( DataFlow:: SourceNode nd ) {
15801609 exists ( DataFlow:: Node overlayNode |
1581- StepSummary:: step ( overlayNode , Stage1Local:: trackDefNodeAnyState ( nd ) , _) and
1582- isInOverlayChangedFile ( overlayNode )
1610+ stepOutOfOverlay ( overlayNode , Stage1Local:: trackDefNodeAnyState ( nd ) )
15831611 )
15841612 }
15851613
0 commit comments