import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
-import org.simantics.scl.compiler.types.Type;
-import org.simantics.scl.runtime.tuple.Tuple2;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import gnu.trove.map.hash.THashMap;
import gnu.trove.procedure.TObjectObjectProcedure;
import gnu.trove.procedure.TObjectProcedure;
public class SSAModule {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SSAModule.class);
+
THashMap<Name, SCLConstant> functions = new THashMap<Name, SCLConstant>();
- ArrayList<Tuple2> staticFields = new ArrayList<Tuple2>();
+ ArrayList<StaticField> staticFields = new ArrayList<StaticField>();
+ public ArrayList<SSAClosure> closuresToGenerate = new ArrayList<SSAClosure>();
public void put(Name name, SCLConstant function) {
functions.put(name, function);
try {
function.getDefinition().validate(context);
} catch(RuntimeException e) {
- System.out.println("-- VALIDATE " + function.getName() + " ----------------");
+ LOGGER.info("-- VALIDATE " + function.getName() + " ----------------");
PrintingContext printingContext = new PrintingContext();
printingContext.setErrorMarker(context.errorMarker);
function.getDefinition().toString(printingContext);
- System.out.println(printingContext.toString());
+ LOGGER.info(printingContext.toString());
throw e;
}
}
public void generateCode(final ModuleBuilder moduleBuilder) throws CodeBuildingException {
final String moduleClassName = moduleBuilder.getNamingPolicy().getModuleClassName();
if(SCLCompilerConfiguration.TRACE_METHOD_CREATION)
- System.out.println("Create class " + moduleClassName);
+ LOGGER.info("Create class " + moduleClassName);
final ClassBuilder classFile = new ClassBuilder(moduleBuilder, Opcodes.ACC_PUBLIC, moduleClassName,
"java/lang/Object");
- classFile.setSourceFile("_SCL_Module");
+ classFile.setSourceFile(moduleBuilder.getNamingPolicy().getModuleName());
functions.forEachValue(new TObjectProcedure<SCLConstant>() {
@Override
public boolean execute(SCLConstant function) {
});
JavaTypeTranslator javaTypeTranslator = moduleBuilder.getJavaTypeTranslator();
- for(Tuple2 tuple : staticFields) {
- classFile.addField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, (String)tuple.c0,
- javaTypeTranslator.toTypeDesc((Type)tuple.c1));
+ for(StaticField tuple : staticFields) {
+ classFile.addField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, tuple.name,
+ javaTypeTranslator.toTypeDesc(tuple.type));
}
classFile.addDefaultConstructor();
moduleBuilder.addClass(classFile);
+
+ for(SSAClosure closure : closuresToGenerate)
+ closure.generateCode(moduleBuilder);
}
/**
});
}
- public void addStaticField(Tuple2 tuple) {
+ public void addStaticField(StaticField tuple) {
staticFields.add(tuple);
}
for(SCLConstant function : functions.values())
function.saveInlinableDefinition();
}
+
+ public void cleanup() {
+ for(SSAClosure closure : closuresToGenerate)
+ closure.cleanup();
+ for(SCLConstant constant : functions.values())
+ constant.cleanup();
+ }
}