2003/09/21 10:26:53
[org.ibex.core.git] / src / org / xwt / js / Parser.java
index cf0fdec..323d1dc 100644 (file)
@@ -268,6 +268,7 @@ class Parser extends Lexer implements ByteCodes {
             }
             consume(RP);
 
+            b2.numFormalArgs = numArgs + 1;
             b2.add(parserLine, POP);                                      // pop off the arguments array
             b2.add(parserLine, POP);                                      // pop off TOPSCOPE
             
@@ -309,14 +310,19 @@ class Parser extends Lexer implements ByteCodes {
             tok = -1;
         switch(tok) {
         case ASSIGN_BITOR: case ASSIGN_BITXOR: case ASSIGN_BITAND: case ASSIGN_LSH: case ASSIGN_RSH: case ASSIGN_URSH:
-        case ASSIGN_ADD: case ASSIGN_SUB: case ASSIGN_MUL: case ASSIGN_DIV: case ASSIGN_MOD: {
+        case ASSIGN_MUL: case ASSIGN_DIV: case ASSIGN_MOD: case ASSIGN_ADD: case ASSIGN_SUB: {
             b.add(parserLine, GET_PRESERVE);
             startExpr(b,  precedence[tok]);
+            int size = b.size();
+            if (tok == ASSIGN_ADD || tok == ASSIGN_SUB) {
+                b.add(parserLine, tok);
+            }
             // tok-1 is always s/^ASSIGN_// (0 is BITOR, 1 is ASSIGN_BITOR, etc) 
             b.add(parserLine, tok - 1, tok-1==ADD ? new Integer(2) : null);
             b.add(parserLine, PUT);
             b.add(parserLine, SWAP);
             b.add(parserLine, POP);
+            if (tok == ASSIGN_ADD || tok == ASSIGN_SUB) b.set(size, tok, new Integer(b.size() - size));
             break;
         }
         case INC: case DEC: { // postfix
@@ -408,7 +414,12 @@ class Parser extends Lexer implements ByteCodes {
             break;
         }
         case DOT: {
-            consume(NAME);
+            // support foo..bar syntax for foo[""].bar
+            if (peekToken() == DOT) {
+                string = "";
+            } else {
+                consume(NAME);
+            }
             b.add(parserLine, LITERAL, string);
             continueExprAfterAssignable(b,minPrecedence);
             break;