]> gerrit.simantics Code Review - simantics/platform.git/blob
714f66b952fdba86910f0e270a8c2d64756f41dd
[simantics/platform.git] /
1 package org.simantics.scl.compiler.internal.codegen.writer;
2
3 import gnu.trove.map.hash.THashMap;
4
5 import java.util.Map;
6
7 import org.simantics.scl.compiler.common.names.Name;
8 import org.simantics.scl.compiler.constants.Constant;
9 import org.simantics.scl.compiler.constants.JavaStaticField;
10 import org.simantics.scl.compiler.constants.SCLConstant;
11 import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock;
12 import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
13 import org.simantics.scl.compiler.internal.codegen.ssa.SSAModule;
14 import org.simantics.scl.compiler.types.TVar;
15 import org.simantics.scl.compiler.types.Type;
16 import org.simantics.scl.runtime.tuple.Tuple2;
17
18 public class ModuleWriter {
19     
20     SSAModule module;
21     
22     String moduleClassName;
23     THashMap<Tuple2, JavaStaticField> externalConstantMap = 
24                 new THashMap<Tuple2, JavaStaticField>();
25     int externalConstantId = 0;
26     
27     public ModuleWriter(String moduleClassName) {
28         this.module = new SSAModule();
29         this.moduleClassName = moduleClassName;
30     }
31
32     public CodeWriter createFunction(SCLConstant constant, TVar[] typeParameters,
33             Type effect, Type returnType, Type[] parameterTypes) {
34         Name name = constant.getName();
35         SSAFunction function = new SSAFunction(typeParameters, effect, returnType);
36         SSABlock block = new SSABlock(parameterTypes);
37         function.addBlock(block);
38         function.setTarget(constant);
39         constant.setDefinition(function);
40         module.put(name, constant);
41         return new CodeWriter(this, block);
42     }
43     
44     @Override
45     public String toString() {
46         return module.toString();
47     }
48
49     public SSAModule getModule() {
50         return module;
51     }
52
53         public Constant getExternalConstant(Object value, Type type) {
54                 Tuple2 tuple = new Tuple2(value, type);
55                 if(externalConstantMap.contains(tuple))
56                         return externalConstantMap.get(tuple);
57                 else {          
58                         ++externalConstantId;
59                         String name = "externalConstant" + externalConstantId;
60                         JavaStaticField constant = new JavaStaticField(moduleClassName, name, type, -1);
61                         externalConstantMap.put(tuple, constant);
62                         module.addStaticField(new Tuple2(name, type));
63                         return constant;
64                 }
65         }
66
67         public ExternalConstant[] getExternalConstants() {
68             ExternalConstant[] result = new ExternalConstant[externalConstantMap.size()];
69                 int i=0;
70                 for(Map.Entry<Tuple2, JavaStaticField> entry : externalConstantMap.entrySet()) {
71                         result[i++] = new ExternalConstant(entry.getValue().getFieldName(), entry.getKey().c0);
72                 }
73                 return result;
74         }
75     
76 }