]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/utils/ClassBuilder.java
Make it possible to debug SCL compiler in production builds
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / utils / ClassBuilder.java
index 5518cb4878fec54a1d384b406f4d767e169427be..e0571dbd321bf46f63f822d3ebcb0fbccc8ace9e 100644 (file)
@@ -11,9 +11,15 @@ import org.objectweb.asm.MethodVisitor;
 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;
@@ -28,8 +34,9 @@ public class ClassBuilder {
         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);
     }
@@ -42,6 +49,9 @@ public class ClassBuilder {
             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);
@@ -68,6 +78,9 @@ public class ClassBuilder {
             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);
@@ -79,6 +92,9 @@ public class ClassBuilder {
             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);
@@ -87,9 +103,13 @@ public class ClassBuilder {
         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);
@@ -101,6 +121,8 @@ public class ClassBuilder {
 
     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();
     }