Skip to content

Commit 29cd346

Browse files
committed
Ruby: Reduce non-linear recursion in CFG completion library
Before ``` noinline incremental Completion::nestedEnsureCompletion#ff(/* Completion::Completion */ Completion::TCompletion outer, int nestLevel) :- ( ( Completion::TReturnCompletion#f(outer), rec Completion::Completion#class#f(outer) ); ( Completion::TBreakCompletion#f(outer), rec Completion::Completion#class#f(outer) ); ( Completion::TNextCompletion#f(outer), rec Completion::Completion#class#f(outer) ); ( Completion::TRedoCompletion#f(outer), rec Completion::Completion#class#f(outer) ); ( Completion::TRetryCompletion#f(outer), rec Completion::Completion#class#f(outer) ); ( Completion::TRaiseCompletion#f(outer), rec Completion::Completion#class#f(outer) ); ( Completion::TExitCompletion#f(outer), rec Completion::Completion#class#f(outer) ) ), exists(/* ControlFlowGraphImpl::Trees::BodyStmtTree */ cached dontcare AST::Cached::TAstNode _ | ControlFlowGraphImpl::Trees::BodyStmtTree::getNestLevel_dispred#ff(_, nestLevel) ) | [base_case] false() | [delta_order] ( ( Completion::TReturnCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ); ( Completion::TBreakCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ); ( Completion::TNextCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ); ( Completion::TRedoCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ); ( Completion::TRetryCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ); ( Completion::TRaiseCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ); ( Completion::TExitCompletion#f(outer), delta previous rec Completion::Completion#class#f(outer) ) ), project#ControlFlowGraphImpl::Trees::BodyStmtTree::getNestLevel_dispred#ff(nestLevel), not(previous rec Completion::nestedEnsureCompletion#ff(outer, nestLevel)) . ``` After ``` noinline Completion::nestedEnsureCompletion#ff(Completion::TCompletion outer, int nestLevel) :- ( Completion::TReturnCompletion#f(outer); Completion::TBreakCompletion#f(outer); Completion::TNextCompletion#f(outer); Completion::TRedoCompletion#f(outer); Completion::TRetryCompletion#f(outer); Completion::TRaiseCompletion#f(outer); Completion::TExitCompletion#f(outer) ), project#ControlFlowGraphImpl::Trees::BodyStmtTree::getNestLevel_dispred#ff(nestLevel) . ```
1 parent aa92fe8 commit 29cd346

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private newtype TCompletion =
2323
TRetryCompletion() or
2424
TRaiseCompletion() or // TODO: Add exception type?
2525
TExitCompletion() or
26-
TNestedCompletion(Completion inner, Completion outer, int nestLevel) {
26+
TNestedCompletion(TCompletion inner, TCompletion outer, int nestLevel) {
2727
inner = TBreakCompletion() and
2828
outer instanceof NonNestedNormalCompletion and
2929
nestLevel = 0
@@ -37,7 +37,7 @@ private newtype TCompletion =
3737
}
3838

3939
pragma[noinline]
40-
private predicate nestedEnsureCompletion(Completion outer, int nestLevel) {
40+
private predicate nestedEnsureCompletion(TCompletion outer, int nestLevel) {
4141
(
4242
outer = TReturnCompletion()
4343
or

0 commit comments

Comments
 (0)