package main.coding_170430.jvm.engine; import main.coding_170430.jvm.cmd.ByteCodeCommand; import main.coding_170430.jvm.method.Method; import java.util.ArrayList; import java.util.List; import java.util.Stack; /** * Created by peterchen on 2017/5/5. */ public class StackFrame { private List<JavaObject> localVariableTable = new ArrayList<>(); private Stack<JavaObject> operatorStack = new Stack<>(); int index = 0; private Method m = null; private StackFrame callerFrame = null; public StackFrame getCallerFrame(){ return callerFrame; } public void setCallerFrame(StackFrame callerFrame){ this.callerFrame = callerFrame; } public static StackFrame create(Method m){ StackFrame frame = new StackFrame(m); return frame; } private StackFrame(Method m){ this.m = m; } public JavaObject getLocalVariableValue(int index){ return this.localVariableTable.get(index); } public Stack<JavaObject> getOperatorStack(){ return this.operatorStack; } public int getNextCommandIndex(int offset){ ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); for (int i=0;i<cmds.length;i++){ if(cmds[i].getOffset()==offset){ return i; } } throw new RuntimeException("can't find next command"); } public ExecutionResult execute(){ return null; } public void setLocalVariableTable(List<JavaObject> values){ this.localVariableTable = values; } public void setLocalVariableValue(int index,JavaObject jo){ if(localVariableTable.size()-1<index){ for(int i=this.localVariableTable.size();i<=index;i++){ this.localVariableTable.add(null); } this.localVariableTable.set(index,jo); } } public Method getMethod(){ return m; } }