]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / utils / CopyContext.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/CopyContext.java
new file mode 100644 (file)
index 0000000..2383c20
--- /dev/null
@@ -0,0 +1,103 @@
+package org.simantics.scl.compiler.internal.codegen.utils;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
+import org.simantics.scl.compiler.internal.codegen.continuations.Cont;\r
+import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;\r
+import org.simantics.scl.compiler.internal.codegen.references.BoundVar;\r
+import org.simantics.scl.compiler.internal.codegen.references.Val;\r
+import org.simantics.scl.compiler.internal.codegen.references.ValRef;\r
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;\r
+import org.simantics.scl.compiler.types.TVar;\r
+import org.simantics.scl.compiler.types.Type;\r
+import org.simantics.scl.compiler.types.Types;\r
+\r
+public class CopyContext {\r
+\r
+    THashMap<Val, Val> valMap = new THashMap<Val, Val>();\r
+    THashMap<Cont, Cont> contMap = new THashMap<Cont, Cont>();\r
+    THashMap<TVar, TVar> tvarMap = new THashMap<TVar, TVar>(); \r
+    \r
+    public void put(Val src, Val tgt) {\r
+        Val ret = valMap.put(src, tgt);\r
+        if(SCLCompilerConfiguration.DEBUG) {\r
+            if(ret != null)\r
+                throw new InternalCompilerError();\r
+        }\r
+    }\r
+\r
+    public void put(Cont src, Cont tgt) {\r
+        Cont ret = contMap.put(src, tgt);\r
+        if(SCLCompilerConfiguration.DEBUG) {\r
+            if(ret != null)\r
+                throw new InternalCompilerError();\r
+        }\r
+    }\r
+    \r
+    public TVar[] copyParameters(TVar[] vars) {\r
+        TVar[] result = new TVar[vars.length];\r
+        for(int i=0;i<vars.length;++i) {\r
+            TVar var = vars[i];\r
+            TVar newVar = Types.var(var.getKind());\r
+            result[i] = newVar;\r
+            tvarMap.put(var, newVar);\r
+        }\r
+        return result;\r
+    }\r
+\r
+    public BoundVar[] copy(BoundVar[] src) {\r
+        BoundVar[] tgt = new BoundVar[src.length];\r
+        for(int i=0;i<src.length;++i)\r
+            tgt[i] = copy(src[i]);\r
+        return tgt;\r
+    }\r
+    \r
+    public ValRef[] copy(ValRef[] src) {\r
+        ValRef[] tgt = new ValRef[src.length];\r
+        for(int i=0;i<src.length;++i)\r
+            tgt[i] = copy(src[i]);\r
+        return tgt;\r
+    }\r
+    \r
+    public ValRef copy(ValRef src) {\r
+        return copy(src.getBinding())\r
+                .createOccurrence(Types.replace(src.getTypeParameters(), tvarMap));\r
+    }\r
+\r
+    @SuppressWarnings("unchecked")\r
+    public <T extends Val> T copy(T src) {\r
+        Val tgt = valMap.get(src);\r
+        if(tgt != null)\r
+            return (T)tgt;\r
+        tgt = src.copy(tvarMap);\r
+        valMap.put(src, tgt);\r
+        return (T)tgt;\r
+    }\r
+    \r
+    public ContRef[] copy(ContRef[] src) {\r
+        ContRef[] tgt = new ContRef[src.length];\r
+        for(int i=0;i<src.length;++i)\r
+            tgt[i] = copy(src[i]);\r
+        return tgt;\r
+    }\r
+    \r
+    public ContRef copy(ContRef src) {\r
+        return copy(src.getBinding()).createOccurrence();\r
+    }\r
+\r
+    @SuppressWarnings("unchecked")\r
+    public <T extends Cont> T copy(T src) {\r
+        Cont tgt = contMap.get(src);\r
+        if(tgt != null)\r
+            return (T)tgt;\r
+        tgt = src.copy(this);\r
+        contMap.put(src, tgt);\r
+        return (T)tgt;\r
+    }\r
+\r
+    public Type copyType(Type type) {\r
+        return type.replace(tvarMap); \r
+    }\r
+\r
+}\r