1 package org.simantics.scl.compiler.internal.codegen.writer;
5 import org.simantics.scl.compiler.common.names.Name;
6 import org.simantics.scl.compiler.constants.Constant;
7 import org.simantics.scl.compiler.constants.JavaStaticField;
8 import org.simantics.scl.compiler.constants.SCLConstant;
9 import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock;
10 import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction;
11 import org.simantics.scl.compiler.internal.codegen.ssa.SSAModule;
12 import org.simantics.scl.compiler.internal.codegen.ssa.StaticField;
13 import org.simantics.scl.compiler.internal.parsing.utils.LineLocator;
14 import org.simantics.scl.compiler.types.TVar;
15 import org.simantics.scl.compiler.types.Type;
16 import org.simantics.scl.runtime.tuple.Tuple2;
18 import gnu.trove.map.hash.THashMap;
20 public class ModuleWriter {
23 LineLocator lineLocator;
25 String moduleClassName;
26 THashMap<Tuple2, JavaStaticField> externalConstantMap =
27 new THashMap<Tuple2, JavaStaticField>();
28 int externalConstantId = 0;
30 public ModuleWriter(String moduleClassName, LineLocator lineLocator) {
31 this.module = new SSAModule();
32 this.moduleClassName = moduleClassName;
33 this.lineLocator = lineLocator;
36 public CodeWriter createFunction(SCLConstant constant, TVar[] typeParameters,
37 Type effect, Type returnType, Type[] parameterTypes) {
38 Name name = constant.getName();
39 SSAFunction function = new SSAFunction(typeParameters, effect, returnType);
40 SSABlock block = new SSABlock(parameterTypes);
41 function.addBlock(block);
42 function.setTarget(constant);
43 constant.setDefinition(function);
44 module.put(name, constant);
45 return new CodeWriter(this, block);
49 public String toString() {
50 return module.toString();
53 public SSAModule getModule() {
57 public Constant getExternalConstant(Object value, Type type) {
58 Tuple2 tuple = new Tuple2(value, type);
59 if(externalConstantMap.contains(tuple))
60 return externalConstantMap.get(tuple);
63 String name = "externalConstant" + externalConstantId;
64 JavaStaticField constant = new JavaStaticField(moduleClassName, name, type, -1);
65 externalConstantMap.put(tuple, constant);
66 module.addStaticField(new StaticField(name, type));
71 public ExternalConstant[] getExternalConstants() {
72 ExternalConstant[] result = new ExternalConstant[externalConstantMap.size()];
74 for(Map.Entry<Tuple2, JavaStaticField> entry : externalConstantMap.entrySet()) {
75 result[i++] = new ExternalConstant(entry.getValue().getFieldName(), entry.getKey().c0);