package janala.interpreters;
import java.util.ArrayList;
/** Stack frame that stores Value objects */
public class Frame {
private ArrayList<Value> locals = new ArrayList<Value>(8);
private ArrayList<Value> stack = new ArrayList<Value>(8);
public int getStackSize() {
return stack.size();
}
public final int nReturnWords;
private Value ret;
public void setRet(Value v) { ret = v; }
public Value getRet() { return ret; }
public Frame(int nReturnWords) {
this.nReturnWords = nReturnWords;
ret = PlaceHolder.instance;
}
public void addLocal(Value o) {
locals.add(o);
}
public void addLocal2(Value o) {
locals.add(o);
locals.add(PlaceHolder.instance);
}
public void setLocal(int index, Value o) {
int diff = index - locals.size();
while (diff >= 0) {
locals.add(PlaceHolder.instance);
diff--;
}
locals.set(index, o);
}
public Value getLocal(int index) {
if (index < locals.size()) {
return locals.get(index);
}
return PlaceHolder.instance;
}
public void setLocal2(int index, Value o) {
int diff = index - locals.size();
while (diff >= -1) {
locals.add(PlaceHolder.instance);
diff--;
}
locals.set(index, o);
}
public Value getLocal2(int index) {
if (index < locals.size()) {
return locals.get(index);
}
return PlaceHolder.instance;
}
public void push(Value o) {
stack.add(o);
}
public void push2(Value o) {
stack.add(o);
stack.add(PlaceHolder.instance);
}
public Value pop() {
return stack.remove(stack.size() - 1);
}
public Value pop2() {
stack.remove(stack.size() - 1);
return stack.remove(stack.size() - 1);
}
public Value peek() {
return stack.get(stack.size() - 1);
}
public Value peek2() {
return stack.get(stack.size() - 2);
}
public Value peek3() {
return stack.get(stack.size() - 3);
}
public Value peek4() {
return stack.get(stack.size() - 4);
}
public void clear() {
stack.clear();
}
@Override
public String toString() {
return "Stack: " + stack.toString();
}
}