]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/writer/ModuleWriter.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / writer / ModuleWriter.java
1 package org.simantics.scl.compiler.internal.codegen.writer;
2
3 import java.util.Map;
4
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;
17
18 import gnu.trove.map.hash.THashMap;
19
20 public class ModuleWriter {
21     
22     SSAModule module;
23     LineLocator lineLocator;
24     
25     String moduleClassName;
26     THashMap<Tuple2, JavaStaticField> externalConstantMap = 
27                 new THashMap<Tuple2, JavaStaticField>();
28     int externalConstantId = 0;
29     
30     public ModuleWriter(String moduleClassName, LineLocator lineLocator) {
31         this.module = new SSAModule();
32         this.moduleClassName = moduleClassName;
33         this.lineLocator = lineLocator;
34     }
35
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);
46     }
47     
48     @Override
49     public String toString() {
50         return module.toString();
51     }
52
53     public SSAModule getModule() {
54         return module;
55     }
56
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);
61                 else {          
62                         ++externalConstantId;
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));
67                         return constant;
68                 }
69         }
70
71         public ExternalConstant[] getExternalConstants() {
72             ExternalConstant[] result = new ExternalConstant[externalConstantMap.size()];
73                 int i=0;
74                 for(Map.Entry<Tuple2, JavaStaticField> entry : externalConstantMap.entrySet()) {
75                         result[i++] = new ExternalConstant(entry.getValue().getFieldName(), entry.getKey().c0);
76                 }
77                 return result;
78         }
79     
80 }