Skip to content

Commit d39b0fd

Browse files
committed
Ruby: Avoid computing full fastTC for AstNode::getParent
DIL before ``` /* AST::AstNode */ AST#87953007::Cached::TAstNode result) = fastTC(AST#a6718388::AstNode::getAChild#0#dispred#ff/2) . Synthesis#d9ff06b1::isInDesugaredContext#1#f(/* AST::AstNode */ unique AST#87953007::Cached::TAstNode n) :- exists(int arg1, /* AST::AstNode */ dontcare AST#87953007::Cached::TAstNode _ | arg1 = -1, AST#87953007::Cached::getSynthChild#2(_, arg1, n) ); exists(/* AST::AstNode */ AST#87953007::Cached::TAstNode call_result#2 | exists(int arg1, /* AST::AstNode */ dontcare AST#87953007::Cached::TAstNode _ | arg1 = -1, AST#87953007::Cached::getSynthChild#2(_, arg1, call_result#2) ), #AST#a6718388::AstNode::getAChild#0#dispredPlus#ff(call_result#2, n) ) . ``` DIL after ``` incremental Synthesis#d9ff06b1::isInDesugaredContext#1#f(/* AST::AstNode */ unique AST#87953007::Cached::TAstNode n) :- exists(int arg1, /* AST::AstNode */ dontcare AST#87953007::Cached::TAstNode _ | arg1 = -1, AST#87953007::Cached::getSynthChild#2(_, arg1, n) ); exists(/* AST::AstNode */ AST#87953007::Cached::TAstNode any#expr##2 | rec Synthesis#d9ff06b1::isInDesugaredContext#1#f(any#expr##2), exists(cached dontcare string _ | AST#a6718388::AstNode::getAChild#1#dispred(any#expr##2, _, n) ) ) | [base_case] exists(int arg1, /* AST::AstNode */ dontcare AST#87953007::Cached::TAstNode _ | arg1 = -1, AST#87953007::Cached::getSynthChild#2(_, arg1, n) ) | [delta_order] exists(/* AST::AstNode */ AST#87953007::Cached::TAstNode any#expr##2 | delta previous rec Synthesis#d9ff06b1::isInDesugaredContext#1#f(any#expr##2), project#AST#a6718388::AstNode::getAChild#1#dispred(any#expr##2, n) ), not(previous rec Synthesis#d9ff06b1::isInDesugaredContext#1#f(n)) . ``
1 parent 262a74d commit d39b0fd

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ int desugarLevel(AstNode n) { result = count(Desugared desugared | n = desugared
132132
* Holds if `n` appears in a context that is desugared. That is, a
133133
* transitive, reflexive parent of `n` is a desugared node.
134134
*/
135-
predicate isInDesugaredContext(AstNode n) { n = any(AstNode sugar).getDesugared().getAChild*() }
135+
predicate isInDesugaredContext(AstNode n) {
136+
n = any(AstNode sugar).getDesugared() or
137+
n = any(AstNode mid | isInDesugaredContext(mid)).getAChild()
138+
}
136139

137140
/**
138141
* Holds if `n` is a node that only exists as a result of desugaring some

0 commit comments

Comments
 (0)