X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fjs%2FTrap.java;h=580ed692fc111f4c3bb3ab88d447fa6e33406766;hp=77476f6f688b9d0711c54b550b5d508014e26084;hb=3f8aa5300e178e8975b0edc896a5a9d303e7bdf3;hpb=b1a58aeb4adfade0697650583ec5801fa6e88d5e diff --git a/src/org/ibex/js/Trap.java b/src/org/ibex/js/Trap.java index 77476f6..580ed69 100644 --- a/src/org/ibex/js/Trap.java +++ b/src/org/ibex/js/Trap.java @@ -7,55 +7,22 @@ package org.ibex.js; * linked list stack, with the most recently placed trap at the head * of the list. */ -class Trap { +final class Trap { - JS trapee = null; ///< the box on which this trap was placed - Object name = null; ///< the property that the trap was placed on + final JS target; ///< the box on which this trap was placed + final JS key; ///< the property that the trap was placed on - JSFunction f = null; ///< the function for this trap - Trap next = null; ///< the next trap down the trap stack + final JSFunction f; ///< the function for this trap + Trap next; ///< the next trap down the trap stack - Trap(JS b, String n, JSFunction f, Trap nx) { - trapee = b; name = n; this.f = f; this.next = nx; - } - - static final JSFunction putInvoker = new JSFunction("putInvoker", 0, null); - static final JSFunction getInvoker = new JSFunction("getInvoker", 0, null); - - static { - putInvoker.add(1, ByteCodes.PUT, null); - putInvoker.add(2, Tokens.RETURN, null); - getInvoker.add(1, ByteCodes.GET, null); - getInvoker.add(2, Tokens.RETURN, null); + Trap(JS b, JS n, JSFunction f, Trap nx) { + target = b; key = n; this.f = f; this.next = nx; } - void invoke(Object value) throws JSExn { - Interpreter i = new Interpreter(putInvoker, false, null); - i.stack.push(trapee); - i.stack.push(name); - i.stack.push(value); - i.resume(); - } - - Object invoke() throws JSExn { - Interpreter i = new Interpreter(getInvoker, false, null); - i.stack.push(trapee); - i.stack.push(name); - return i.resume(); - } - - // FIXME: review; is necessary? - static class TrapScope extends JSScope { - Trap t; - Object val = null; - boolean cascadeHappened = false; - public TrapScope(JSScope parent, Trap t, Object val) { super(parent); this.t = t; this.val = val; } - public Object get(Object key) throws JSExn { - if (key.equals("trapee")) return t.trapee; - if (key.equals("callee")) return t.f; - if (key.equals("trapname")) return t.name; - return super.get(key); - } - } + boolean isReadTrap() { return f.numFormalArgs == 0; } + boolean isWriteTrap() { return f.numFormalArgs != 0; } + Trap readTrap() { Trap t = this; while(t!=null && t.isWriteTrap()) t = t.next; return t; } + Trap writeTrap() { Trap t = this; while(t!=null && t.isReadTrap()) t = t.next; return t; } + Trap nextReadTrap() { return next == null ? null : next.readTrap(); } + Trap nextWriteTrap() { return next == null ? null : next.writeTrap(); } } -