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;
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;
*/
}
+ @Override
public byte[] getBytes(String name) {
// Non-SCL classes are not handled here
if(!name.startsWith(SCL_PACKAGE_PREFIX))
return parentModule.classLoader.getBytes(name);
}
}
-
+
synchronized Class<?> getLocalClass(String name) throws ClassNotFoundException {
// Is class already loaded
Class<?> clazz = findLoadedClass(name);
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)
+ showDecompiledBytecode(internalName);
return defineClass(name, bytes, 0, bytes.length);
}
{
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);
}
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));
+ }
}
@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);