]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / top / ExpressionInterpretationContext.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/top/ExpressionInterpretationContext.java
new file mode 100644 (file)
index 0000000..e808839
--- /dev/null
@@ -0,0 +1,59 @@
+package org.simantics.scl.compiler.top;
+
+import gnu.trove.impl.Constants;
+import gnu.trove.map.hash.TObjectIntHashMap;
+
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.elaboration.expressions.Variable;
+import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
+import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
+
+
+public class ExpressionInterpretationContext {
+
+    public final RuntimeEnvironment runtimeEnvironment;
+    public final TransientClassBuilder localClassBuilder;
+    private int curVariableId = 0;
+    private int maxVariableId = 0;
+    private final TObjectIntHashMap<Variable> variableIds =
+            new TObjectIntHashMap<Variable>(
+                    Constants.DEFAULT_CAPACITY,
+                    Constants.DEFAULT_LOAD_FACTOR,
+                    -1);
+    
+    public ExpressionInterpretationContext(
+            RuntimeEnvironment runtimeEnvironment,
+            TransientClassBuilder localClassBuilder) {
+        this.runtimeEnvironment = runtimeEnvironment;
+        this.localClassBuilder = localClassBuilder;
+    }
+
+    public int push(Variable var) {
+        int id = curVariableId++;
+        variableIds.put(var, id);
+        maxVariableId = Math.max(maxVariableId, curVariableId);
+        return id;
+    }
+    
+    public void pop(Variable var) {
+        int id = variableIds.remove(var);
+        --curVariableId;
+        if(id != curVariableId)
+            throw new IllegalStateException("Variable pushs and pops don't match.");
+    }
+    
+    public int getVariableId(Variable var) {
+        int id = variableIds.get(var);
+        if(id < 0)
+            throw new InternalCompilerError("Encontered bug while interpreting exception: variable " + var + " was not bounded.");
+        return id;
+    }
+
+    public ExpressionInterpretationContext createNewContext() {
+        return new ExpressionInterpretationContext(runtimeEnvironment, localClassBuilder);
+    }
+    
+    public int getMaxVariableId() {
+        return maxVariableId;
+    }
+}