--- /dev/null
+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