/**
*
*/
package org.rascalmpl.library.experiments.Compiler.RVM.Interpreter;
import java.lang.reflect.Constructor;
import java.util.Map;
import org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.observers.IFrameObserver;
import org.rascalmpl.value.IValue;
public class RVMJVM extends RVMCore {
final RVMExecutable rvmExec;
final byte[] generatedByteCode;
final String generatedClassName;
RVMonJVM generatedClassInstance;
/**
* @param rvmExec
* @param rex
*/
public RVMJVM(RVMExecutable rvmExec, RascalExecutionContext rex) {
super(rvmExec, rex);
generatedByteCode = rvmExec.getJvmByteCode();
generatedClassName = rvmExec.getFullyQualifiedDottedName();
this.rvmExec = rvmExec;
createGeneratedClassInstance();
}
private void createGeneratedClassInstance() {
// Oneshot classloader
try {
Class<?> generatedClass = new ClassLoader(RVMJVM.class.getClassLoader()) {
public Class<?> defineClass(String name, byte[] bytes) {
return super.defineClass(name, bytes, 0, bytes.length);
}
public Class<?> loadClass(String name) {
try {
return super.loadClass(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}.defineClass(generatedClassName, generatedByteCode);
Constructor<?>[] cons = generatedClass.getConstructors();
generatedClassInstance = (RVMonJVM) cons[0].newInstance(rvmExec, rex);
// make sure that the moduleVariables in this RVM and in the generated class are the same.
this.moduleVariables = generatedClassInstance.moduleVariables;
generatedClassInstance.frameObserver = this.frameObserver = rex.getFrameObserver();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void setFrameObserver(IFrameObserver observer){
generatedClassInstance.frameObserver = this.frameObserver = observer;
this.rex.setFrameObserver(observer);
}
/************************************************************************************/
/* Implementation of abstract methods in RVMCore for RVMJVM */
/* (simply reroute to RVMonJVM) */
/************************************************************************************/
@Override
public Object executeRVMFunction(Function func, IValue[] posArgs, Map<String, IValue> kwArgs) {
return generatedClassInstance.executeRVMFunction(func, posArgs, kwArgs);
}
@Override
public IValue executeRVMFunction(FunctionInstance func, IValue[] posArgs, Map<String, IValue> kwArgs) {
return generatedClassInstance.executeRVMFunction(func, posArgs, kwArgs);
}
@Override
public IValue executeRVMFunction(OverloadedFunctionInstance func, IValue[] posArgs, Map<String, IValue> kwArgs) {
return generatedClassInstance.executeRVMFunction(func, posArgs, kwArgs);
}
@Override
public IValue executeRVMFunctionInVisit(Frame root) {
return generatedClassInstance.executeRVMFunctionInVisit(root);
}
@Override
public IValue executeRVMProgram(String moduleName, String uid_main, IValue[] posArgs, Map<String, IValue> kwArgs) {
return generatedClassInstance.executeRVMProgram(moduleName, uid_main, posArgs, kwArgs);
}
}