case LITERAL: t.push(arg[i]); break;
case OBJECT: t.push(new JS.Obj()); break;
case ARRAY: t.push(new JS.Array(JS.toNumber(arg[i]).intValue())); break;
- case DECLARE: {
- String st = (String)t.pop();
- if (st.equals("sel")) {
- System.out.println("**** SEL!");
- for(int j=0; j<4; j++) System.out.println(op[i+j] + " " + arg[i+j]);
- }
- s.declare(st); break;
- }
+ case DECLARE: s.declare((String)t.pop()); break;
case THIS: t.push(s); break; // FIXME: transparents
case JT: if (JS.toBoolean(t.pop())) i += JS.toNumber(arg[i]).intValue() - 1; break;
case JF: if (!JS.toBoolean(t.pop())) i += JS.toNumber(arg[i]).intValue() - 1; break;
case PUT: {
Object val = t.pop();
Object key = t.pop();
- ((JS)t.peek()).put(key, val);
+ JS target = (JS)t.peek();
+ if (target == null) throw new JS.Exn("tried to put a value to the " + key + " property on the null value");
+ target.put(key, val);
t.push(val);
break;
}