Skip to content

Commit 423a1b3

Browse files
committed
Improve call graph performance by forcing non-linear joins first
1 parent 492f41d commit 423a1b3

1 file changed

Lines changed: 34 additions & 4 deletions

File tree

ql/src/codeql_ruby/dataflow/internal/DataFlowDispatch.qll

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,14 @@ private DataFlow::LocalSourceNode trackInstance(Module tp, TypeTracker t) {
169169
)
170170
)
171171
or
172-
exists(TypeTracker t2 | result = trackInstance(tp, t2).track(t2, t))
172+
exists(TypeTracker t2, StepSummary summary |
173+
result = trackInstanceRec(tp, t2, summary) and t = t2.append(summary)
174+
)
175+
}
176+
177+
pragma[nomagic]
178+
private DataFlow::LocalSourceNode trackInstanceRec(Module tp, TypeTracker t, StepSummary summary) {
179+
StepSummary::step(trackInstance(tp, t), result, summary)
173180
}
174181

175182
private DataFlow::LocalSourceNode trackInstance(Module tp) {
@@ -179,7 +186,14 @@ private DataFlow::LocalSourceNode trackInstance(Module tp) {
179186
private DataFlow::LocalSourceNode trackBlock(Block block, TypeTracker t) {
180187
t.start() and result.asExpr().getExpr() = block
181188
or
182-
exists(TypeTracker t2 | result = trackBlock(block, t2).track(t2, t))
189+
exists(TypeTracker t2, StepSummary summary |
190+
result = trackBlockRec(block, t2, summary) and t = t2.append(summary)
191+
)
192+
}
193+
194+
pragma[nomagic]
195+
private DataFlow::LocalSourceNode trackBlockRec(Block block, TypeTracker t, StepSummary summary) {
196+
StepSummary::step(trackBlock(block, t), result, summary)
183197
}
184198

185199
private DataFlow::LocalSourceNode trackBlock(Block block) {
@@ -216,7 +230,16 @@ private DataFlow::LocalSourceNode trackSingletonMethod0(MethodBase method, TypeT
216230
exists(Module m | result = trackModule(m) and moduleFlowsToSingletonMethodObject(m, method))
217231
)
218232
or
219-
exists(TypeTracker t2 | result = trackSingletonMethod0(method, t2).track(t2, t))
233+
exists(TypeTracker t2, StepSummary summary |
234+
result = trackSingletonMethod0Rec(method, t2, summary) and t = t2.append(summary)
235+
)
236+
}
237+
238+
pragma[nomagic]
239+
private DataFlow::LocalSourceNode trackSingletonMethod0Rec(
240+
MethodBase method, TypeTracker t, StepSummary summary
241+
) {
242+
StepSummary::step(trackSingletonMethod0(method, t), result, summary)
220243
}
221244

222245
pragma[nomagic]
@@ -244,7 +267,14 @@ private DataFlow::LocalSourceNode trackModule(Module tp, TypeTracker t) {
244267
result = selfInModule(tp)
245268
)
246269
or
247-
exists(TypeTracker t2 | result = trackModule(tp, t2).track(t2, t))
270+
exists(TypeTracker t2, StepSummary summary |
271+
result = trackModuleRec(tp, t2, summary) and t = t2.append(summary)
272+
)
273+
}
274+
275+
pragma[nomagic]
276+
private DataFlow::LocalSourceNode trackModuleRec(Module tp, TypeTracker t, StepSummary summary) {
277+
StepSummary::step(trackModule(tp, t), result, summary)
248278
}
249279

250280
private DataFlow::LocalSourceNode trackModule(Module tp) {

0 commit comments

Comments
 (0)