X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fruntime%2FRuntimeModule.java;h=5ae73c41240700f44662e1b70f6851487752b290;hp=c5904b3c44fdb8f35427aa548e4c7165e877c932;hb=fad36d463b75c3a9944d875fc627c3533f6da74d;hpb=969bd23cab98a79ca9101af33334000879fb60c5 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModule.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModule.java index c5904b3c4..5ae73c412 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModule.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/runtime/RuntimeModule.java @@ -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 rules) { } + @Override + public List 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);