diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java b/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java index 278aba61624..77f2f3eb38f 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java @@ -732,44 +732,37 @@ public class IRFactory { return new Node(nodeType, childNode); } - public Object createUnary(int nodeType, int nodeOp, Object child) { - Node childNode = (Node) child; + public Object createIncDec(int nodeType, boolean post, Object child) + { + Node childNode = (Node)child; + int childType = childNode.getType(); - if (nodeType == Token.INC || nodeType == Token.DEC) { - int childType = childNode.getType(); - - if (!hasSideEffects(childNode) - && (nodeOp == Token.POST) - && (childType == Token.NAME - || childType == Token.GETPROP - || childType == Token.GETELEM)) - { - // if it's not a LHS type, createAssignment (below) will throw - // an exception. - return new Node(nodeType, childNode); - } - - /* - * Transform INC/DEC ops to +=1, -=1, - * expecting later optimization of all +/-=1 cases to INC, DEC. - */ - // we have to use Double for now, because - // 0.0 and 1.0 are stored as dconst_[01], - // and using a Float creates a stack mismatch. - Node rhs = (Node) createNumber(1.0); - - return createAssignment(nodeType == Token.INC - ? Token.ADD - : Token.SUB, - childNode, - rhs, - true, - nodeOp == Token.POST); + if (post && !hasSideEffects(childNode) + && (childType == Token.NAME + || childType == Token.GETPROP + || childType == Token.GETELEM)) + { + // if it's not a LHS type, createAssignment (below) will throw + // an exception. + return new Node(nodeType, childNode); } - Node result = new Node(nodeType, nodeOp); - result.addChildToBack(childNode); - return result; + /* + * Transform INC/DEC ops to +=1, -=1, + * expecting later optimization of all +/-=1 cases to INC, DEC. + */ + // we have to use Double for now, because + // 0.0 and 1.0 are stored as dconst_[01], + // and using a Float creates a stack mismatch. + Node rhs = (Node) createNumber(1.0); + + return createAssignment(nodeType == Token.INC + ? Token.ADD + : Token.SUB, + childNode, + rhs, + true, + post); } /** diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java b/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java index 2219e8437fc..5efc91229db 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java @@ -1128,7 +1128,7 @@ class Parser { case Token.INC: case Token.DEC: decompiler.addToken(tt); - return nf.createUnary(tt, Token.PRE, memberExpr(ts, true)); + return nf.createIncDec(tt, false, memberExpr(ts, true)); case Token.DELPROP: decompiler.addToken(Token.DELPROP); @@ -1158,7 +1158,7 @@ class Parser { { int pf = ts.getToken(); decompiler.addToken(pf); - return nf.createUnary(pf, Token.POST, pn); + return nf.createIncDec(pf, true, pn); } return pn; } diff --git a/mozilla/js/rhino/src/org/mozilla/javascript/Token.java b/mozilla/js/rhino/src/org/mozilla/javascript/Token.java index 0007f91c46a..1fa0cf06048 100644 --- a/mozilla/js/rhino/src/org/mozilla/javascript/Token.java +++ b/mozilla/js/rhino/src/org/mozilla/javascript/Token.java @@ -188,39 +188,37 @@ public class Token * more general token types, eg. 'DIV' as the op of 'ASSIGN'. */ NOP = 103, // NOP - PRE = 104, // for INC, DEC nodes. - POST = 105, /** * For JSOPs associated with keywords... * eg. op = ADD; token = ASSIGN */ - EMPTY = 106, + EMPTY = 104, /* types used for the parse tree - these never get returned * by the scanner. */ - EQOP = 107, // equality ops (== !=) - RELOP = 108, // relational ops (< <= > >= in instanceof) + EQOP = 105, // equality ops (== !=) + RELOP = 106, // relational ops (< <= > >= in instanceof) - BLOCK = 109, // statement block - ARRAYLIT = 110, // array literal - OBJLIT = 111, // object literal - LABEL = 112, // label - TARGET = 113, - LOOP = 114, - ENUMDONE = 115, - EXPRSTMT = 116, - PARENT = 117, - JSR = 118, - NEWLOCAL = 119, - USELOCAL = 120, - SCRIPT = 121, // top-level node for entire script - TYPEOFNAME = 122, // for typeof(simple-name) + BLOCK = 107, // statement block + ARRAYLIT = 108, // array literal + OBJLIT = 109, // object literal + LABEL = 110, // label + TARGET = 111, + LOOP = 112, + ENUMDONE = 113, + EXPRSTMT = 114, + PARENT = 115, + JSR = 116, + NEWLOCAL = 117, + USELOCAL = 118, + SCRIPT = 119, // top-level node for entire script + TYPEOFNAME = 120, // for typeof(simple-name) - LAST_TOKEN = 122; + LAST_TOKEN = 120; public static String name(int token) { @@ -332,8 +330,6 @@ public class Token case FINALLY: return "finally"; case RESERVED: return "reserved"; case NOP: return "nop"; - case PRE: return "pre"; - case POST: return "post"; case EMPTY: return "empty"; case BLOCK: return "block"; case ARRAYLIT: return "arraylit";