package org.xukai.jvm.engine; import org.xukai.jvm.method.Method; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class ExecutorEngine { private Stack<StackFrame> stack = new Stack<StackFrame>(); public ExecutorEngine() { } public void execute(Method mainMethod){ StackFrame MainFrame = StackFrame.create(mainMethod); stack.push(MainFrame); while(!stack.empty()){ StackFrame currentFrame = stack.peek(); ExecutionResult result = currentFrame.execute(); if (result.isPauseAndRunNewFrame()) { StackFrame nextFrame = currentFrame.create(result.getNextMethod()); nextFrame.setCallerFrame(currentFrame); setupFunctionCallParams(currentFrame, nextFrame); stack.push(nextFrame); } else { stack.pop(); } } } private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { List<String> parameterList = nextFrame.getMethod().getParameterList(); if (parameterList.size() > 0) { } ArrayList<JavaObject> localVariabs = new ArrayList<>(); for (int i = 0; i < parameterList.size() + 1; i++) { JavaObject javaObject = currentFrame.getOprandStack().pop(); localVariabs.add(javaObject); } ArrayList<JavaObject> params = new ArrayList<>(); for (int i = localVariabs.size(); i > 0; i--) { params.add(localVariabs.get(i)); } nextFrame.setLocalVariableTable(params); } }