import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
import org.simantics.scl.compiler.types.Type;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import gnu.trove.map.hash.THashMap;
public class ModuleBuilder {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ModuleBuilder.class);
+
JavaNamingPolicy namingPolicy;
JavaTypeTranslator javaTypeTranslator;
public void addClass(ClassBuilder cb) {
byte[] bytecode = cb.finishClass();
classes.put(cb.getClassName(), bytecode);
- //System.out.println("Added " + cb.getClassName());
+ //LOGGER.info("Added " + cb.getClassName());
}
public JavaTypeTranslator getJavaTypeTranslator() {
ClassBuilder classBuilder;
if(remainingArity <= Constants.MAX_FUNCTION_PARAMETER_COUNT) {
if(SCLCompilerConfiguration.TRACE_METHOD_CREATION)
- System.out.println("Create class " + className);
+ LOGGER.info("Create class " + className);
classBuilder = new ClassBuilder(this, Opcodes.ACC_PUBLIC, className, MethodBuilderBase.getClassName(Constants.FUNCTION_IMPL[remainingArity]));
classBuilder.setSourceFile("_SCL_Closure");
// Create fields
CodeBuilderUtils.makeRecord(classBuilder, functionValue.toString(), Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL, "p",
Arrays.copyOf(parameterTypes, knownParametersCount),
- false);
+ true);
// Create apply
{
}
else {
if(SCLCompilerConfiguration.TRACE_METHOD_CREATION)
- System.out.println("Create class " + className);
+ LOGGER.info("Create class " + className);
classBuilder = new ClassBuilder(this, Opcodes.ACC_PUBLIC, className, MethodBuilderBase.getClassName(Constants.FUNCTION_N_IMPL));
classBuilder.setSourceFile("_SCL_Closure");
// Create constructor
{
- MethodBuilderBase mb = classBuilder.addConstructor(Opcodes.ACC_PUBLIC, Arrays.copyOf(parameterTypes, knownParametersCount));
+ MethodBuilderBase mb = classBuilder.addConstructorBase(Opcodes.ACC_PUBLIC, Arrays.copyOf(parameterTypes, knownParametersCount));
mb.loadThis();
mb.loadConstant(remainingArity);
mb.invokeConstructor(MethodBuilderBase.getClassName(Constants.FUNCTION_N_IMPL), new TypeDesc[] { TypeDesc.INT });
for(int i=0;i<knownParametersCount;++i) {
mb.loadThis();
mb.loadLocal(mb.getParameter(i));
- mb.storeField(className, "p"+i, parameterTypes[i]);
+ mb.storeField(className, "p"+i, parameterTypes[i]);
}
mb.returnVoid();
mb.finish();
functionValue.applyExact(mb, parameters);
mb.box(functionValue.getReturnType());
mb.returnValue(TypeDesc.OBJECT);
- }
+ }
+
+ CodeBuilderUtils.implementHashCodeAndEquals(classBuilder, functionValue.toString(), "p", parameterTypes);
}
// Finish