import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.CodeSizeEvaluator;
import org.objectweb.asm.util.TraceClassVisitor;
+import org.simantics.scl.compiler.internal.codegen.utils.LoggingOutputStream.LogLevel;
import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ClassBuilder {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ClassBuilder.class);
+
ModuleBuilder moduleBuilder;
String className;
String superClassName;
this.className = className;
this.superClassName = superClassName;
this.classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- this.classVisitor = SCLCompilerConfiguration.SHOW_COMPILED_BYTECODE
- ? new TraceClassVisitor(classWriter, new PrintWriter(System.out))
+ this.classVisitor = SCLCompilerConfiguration.SHOW_COMPILED_BYTECODE
+ && SCLCompilerConfiguration.debugFilter(moduleBuilder.namingPolicy.getModuleName())
+ ? new TraceClassVisitor(classWriter, new PrintWriter(new LoggingOutputStream(LOGGER, LogLevel.INFO)))
: classWriter;
classVisitor.visit(Opcodes.V1_5, access, className, null, superClassName, interfaces);
}
String methodName,
TypeDesc ret,
TypeDesc[] params) {
+ for(TypeDesc param : params)
+ if(param.equals(TypeDesc.VOID))
+ throw new IllegalArgumentException();
MethodVisitor methodVisitor = classVisitor.visitMethod(access, methodName,
MethodDesc.forArguments(ret, params).getDescriptor(),
null, null);
String methodName,
TypeDesc ret,
TypeDesc[] params) {
+ for(TypeDesc param : params)
+ if(param.equals(TypeDesc.VOID))
+ throw new IllegalArgumentException();
MethodVisitor methodVisitor = classVisitor.visitMethod(access, methodName,
MethodDesc.forArguments(ret, params).getDescriptor(),
null, null);
String methodName,
TypeDesc ret,
TypeDesc[] params) {
+ for(TypeDesc param : params)
+ if(param.equals(TypeDesc.VOID))
+ throw new IllegalArgumentException();
MethodVisitor methodVisitor = classVisitor.visitMethod(access, methodName,
MethodDesc.forArguments(ret, params).getDescriptor(),
null, null);
methodVisitor.visitEnd();
}
- public MethodBuilderBase addConstructor(int access, TypeDesc[] params) {
+ public MethodBuilderBase addConstructorBase(int access, TypeDesc[] params) {
return addMethodBase(access, "<init>", TypeDesc.VOID, params);
}
+
+ public MethodBuilder addConstructor(int access, TypeDesc[] params) {
+ return addMethod(access, "<init>", TypeDesc.VOID, params);
+ }
public MethodBuilder addInitializer() {
return addMethod(Opcodes.ACC_PUBLIC, "<clinit>", TypeDesc.VOID, Constants.EMPTY_TYPEDESC_ARRAY);
public void addField(int access, String fieldName,
TypeDesc type) {
+ if(type.equals(TypeDesc.VOID))
+ throw new IllegalArgumentException();
FieldVisitor fieldVisitor = classVisitor.visitField(access, fieldName, type.getDescriptor(), null, null);
fieldVisitor.visitEnd();
}