-package org.simantics.scl.compiler.internal.codegen.utils;\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
-import gnu.trove.map.hash.THashMap;\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
+package org.simantics.scl.compiler.internal.codegen.utils;
+
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.internal.codegen.continuations.Cont;
+import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;
+import org.simantics.scl.compiler.internal.codegen.references.BoundVar;
+import org.simantics.scl.compiler.internal.codegen.references.Val;
+import org.simantics.scl.compiler.internal.codegen.references.ValRef;
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
+import org.simantics.scl.compiler.types.TVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+
+import gnu.trove.map.hash.THashMap;
+
+public class CopyContext {
+
+ THashMap<Val, Val> valMap = new THashMap<Val, Val>();
+ THashMap<Cont, Cont> contMap = new THashMap<Cont, Cont>();
+ THashMap<TVar, TVar> tvarMap = new THashMap<TVar, TVar>();
+
+ public void put(Val src, Val tgt) {
+ Val ret = valMap.put(src, tgt);
+ if(SCLCompilerConfiguration.DEBUG) {
+ if(ret != null)
+ throw new InternalCompilerError();
+ }
+ }
+
+ public void put(Cont src, Cont tgt) {
+ Cont ret = contMap.put(src, tgt);
+ if(SCLCompilerConfiguration.DEBUG) {
+ if(ret != null)
+ throw new InternalCompilerError();
+ }
+ }
+
+ public TVar[] copyParameters(TVar[] vars) {
+ TVar[] result = new TVar[vars.length];
+ for(int i=0;i<vars.length;++i) {
+ TVar var = vars[i];
+ TVar newVar = Types.var(var.getKind());
+ result[i] = newVar;
+ tvarMap.put(var, newVar);
+ }
+ return result;
+ }
+
+ public BoundVar[] copy(BoundVar[] src) {
+ BoundVar[] tgt = new BoundVar[src.length];
+ for(int i=0;i<src.length;++i)
+ tgt[i] = copy(src[i]);
+ return tgt;
+ }
+
+ public ValRef[] copy(ValRef[] src) {
+ ValRef[] tgt = new ValRef[src.length];
+ for(int i=0;i<src.length;++i)
+ tgt[i] = copy(src[i]);
+ return tgt;
+ }
+
+ public ValRef copy(ValRef src) {
+ return copy(src.getBinding())
+ .createOccurrence(Types.replace(src.getTypeParameters(), tvarMap));
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends Val> T copy(T src) {
+ Val tgt = valMap.get(src);
+ if(tgt != null)
+ return (T)tgt;
+ tgt = src.copy(tvarMap);
+ valMap.put(src, tgt);
+ return (T)tgt;
+ }
+
+ public ContRef[] copy(ContRef[] src) {
+ ContRef[] tgt = new ContRef[src.length];
+ for(int i=0;i<src.length;++i)
+ tgt[i] = copy(src[i]);
+ return tgt;
+ }
+
+ public ContRef copy(ContRef src) {
+ return copy(src.getBinding()).createOccurrence();
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends Cont> T copy(T src) {
+ Cont tgt = contMap.get(src);
+ if(tgt != null)
+ return (T)tgt;
+ tgt = src.copy(this);
+ contMap.put(src, tgt);
+ return (T)tgt;
+ }
+
+ public Type copyType(Type type) {
+ return type.replace(tvarMap);
+ }
+
+}