From 7bc5be93ff0ddabc8f711dcee31740c37de87fbd Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Fri, 9 Apr 2021 13:29:27 +0200 Subject: [PATCH] Module: make main predicates cached --- ql/src/codeql_ruby/ast/internal/Module.qll | 39 ++++++++++++---------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ql/src/codeql_ruby/ast/internal/Module.qll b/ql/src/codeql_ruby/ast/internal/Module.qll index e204e6aa24b..f70a897e12a 100644 --- a/ql/src/codeql_ruby/ast/internal/Module.qll +++ b/ql/src/codeql_ruby/ast/internal/Module.qll @@ -10,13 +10,29 @@ private import codeql_ruby.ast.Scope private string builtin() { result = ["Object", "Kernel", "BasicObject", "Class", "Module"] } cached -newtype TModule = - TResolved(string qName) { - qName = builtin() +module Cached { + cached + newtype TModule = + TResolved(string qName) { + qName = builtin() + or + qName = constantDefinition(_) + } or + TUnresolved(Namespace n) { not exists(constantDefinition(n)) } + + cached + string constantDefinition(ConstantWriteAccess n) { + isToplevel(n) and result = n.getName() or - qName = constantDefinition(_) - } or - TUnresolved(Namespace n) { not exists(constantDefinition(n)) } + not isToplevel(n) and + not exists(n.getScopeExpr()) and + result = scopeAppend(constantDefinition(n.getEnclosingModule()), n.getName()) + or + result = scopeAppend(resolveScopeExpr(n.getScopeExpr()), n.getName()) + } +} + +import Cached private predicate isToplevel(ConstantAccess n) { not exists(n.getScopeExpr()) and @@ -27,16 +43,6 @@ private predicate isToplevel(ConstantAccess n) { ) } -string constantDefinition(ConstantWriteAccess n) { - isToplevel(n) and result = n.getName() - or - not isToplevel(n) and - not exists(n.getScopeExpr()) and - result = scopeAppend(constantDefinition(n.getEnclosingModule()), n.getName()) - or - result = scopeAppend(resolveScopeExpr(n.getScopeExpr()), n.getName()) -} - private predicate isDefinedConstant(string qualifiedModuleName) { qualifiedModuleName = [builtin(), constantDefinition0(_)] } @@ -64,7 +70,6 @@ private string resolveScopeExpr(ConstantReadAccess r) { ) } -cached private int maxDepth() { result = max(ConstantAccess c | | count(c.getEnclosingModule+())) } private ModuleBase enclosing(ModuleBase m, int level) {