package org.simantics.scl.compiler.runtime;
+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 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);
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);
}
{
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);