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

Reply via email to