X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fjs%2FParser.java;h=bcc50335171e9b670053b51229cbad55149d6e04;hb=14dcf4ac275ea25af9e7bb517e61a82d2b935d0d;hp=38d15ea73b0ca00341d6a7979b3b1fe1a96f4334;hpb=9886bf61ea5fbbc8eec3969ca21d72a4dce69afe;p=org.ibex.core.git diff --git a/src/org/ibex/js/Parser.java b/src/org/ibex/js/Parser.java index 38d15ea..bcc5033 100644 --- a/src/org/ibex/js/Parser.java +++ b/src/org/ibex/js/Parser.java @@ -169,18 +169,18 @@ class Parser extends Lexer implements ByteCodes { case -1: throw pe("expected expression"); // all of these simply push values onto the stack - case NUMBER: b.add(parserLine, LITERAL, number); break; - case STRING: b.add(parserLine, LITERAL, string); break; + case NUMBER: b.add(parserLine, LITERAL, JS.N(number)); break; + case STRING: b.add(parserLine, LITERAL, JSString.intern(string)); break; case NULL: b.add(parserLine, LITERAL, null); break; - case TRUE: case FALSE: b.add(parserLine, LITERAL, JS.B(tok == TRUE)); break; + case TRUE: case FALSE: b.add(parserLine, LITERAL, tok == TRUE ? JS.T : JS.F); break; // (.foo) syntax case DOT: { consume(NAME); b.add(parserLine, TOPSCOPE); - b.add(parserLine, LITERAL, ""); + b.add(parserLine, LITERAL, JSString.intern("")); b.add(parserLine, GET); - b.add(parserLine, LITERAL, string); + b.add(parserLine, LITERAL, JSString.intern(string)); b.add(parserLine, GET); continueExpr(b, minPrecedence); break; @@ -253,7 +253,7 @@ class Parser extends Lexer implements ByteCodes { if (peekToken() != NAME && peekToken() != STRING) throw pe("expected NAME or STRING"); getToken(); - b.add(parserLine, LITERAL, string); // grab the key + b.add(parserLine, LITERAL, JSString.intern(string)); // grab the key consume(COLON); startExpr(b, NO_COMMA); // grab the value b.add(parserLine, PUT); // put the value into the object @@ -267,7 +267,7 @@ class Parser extends Lexer implements ByteCodes { } case NAME: { b.add(parserLine, TOPSCOPE); - b.add(parserLine, LITERAL, string); + b.add(parserLine, LITERAL, JSString.intern(string)); continueExprAfterAssignable(b,minPrecedence); break; } @@ -280,7 +280,7 @@ class Parser extends Lexer implements ByteCodes { // function prelude; arguments array is already on the stack b2.add(parserLine, TOPSCOPE); b2.add(parserLine, SWAP); - b2.add(parserLine, DECLARE, "arguments"); // declare arguments (equivalent to 'var arguments;') + b2.add(parserLine, DECLARE, JSString.intern("arguments")); // declare arguments (equivalent to 'var arguments;') b2.add(parserLine, SWAP); // set this.arguments and leave the value on the stack b2.add(parserLine, PUT); @@ -288,7 +288,7 @@ class Parser extends Lexer implements ByteCodes { numArgs++; if (peekToken() == NAME) { consume(NAME); // a named argument - String varName = string; + JS varName = JSString.intern(string); b2.add(parserLine, DUP); // dup the args array b2.add(parserLine, GET, JS.N(numArgs - 1)); // retrieve it from the arguments array @@ -431,8 +431,8 @@ class Parser extends Lexer implements ByteCodes { // Method calls are implemented by doing a GET_PRESERVE // first. If the object supports method calls, it will // return JS.METHOD - int n = parseArgs(b, 2); b.add(parserLine, GET_PRESERVE); + int n = parseArgs(b,0); b.add(parserLine, CALLMETHOD, JS.N(n)); break; } @@ -475,7 +475,7 @@ class Parser extends Lexer implements ByteCodes { switch (tok) { case LP: { // invocation (not grouping) - int n = parseArgs(b, 1); + int n = parseArgs(b,0); b.add(parserLine, CALL, JS.N(n)); break; } @@ -515,7 +515,7 @@ class Parser extends Lexer implements ByteCodes { } else { consume(NAME); } - b.add(parserLine, LITERAL, string); + b.add(parserLine, LITERAL, JSString.intern(string)); continueExprAfterAssignable(b,minPrecedence); break; } @@ -560,7 +560,7 @@ class Parser extends Lexer implements ByteCodes { i++; if (peekToken() != COMMA) { startExpr(b, NO_COMMA); - b.add(parserLine, SWAP, JS.N(pushdown)); + if(pushdown != 0) b.add(parserLine, SWAP, JS.N(pushdown)); if (peekToken() == RP) break; } consume(COMMA); @@ -616,7 +616,7 @@ class Parser extends Lexer implements ByteCodes { b.add(parserLine, TOPSCOPE); // push the current scope while(true) { consume(NAME); - b.add(parserLine, DECLARE, string); // declare it + b.add(parserLine, DECLARE, JSString.intern(string)); // declare it if (peekToken() == ASSIGN) { // if there is an '=' after the variable name consume(ASSIGN); startExpr(b, NO_COMMA); @@ -749,7 +749,7 @@ class Parser extends Lexer implements ByteCodes { // extended Ibex catch block: catch(e faultCode "foo.bar.baz") consume(NAME); b.add(parserLine, DUP); - b.add(parserLine, LITERAL, string); + b.add(parserLine, LITERAL, JSString.intern(string)); b.add(parserLine, GET); b.add(parserLine, DUP); b.add(parserLine, LITERAL, null); @@ -785,7 +785,7 @@ class Parser extends Lexer implements ByteCodes { b.add(parserLine, NEWSCOPE); b.add(parserLine, TOPSCOPE); b.add(parserLine, SWAP); - b.add(parserLine, LITERAL,exceptionVar); + b.add(parserLine, LITERAL,JSString.intern(exceptionVar)); b.add(parserLine, DECLARE); b.add(parserLine, SWAP); b.add(parserLine, PUT); @@ -850,7 +850,7 @@ class Parser extends Lexer implements ByteCodes { b.add(parserLine, PUSHKEYS); b.add(parserLine, DUP); - b.add(parserLine, LITERAL, "length"); + b.add(parserLine, LITERAL, JSString.intern("length")); b.add(parserLine, GET); // Stack is now: n, keys, obj, ... @@ -881,7 +881,7 @@ class Parser extends Lexer implements ByteCodes { b.add(parserLine, NEWSCOPE); if(hadVar) { - b.add(parserLine, DECLARE, varName); + b.add(parserLine, DECLARE, JSString.intern(varName)); b.add(parserLine, POP); } @@ -889,7 +889,7 @@ class Parser extends Lexer implements ByteCodes { b.add(parserLine, GET_PRESERVE); // key, index, keys, obj, LoopMarker, ... b.add(parserLine, TOPSCOPE); // scope, key, index, keys, obj, LoopMarker, ... b.add(parserLine, SWAP); // key, scope, index, keys, obj, LoopMarker, ... - b.add(parserLine, LITERAL, varName); // varName, key, scope, index, keys, obj, LoopMaker, ... + b.add(parserLine, LITERAL, JSString.intern(varName)); // varName, key, scope, index, keys, obj, LoopMaker, ... b.add(parserLine, SWAP); // key, varName, scope, index, keys, obj, LoopMarker, ... b.add(parserLine, PUT); // key, scope, index, keys, obj, LoopMarker, ... b.add(parserLine, POP); // scope, index, keys, obj, LoopMarker @@ -920,7 +920,7 @@ class Parser extends Lexer implements ByteCodes { if (peekToken() != SEMI) startExpr(e2, -1); else - e2.add(parserLine, JSFunction.LITERAL, Boolean.TRUE); // handle the for(foo;;foo) case + e2.add(parserLine, JSFunction.LITERAL, JS.T); // handle the for(foo;;foo) case consume(SEMI); if (label != null) b.add(parserLine, LABEL, label); b.add(parserLine, LOOP);