From 584702058dd95c2eae75b2a0cead9dea1c41c384 Mon Sep 17 00:00:00 2001 From: Erik Krogh Kristensen Date: Wed, 13 Oct 2021 13:20:41 +0200 Subject: [PATCH 1/3] fix two bad join orders --- ql/src/codeql_ql/ast/internal/Module.qll | 35 +++++++++++----------- ql/src/codeql_ql/ast/internal/Variable.qll | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ql/src/codeql_ql/ast/internal/Module.qll b/ql/src/codeql_ql/ast/internal/Module.qll index 47f91122706..1443876c30d 100644 --- a/ql/src/codeql_ql/ast/internal/Module.qll +++ b/ql/src/codeql_ql/ast/internal/Module.qll @@ -74,23 +74,6 @@ private class Folder_ extends ContainerOrModule, TFolder { Folder getFolder() { result = f } } -// TODO: Use `AstNode::getParent` once it is total -private Generated::AstNode parent(Generated::AstNode n) { - result = n.getParent() and - not n instanceof Generated::Module -} - -private Module getEnclosingModule0(AstNode n) { - AstNodes::toGenerated(result) = parent*(AstNodes::toGenerated(n).getParent()) -} - -ContainerOrModule getEnclosingModule(AstNode n) { - result = TModule(getEnclosingModule0(n)) - or - not exists(getEnclosingModule0(n)) and - result = TFile(n.getLocation().getFile()) -} - class Module_ extends FileOrModule, TModule { Module m; @@ -163,6 +146,24 @@ private predicate resolveSelectionName(Import imp, ContainerOrModule m, int i) { cached private module Cached { + // TODO: Use `AstNode::getParent` once it is total + private Generated::AstNode parent(Generated::AstNode n) { + result = n.getParent() and + not n instanceof Generated::Module + } + + private Module getEnclosingModule0(AstNode n) { + AstNodes::toGenerated(result) = parent*(AstNodes::toGenerated(n).getParent()) + } + + cached + ContainerOrModule getEnclosingModule(AstNode n) { + result = TModule(getEnclosingModule0(n)) + or + not exists(getEnclosingModule0(n)) and + result = TFile(n.getLocation().getFile()) + } + cached module NewType { cached diff --git a/ql/src/codeql_ql/ast/internal/Variable.qll b/ql/src/codeql_ql/ast/internal/Variable.qll index eb3659cef7c..8b8d25d955e 100644 --- a/ql/src/codeql_ql/ast/internal/Variable.qll +++ b/ql/src/codeql_ql/ast/internal/Variable.qll @@ -72,7 +72,7 @@ private module Cached { predicate resolveVariable(Identifier i, VarDef decl) { scopeOf(i).containsVar(decl, getName(i)) } cached - predicate resolveField(Identifier i, VarDef decl) { scopeOf(i).containsField(decl, getName(i)) } + predicate resolveField(Identifier i, VarDef decl) { scopeOf(i).containsField(decl, pragma[only_bind_into](getName(i))) } } import Cached From 705e24690f6ca2b5b54a6cc2ec26da05d5d3d9ea Mon Sep 17 00:00:00 2001 From: Erik Krogh Kristensen Date: Wed, 13 Oct 2021 13:26:37 +0200 Subject: [PATCH 2/3] cache getClassPredicate --- ql/src/codeql_ql/ast/internal/Type.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ql/src/codeql_ql/ast/internal/Type.qll b/ql/src/codeql_ql/ast/internal/Type.qll index 34327b9486e..32e1000f426 100644 --- a/ql/src/codeql_ql/ast/internal/Type.qll +++ b/ql/src/codeql_ql/ast/internal/Type.qll @@ -76,7 +76,7 @@ class Type extends TType { p2 = classPredCandidate(this, name, arity) } - pragma[nomagic] + cached PredicateOrBuiltin getClassPredicate(string name, int arity) { result = classPredCandidate(this, name, arity) and not getClassPredicate1(name, arity, _, result) From 4cb004c0c6597e22e68a65ac497da9e9448d90cc Mon Sep 17 00:00:00 2001 From: Erik Krogh Kristensen Date: Wed, 13 Oct 2021 13:34:47 +0200 Subject: [PATCH 3/3] autoformat --- ql/src/codeql_ql/ast/internal/Variable.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ql/src/codeql_ql/ast/internal/Variable.qll b/ql/src/codeql_ql/ast/internal/Variable.qll index 8b8d25d955e..349bad6a7ca 100644 --- a/ql/src/codeql_ql/ast/internal/Variable.qll +++ b/ql/src/codeql_ql/ast/internal/Variable.qll @@ -72,7 +72,9 @@ private module Cached { predicate resolveVariable(Identifier i, VarDef decl) { scopeOf(i).containsVar(decl, getName(i)) } cached - predicate resolveField(Identifier i, VarDef decl) { scopeOf(i).containsField(decl, pragma[only_bind_into](getName(i))) } + predicate resolveField(Identifier i, VarDef decl) { + scopeOf(i).containsField(decl, pragma[only_bind_into](getName(i))) + } } import Cached