Skip to content

Commit a1c41cc

Browse files
committed
JS: Minor improvements to some join orders
1 parent a58b1b4 commit a1c41cc

File tree

1 file changed

+35
-7
lines changed

1 file changed

+35
-7
lines changed

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)