]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModule.java
(refs #7245) The first version of decompiler for SCL compilations
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / runtime / RuntimeModule.java
index aeb21ffa63b333a5aae9cd1b018c75aad4549e29..4ed45005b9659aa8fc42f1c6790e1c8f851abf64 100644 (file)
@@ -1,5 +1,6 @@
 package org.simantics.scl.compiler.runtime;
 
+import java.io.OutputStreamWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -13,12 +14,19 @@ import org.simantics.scl.compiler.environment.GlobalOnlyEnvironment;
 import org.simantics.scl.compiler.internal.codegen.types.JavaTypeTranslator;
 import org.simantics.scl.compiler.internal.codegen.utils.JavaNamingPolicy;
 import org.simantics.scl.compiler.internal.codegen.utils.TransientClassBuilder;
+import org.simantics.scl.compiler.internal.decompilation.DecompilerFactory;
+import org.simantics.scl.compiler.internal.decompilation.IDecompiler;
 import org.simantics.scl.compiler.module.Module;
+import org.simantics.scl.compiler.top.SCLCompilerConfiguration;
 import org.simantics.scl.compiler.top.ValueNotFound;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import gnu.trove.map.hash.THashMap;
 
 public class RuntimeModule {
+    private static final Logger LOGGER = LoggerFactory.getLogger(RuntimeModule.class);
+    
     public static final boolean VALIDATE_CLASS_NAMES = true;
     public static final boolean TRACE_CLASS_CREATION = false;
     
@@ -66,6 +74,7 @@ public class RuntimeModule {
                         */
         }
         
+        @Override
         public byte[] getBytes(String name) {
             // Non-SCL classes are not handled here
             if(!name.startsWith(SCL_PACKAGE_PREFIX))
@@ -93,7 +102,7 @@ public class RuntimeModule {
                 return parentModule.classLoader.getBytes(name);
             }
         }
-        
+
         synchronized Class<?> getLocalClass(String name) throws ClassNotFoundException {
             // Is class already loaded
             Class<?> clazz = findLoadedClass(name);
@@ -107,7 +116,9 @@ public class RuntimeModule {
                 bytes = localClasses.get(internalName);
                 if(bytes == null)
                     throw new ClassNotFoundException(name);
-            }            
+            }
+            if(SCLCompilerConfiguration.SHOW_DECOMPILED_BYTECODE)
+                showDecompiledBytecode(internalName);
             return defineClass(name, bytes, 0, bytes.length);
         }
         
@@ -139,8 +150,8 @@ public class RuntimeModule {
             {
                 RuntimeModule parentModule = parentModuleMap.get(requestedModuleName);
                 if(parentModule == null) {
-                    System.err.println("requestedModuleName = " + requestedModuleName);
-                    System.err.println("this.moduleName = " + this.moduleName);
+                    LOGGER.error("requestedModuleName = " + requestedModuleName);
+                    LOGGER.error("this.moduleName = " + this.moduleName);
                     throw new ClassNotFoundException(name);
                 }
 
@@ -187,6 +198,13 @@ public class RuntimeModule {
         public ClassLoader getClassLoader() {
             return this;
         }
+        
+        private void showDecompiledBytecode(String className) {
+            IDecompiler decompiler = DecompilerFactory.getDecompiler();
+            if(decompiler == null)
+                return;
+            decompiler.decompile(this, className, new OutputStreamWriter(System.out));
+        }
     }