package jvm.engine;
import jvm.ClassFileLoader;
import jvm.exception.ReadClassException;
import java.util.ArrayList;
import java.util.List;
public class MiniJVM {
private boolean enablePrint = true;
private static final List<String> defaultClassPaths = new ArrayList<>();
public MiniJVM() {
defaultClassPaths.add("target/classes");
}
public void run(String[] classPaths, String className) throws ReadClassException {
ClassFileLoader loader = new ClassFileLoader();
for (String classPath : defaultClassPaths) {
loader.addClassPath(classPath);
}
for (String classPath : classPaths) {
loader.addClassPath(classPath);
}
MethodArea methodArea = MethodArea.getInstance();
methodArea.setClassFileLoader(loader);
ExecutorEngine engine = new ExecutorEngine();
className = className.replace(".", "/");
initConsolePrinting();
engine.execute(methodArea.getMainMethod(className));
while (enablePrint && ConsolePrinter.printingBuf == null) {
enablePrint = false;
}
}
private void initConsolePrinting() {
new Thread(() -> {
while (enablePrint) {
if (ConsolePrinter.printingBuf != null) {
System.out.println(ConsolePrinter.printingBuf);
ConsolePrinter.printingBuf = null;
}
}
}).start();
}
}