From 8dac19aca0afe5a5b502db8eb6176d05c742deee Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Thu, 9 Apr 2020 22:38:30 +0200 Subject: [PATCH] Added caching of global symbols. Results in faster compilation. --- .../kickc/model/symbols/ProgramScope.java | 20 ++++++++++++++----- .../camelot64/kickc/model/symbols/Scope.java | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java b/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java index ae3b10d95..aad6547ba 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/ProgramScope.java @@ -7,16 +7,21 @@ import dk.camelot64.kickc.model.types.SymbolType; import dk.camelot64.kickc.model.types.SymbolTypeProgram; import dk.camelot64.kickc.model.values.*; -import java.util.Arrays; -import java.util.Deque; -import java.util.LinkedList; +import java.util.*; /** The program scope containing the symbols of a program */ public class ProgramScope extends Scope { + /** Caches the global symbols for fast lookup. */ + private Map cachedGlobalSymbols; public ProgramScope() { super("", null, Scope.SEGMENT_DATA_DEFAULT); + cachedGlobalSymbols = new HashMap<>(); + } + + public void clearCache() { + this.cachedGlobalSymbols = new HashMap<>(); } @Override @@ -24,7 +29,6 @@ public class ProgramScope extends Scope { return new SymbolTypeProgram(); } - /** * Get a symbol from it's full name. * @@ -32,6 +36,9 @@ public class ProgramScope extends Scope { * @return The symbol. Null if not found. */ public Symbol getGlobalSymbol(String fullName) { + final Symbol cachedSymbol = cachedGlobalSymbols.get(fullName); + if(cachedSymbol != null) + return cachedSymbol; final Deque names = new LinkedList<>(Arrays.asList(fullName.split("::"))); Scope scope = this; while(names.size() > 1) { @@ -40,7 +47,10 @@ public class ProgramScope extends Scope { if(scope == null) return null; } - return scope.getLocalSymbol(names.removeFirst()); + final Symbol symbol = scope.getLocalSymbol(names.removeFirst()); + if(symbol != null) + cachedGlobalSymbols.put(fullName, symbol); + return symbol; } public Symbol getSymbol(SymbolRef symbolRef) { diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java b/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java index 65cd7222d..e3e40505e 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/Scope.java @@ -99,6 +99,7 @@ public abstract class Scope implements Symbol, Serializable { public void remove(Symbol symbol) { symbols.remove(symbol.getLocalName()); + getProgramScope().clearCache(); }