]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModule.java
(refs #7250) Merging master, minor CHR bugfixes
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / runtime / RuntimeModule.java
index c5904b3c44fdb8f35427aa548e4c7165e877c932..5ae73c41240700f44662e1b70f6851487752b290 100644 (file)
@@ -1,9 +1,9 @@
 package org.simantics.scl.compiler.runtime;
 
-import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 
 import org.simantics.scl.compiler.constants.Constant;
@@ -14,21 +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 com.strobel.assembler.metadata.Buffer;
-import com.strobel.assembler.metadata.ClasspathTypeLoader;
-import com.strobel.assembler.metadata.CompositeTypeLoader;
-import com.strobel.assembler.metadata.ITypeLoader;
-import com.strobel.decompiler.Decompiler;
-import com.strobel.decompiler.DecompilerSettings;
-import com.strobel.decompiler.PlainTextOutput;
+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;
     
@@ -76,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))
@@ -103,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);
@@ -118,31 +117,8 @@ public class RuntimeModule {
                 if(bytes == null)
                     throw new ClassNotFoundException(name);
             }
-            if(SCLCompilerConfiguration.SHOW_LOADED_CLASSES_DISASSEMBLED) {
-                DecompilerSettings settings = DecompilerSettings.javaDefaults();
-                ITypeLoader typeLoader = new ITypeLoader() {
-                    @Override
-                    public boolean tryLoadType(String internalName, Buffer buffer) {
-                        byte[] bytes = getBytes(internalName);
-                        if(bytes != null) {
-                            buffer.reset(bytes.length);
-                            buffer.putByteArray(bytes, 0, bytes.length);
-                            buffer.position(0);
-                            return true;
-                        }
-                        else
-                            return false;
-                    }
-                };
-                settings.setTypeLoader(new CompositeTypeLoader(typeLoader, new ClasspathTypeLoader()));
-                OutputStreamWriter writer = new OutputStreamWriter(System.out);
-                PlainTextOutput output = new PlainTextOutput(writer);
-                Decompiler.decompile(name, output, settings);
-                try {
-                    writer.flush();
-                } catch (IOException e) {
-                }
-            }
+            if(SCLCompilerConfiguration.SHOW_DECOMPILED_BYTECODE && SCLCompilerConfiguration.debugFilter(moduleName))
+                showDecompiledBytecode(internalName);
             return defineClass(name, bytes, 0, bytes.length);
         }
         
@@ -174,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);
                 }
 
@@ -222,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));
+        }
     }
 
     
@@ -241,10 +224,17 @@ public class RuntimeModule {
         @Override
         public void collectRules(Collection<TransformationRule> rules) {
         }
+        @Override
+        public List<Constant> getFieldAccessors(String name) {
+            // TODO Not clear if this is needed.
+            return null;
+        }
     };
     
     public RuntimeModule(Module module, RuntimeModuleMap parentModuleMap,
             ClassLoader parentClassLoader) {
+        if(parentClassLoader == null)
+            throw new NullPointerException();
         this.module = module;
         this.parentModuleMap = parentModuleMap;
         this.classLoader = new ModuleClassLoader(parentClassLoader);