Skip to content

Commit f4e6f49

Browse files
committed
change join order for API::Impl::trackDefNode
1 parent dcef6cb commit f4e6f49

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

javascript/ql/src/semmle/javascript/ApiGraphs.qll

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,23 @@ module API {
790790
)
791791
)
792792
or
793-
exists(DataFlow::TypeBackTracker t2 | result = trackDefNode(nd, t2).backtrack(t2, t))
793+
t = defStep(nd, result)
794+
}
795+
796+
/**
797+
* Holds if `nd`, which is a def of an API-graph node, flows in zero or more potentially
798+
* inter-procedural steps from some intermediate node, and then to that intermediate node from
799+
* `prev` in one step described by the resulting TypeTracker.
800+
*
801+
* This predicate exists solely to enforce a better join order in `trackDefNode` above.
802+
*/
803+
pragma[noopt]
804+
private DataFlow::TypeBackTracker defStep(DataFlow::Node nd, DataFlow::SourceNode prev) {
805+
exists(DataFlow::TypeBackTracker t, StepSummary summary, DataFlow::Node next |
806+
next = trackDefNode(nd, t) and
807+
StepSummary::step(prev, next, summary) and
808+
result = t.prepend(summary)
809+
)
794810
}
795811

796812
/**

0 commit comments

Comments
 (0)