Revision: 1716 http://svn.sourceforge.net/vexi/?rev=1716&view=rev Author: mkpg2 Date: 2007-03-08 08:54:53 -0800 (Thu, 08 Mar 2007)
Log Message: ----------- Feature. Added keysof operator Modified Paths: -------------- core/trunk/org.ibex.js/src/org/ibex/js/JS.jpp core/trunk/org.ibex.js/src/org/ibex/js/Lexer.jpp core/trunk/org.ibex.js/src/org/ibex/js/Parser.java core/trunk/org.ibex.js/src/org/ibex/js/Tokens.java Added Paths: ----------- core/trunk/org.ibex.js/src_junit/test/js/general/keysof.js Modified: core/trunk/org.ibex.js/src/org/ibex/js/JS.jpp =================================================================== --- core/trunk/org.ibex.js/src/org/ibex/js/JS.jpp 2007-03-08 14:17:16 UTC (rev 1715) +++ core/trunk/org.ibex.js/src/org/ibex/js/JS.jpp 2007-03-08 16:54:53 UTC (rev 1716) @@ -193,14 +193,24 @@ throw new JSExn(method==null ? "cannot call a " + getClass().getName() : "method not found: " + JSU.str(method)); } public Enumeration keys() throws JSExn { - final Object[] keys = super.dumpkeys(); - return new Enumeration(null) { + return new Enumeration(null) { private int cur = 0; - public boolean _hasNext() { return cur < keys.length; } + private Object[] keydump; + public JS _remove(JS key) throws JSExn{ + JS r = Obj.this.get(key); + Obj.super.remove(key); + return r; + } + private Object[] _keys(){if(keydump==null){keydump = JS.Obj.this.dumpkeys();}return keydump;} + public boolean _hasNext() { return cur < _keys().length; } public JS _next() throws JSExn { - if (cur >= keys.length) throw new NoSuchElementException(); + Object[] keys = _keys(); + if (cur >= keys.length) throw new NoSuchElementException(); return (JS)keys[cur++]; } + public JS _size() throws JSExn { + return JSU.N(JS.Obj.this.size()); + } }; } @@ -318,7 +328,9 @@ protected abstract boolean _hasNext(); protected abstract JS _next() throws JSExn; - + protected JS _remove(JS key) throws JSExn {return null;} + protected JS _size() throws JSExn{return null;} + public final boolean hasNext() { return _hasNext() || (parent != null ? parent.hasNext() : false); } public final JS next() throws JSExn { if (_hasNext()) return _next(); @@ -330,10 +342,20 @@ //#switch(JSU.str(key)) case "hasNext": return JSU.B(hasNext()); case "next": return next(); + case "remove": return METHOD; + case "size": return METHOD; //#end return super.get(key); } - + + public JS call(JS method, JS[] args) throws JSExn { + //#switch(JSU.str(method)) + case "remove": return _remove(args[0]); + case "size": return _size(); + //#end + return super.call(method, args); + } + public static final class Empty extends Enumeration { public Empty(Enumeration parent) { super(parent); } protected boolean _hasNext() { return false; } Modified: core/trunk/org.ibex.js/src/org/ibex/js/Lexer.jpp =================================================================== --- core/trunk/org.ibex.js/src/org/ibex/js/Lexer.jpp 2007-03-08 14:17:16 UTC (rev 1715) +++ core/trunk/org.ibex.js/src/org/ibex/js/Lexer.jpp 2007-03-08 16:54:53 UTC (rev 1716) @@ -140,6 +140,7 @@ case "instanceof": return RESERVED; case "synchronized": return RESERVED; case "cascade": return CASCADE; + case "keysof": return KEYSOF; //#end return -1; } Modified: core/trunk/org.ibex.js/src/org/ibex/js/Parser.java =================================================================== --- core/trunk/org.ibex.js/src/org/ibex/js/Parser.java 2007-03-08 14:17:16 UTC (rev 1715) +++ core/trunk/org.ibex.js/src/org/ibex/js/Parser.java 2007-03-08 16:54:53 UTC (rev 1716) @@ -144,7 +144,7 @@ precedence[LSH] = precedence[RSH] = precedence[URSH] = 12; precedence[ADD] = precedence[SUB] = 12; precedence[MUL] = precedence[DIV] = precedence[MOD] = 13; - precedence[BITNOT] = precedence[BANG] = precedence[TYPEOF] = 14; + precedence[BITNOT] = precedence[BANG] = precedence[TYPEOF] = precedence[KEYSOF] = 14; precedence[DOT] = precedence[LB] = precedence[LP] = precedence[INC] = precedence[DEC] = 15; } @@ -268,7 +268,7 @@ private void consume(int code) throws IOException { if (getToken() != code) { if(code == NAME) switch(op) { - case RETURN: case TYPEOF: case BREAK: case CONTINUE: case TRY: case THROW: + case RETURN: case TYPEOF: case KEYSOF: case BREAK: case CONTINUE: case TRY: case THROW: case ASSERT: case NULL: case TRUE: case FALSE: case IN: case IF: case ELSE: case SWITCH: case CASE: case DEFAULT: case WHILE: case VAR: case WITH: case CATCH: case FINALLY: @@ -372,11 +372,18 @@ } break; } - case BANG: case BITNOT: case TYPEOF: { + case BANG: case BITNOT: case TYPEOF:{ startExpr(b, precedence[tok]); b.add(parserLine, tok); break; } + case KEYSOF:{ + startExpr(b, precedence[tok]); + b.add(parserLine, PUSHKEYS); + b.add(parserLine, SWAP); + b.add(parserLine, POP); + break; + } case LC: { // object constructor b.add(parserLine, OBJECT, null); // put an object on the stack if (peekToken() != RC) Modified: core/trunk/org.ibex.js/src/org/ibex/js/Tokens.java =================================================================== --- core/trunk/org.ibex.js/src/org/ibex/js/Tokens.java 2007-03-08 14:17:16 UTC (rev 1715) +++ core/trunk/org.ibex.js/src/org/ibex/js/Tokens.java 2007-03-08 16:54:53 UTC (rev 1716) @@ -100,8 +100,10 @@ public static final int ADD_TRAP = 79; // the add-trap operator (++=) public static final int DEL_TRAP = 80; // the del-trap operator (--=) public static final int CASCADE = 81; // cascade expression - arg==true for write cascade - - public static final int MAX_TOKEN = CASCADE; + public static final int KEYSOF = 82; // cascade expression - arg==true for write cascade + + + public static final int MAX_TOKEN = KEYSOF; public final static String[] codeToString = new String[] { "BITOR", "ASSIGN_BITOR", "BITXOR", "ASSIGN_BITXOR", "BITAND", @@ -116,7 +118,7 @@ "HOOK", "COLON", "INC", "DEC", "DOT", "FUNCTION", "IF", "ELSE", "SWITCH", "CASE", "DEFAULT", "WHILE", "DO", "FOR", "VAR", "WITH", "CATCH", "FINALLY", "RESERVED", "GRAMMAR", - "ADD_TRAP", "DEL_TRAP", "CASCADE" + "ADD_TRAP", "DEL_TRAP", "CASCADE", "KEYSOF" }; } Added: core/trunk/org.ibex.js/src_junit/test/js/general/keysof.js =================================================================== --- core/trunk/org.ibex.js/src_junit/test/js/general/keysof.js (rev 0) +++ core/trunk/org.ibex.js/src_junit/test/js/general/keysof.js 2007-03-08 16:54:53 UTC (rev 1716) @@ -0,0 +1,7 @@ +////// +var x = {a:"1",b:"2",c:"3"}; +var keys = keysof(x); +assert(keys.size()==3); +keys.remove("a"); +assert(keys.size()==2); +assert(x.a==null); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Vexi-svn mailing list Vexi-svn@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/vexi-svn