/** Encapsulates a single JS interpreter (ie call stack) */
class Interpreter implements ByteCodes, Tokens {
-
+ private static final int MAX_STACK_SIZE = 512;
// Thread-Interpreter Mapping /////////////////////////////////////////////////////////////////////////
while (t != null && t.f.numFormalArgs == 0) t = t.next;
if (t == null) { target = ts.t.trapee; key = ts.t.name; }
- } else if (target instanceof Trap.TrapScope && key.equals(((Trap.TrapScope)target).t.name)) {
- throw je("tried to put to " + key + " inside a trap it owns; use cascade instead");
-
} else if (target instanceof JS) {
if (target instanceof JSScope) {
JSScope p = (JSScope)target; // search the scope-path for the trap
}
if (t != null) {
stack.push(new CallMarker(this));
+ if(stack.size() > MAX_STACK_SIZE) throw new JSExn("stack overflow");
JSArray args = new JSArray();
args.addElement(val);
stack.push(args);
}
if (t != null) {
stack.push(new CallMarker(this));
+ if(stack.size() > MAX_STACK_SIZE) throw new JSExn("stack overflow");
JSArray args = new JSArray();
stack.push(args);
f = t.f;
JSArray arguments = new JSArray();
for(int i=0; i<numArgs; i++) arguments.addElement(i==0?a0:i==1?a1:i==2?a2:rest[i-3]);
stack.push(new CallMarker(this));
+ if(stack.size() > MAX_STACK_SIZE) throw new JSExn("stack overflow");
stack.push(arguments);
f = (JSFunction)object;
scope = new JSScope(f.parentScope);
Object key = stack.pop();
Object obj = stack.peek();
// A trap addition/removal
- JS js = obj instanceof JSScope ? ((JSScope)obj).top() : (JS) obj;
+ JS js = (JS) obj;
+ if(js instanceof JSScope) {
+ JSScope s = (JSScope) js;
+ while(s.getParentScope() != null) {
+ if(s.has(key)) throw new JSExn("cannot trap a variable that isn't at the top level scope");
+ s = s.getParentScope();
+ }
+ js = s;
+ }
+ // might want this?
+ // if(!js.has(key)) throw new JSExn("tried to add/remove a trap from an uninitialized variable");
if(op == ADD_TRAP) js.addTrap(key, (JSFunction)val);
else js.delTrap(key, (JSFunction)val);
break;