Vec stack = new Vec(); ///< the object stack
int pc = 0; ///< the program counter
- public static void invokePauseable(JSFunction function) { new JSContext(function, true).invoke(new JSArray()); }
+ /** can be paused */
+ public static void invokePauseable(JSFunction function) {
+ new JSContext(function, true).invoke(new JSArray());
+ }
+
+ /** cannot be paused */
+ public static void invokeTrap(JSTrap.JSTrappable t, Object key, Object value) {
+ JSFunction invoker = new JSFunction("trap invoker", 0, null);
+ invoker.add(-1, ByteCodes.PUT, null);
+ JSContext cx = new JSContext(invoker, false);
+ cx.stack.push(t);
+ cx.stack.push(key);
+ cx.stack.push(value);
+ cx.resume();
+ }
JSContext(JSFunction f, boolean pauseable) {
this.pauseable = pauseable;
void invoke(JSArray args) {
JSFunction tf = f;
f = null;
- stack.push(new JSFunction.CallMarker(this));
+ stack.push(new Interpreter.CallMarker(this));
f = tf;
stack.push(args);
resume();
JSContext old = (JSContext)threadToJSContext.get(t);
threadToJSContext.put(t, this);
try {
- JSFunction.eval(this);
+ Interpreter.eval(this);
} finally {
if (old == null) threadToJSContext.remove(t);
else threadToJSContext.put(t, old);