diff --git a/js/rhino/src/org/mozilla/javascript/IRFactory.java b/js/rhino/src/org/mozilla/javascript/IRFactory.java index e4ea31b79b4d..c6780faeba6f 100644 --- a/js/rhino/src/org/mozilla/javascript/IRFactory.java +++ b/js/rhino/src/org/mozilla/javascript/IRFactory.java @@ -494,8 +494,8 @@ public class IRFactory { int catchLineNo = cb.getLineno(); Node name = cb.getFirstChild(); - Node cond = name.getNextSibling(); - Node catchBlock = cond.getNextSibling(); + Node cond = name.getNext(); + Node catchBlock = cond.getNext(); cb.removeChild(name); cb.removeChild(cond); cb.removeChild(catchBlock); @@ -525,7 +525,7 @@ public class IRFactory { pn.addChildToBack(catchStmt); // move to next cb - cb = cb.getNextSibling(); + cb = cb.getNext(); } // Generate code to rethrow if no catch clause was executed @@ -595,7 +595,7 @@ public class IRFactory { // Move cursor to cursor.next before elem.next can be // altered in new Node constructor elem = cursor; - cursor = cursor.getNextSibling(); + cursor = cursor.getNext(); if (elem.getType() == TokenStream.PRIMARY && elem.getOperation() == TokenStream.UNDEFINED) { @@ -654,13 +654,13 @@ public class IRFactory { Node comma = new Node(TokenStream.COMMA, temp); for (Node cursor = ((Node) obj).getFirstChild(); cursor != null;) { Node n = cursor; - cursor = cursor.getNextSibling(); + cursor = cursor.getNext(); int op = (n.getType() == TokenStream.NAME) ? TokenStream.SETPROP : TokenStream.SETELEM; // Move cursor before next.next can be altered in new Node Node next = cursor; - cursor = cursor.getNextSibling(); + cursor = cursor.getNext(); Node addelem = new Node(op, createUseTemp(temp), n, next); comma.addChildToBack(addelem); } @@ -951,7 +951,7 @@ public class IRFactory { if (hasSideEffects(child)) return true; else - child = child.getNextSibling(); + child = child.getNext(); } break; } diff --git a/js/rhino/src/org/mozilla/javascript/Interpreter.java b/js/rhino/src/org/mozilla/javascript/Interpreter.java index 4852361fdd83..231010f2b7e4 100644 --- a/js/rhino/src/org/mozilla/javascript/Interpreter.java +++ b/js/rhino/src/org/mozilla/javascript/Interpreter.java @@ -291,16 +291,16 @@ public class Interpreter { while (child != null) { if (child.getType() != TokenStream.FUNCTION) iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); } break; case TokenStream.CASE : iCodeTop = updateLineNumber(node, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); while (child != null) { iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); } break; @@ -314,13 +314,13 @@ public class Interpreter { iCodeTop = updateLineNumber(node, iCodeTop); while (child != null) { iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); } break; case TokenStream.COMMA : iCodeTop = generateICode(child, iCodeTop); - while (null != (child = child.getNextSibling())) { + while (null != (child = child.getNext())) { iCodeTop = addByte(TokenStream.POP, iCodeTop); itsStackDepth--; iCodeTop = generateICode(child, iCodeTop); @@ -387,7 +387,7 @@ public class Interpreter { case TokenStream.EQOP : case TokenStream.RELOP : { iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); int op = node.getOperation(); if (version == Context.VERSION_1_2) { @@ -424,7 +424,7 @@ public class Interpreter { functionName = lastAddString; } } - child = child.getNextSibling(); + child = child.getNext(); childCount++; } if (node.getProp(Node.SPECIALCALL_PROP) != null) { @@ -527,7 +527,7 @@ public class Interpreter { iCodeTop = addForwardGoto(TokenStream.IFNE, iCodeTop); iCodeTop = addByte(TokenStream.POP, iCodeTop); itsStackDepth--; - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); resolveForwardGoto(falseJumpStart, iCodeTop); break; @@ -543,7 +543,7 @@ public class Interpreter { iCodeTop = addForwardGoto(TokenStream.IFEQ, iCodeTop); iCodeTop = addByte(TokenStream.POP, iCodeTop); itsStackDepth--; - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); resolveForwardGoto(trueJumpStart, iCodeTop); break; @@ -562,7 +562,7 @@ public class Interpreter { badTree(node); } } else { - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); iCodeTop = addByte(TokenStream.GETPROP, iCodeTop); itsStackDepth--; @@ -584,7 +584,7 @@ public class Interpreter { case TokenStream.MUL : case TokenStream.GETELEM : iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); iCodeTop = addByte(type, iCodeTop); itsStackDepth--; @@ -641,7 +641,7 @@ public class Interpreter { case TokenStream.SETPROP : { iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); String s = (String) node.getProp(Node.SPECIAL_PROP_PROP); if (s != null) { @@ -653,7 +653,7 @@ public class Interpreter { badTree(node); } } else { - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); iCodeTop = addByte(TokenStream.SETPROP, iCodeTop); itsStackDepth -= 2; @@ -663,9 +663,9 @@ public class Interpreter { case TokenStream.SETELEM : iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); iCodeTop = addByte(type, iCodeTop); itsStackDepth -= 2; @@ -673,7 +673,7 @@ public class Interpreter { case TokenStream.SETNAME : iCodeTop = generateICode(child, iCodeTop); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); iCodeTop = addByte(TokenStream.SETNAME, iCodeTop); iCodeTop = addString(firstChild.getString(), iCodeTop); @@ -752,7 +752,7 @@ public class Interpreter { case TokenStream.GETELEM : { Node getPropChild = child.getFirstChild(); iCodeTop = generateICode(getPropChild, iCodeTop); - getPropChild = getPropChild.getNextSibling(); + getPropChild = getPropChild.getNext(); iCodeTop = generateICode(getPropChild, iCodeTop); if (childType == TokenStream.GETPROP) { iCodeTop = addByte(type == TokenStream.INC @@ -868,7 +868,7 @@ public class Interpreter { the try statemets, we need to emit the endtry before that goto. */ - Node nextSibling = child.getNextSibling(); + Node nextSibling = child.getNext(); if (!insertedEndTry && nextSibling != null && (nextSibling == catchTarget || nextSibling == finallyTarget)) @@ -879,7 +879,7 @@ public class Interpreter { } iCodeTop = generateICode(child, iCodeTop); lastChild = child; - child = child.getNextSibling(); + child = child.getNext(); } itsStackDepth = 0; if (finallyTarget != null) { @@ -959,7 +959,7 @@ public class Interpreter { iCodeTop = generateICode(node, iCodeTop); } else { String name = child.getString(); - child = child.getNextSibling(); + child = child.getNext(); iCodeTop = generateICode(child, iCodeTop); int index = itsVariableTable.getOrdinal(name); iCodeTop = addByte(TokenStream.SETVAR, iCodeTop); diff --git a/js/rhino/src/org/mozilla/javascript/Node.java b/js/rhino/src/org/mozilla/javascript/Node.java index ce42e649d4c4..914142468586 100644 --- a/js/rhino/src/org/mozilla/javascript/Node.java +++ b/js/rhino/src/org/mozilla/javascript/Node.java @@ -150,7 +150,7 @@ public class Node implements Cloneable { return last; } - public Node getNextSibling() { + public Node getNext() { return next; } @@ -541,7 +541,7 @@ public class Node implements Cloneable { s.append(toString()); s.append('\n'); for (Node cursor = getFirstChild(); cursor != null; - cursor = cursor.getNextSibling()) + cursor = cursor.getNext()) { Node n = cursor; if (cursor.getType() == TokenStream.FUNCTION) { @@ -556,13 +556,10 @@ public class Node implements Cloneable { return ""; } - public Node getFirst() { return first; } - public Node getNext() { return next; } - - protected int type; // type of the node; TokenStream.NAME for example - protected Node next; // next sibling - protected Node first; // first element of a linked list of children - protected Node last; // last element of a linked list of children + int type; // type of the node; TokenStream.NAME for example + Node next; // next sibling + private Node first; // first element of a linked list of children + private Node last; // last element of a linked list of children private int intDatum = -1; // encapsulated int data; depends on type private UintMap props; } diff --git a/js/rhino/src/org/mozilla/javascript/NodeTransformer.java b/js/rhino/src/org/mozilla/javascript/NodeTransformer.java index 58e10099df87..a09b2a4c5487 100644 --- a/js/rhino/src/org/mozilla/javascript/NodeTransformer.java +++ b/js/rhino/src/org/mozilla/javascript/NodeTransformer.java @@ -152,11 +152,11 @@ public class NodeTransformer { */ Node breakTarget = new Node(TokenStream.TARGET); Node parent = iterator.getCurrentParent(); - Node next = node.getNextSibling(); + Node next = node.getNext(); while (next != null && (next.getType() == TokenStream.LABEL || next.getType() == TokenStream.TARGET)) - next = next.getNextSibling(); + next = next.getNext(); if (next == null) break; parent.addChildAfter(breakTarget, next); @@ -228,7 +228,7 @@ public class NodeTransformer { ((FunctionNode) tree).setRequiresActivation(true); } loops.push(node); - Node leave = node.getNextSibling(); + Node leave = node.getNext(); if (leave.getType() != TokenStream.LEAVEWITH) { throw new RuntimeException("Unexpected tree"); } @@ -406,7 +406,7 @@ public class NodeTransformer { // Move cursor to next before createAssignment get chance // to change n.next Node n = cursor; - cursor = cursor.getNextSibling(); + cursor = cursor.getNext(); if (!n.hasChildren()) continue; Node init = n.getFirstChild(); @@ -452,7 +452,7 @@ public class NodeTransformer { case TokenStream.GETPROP: if (inFunction) { - Node n = node.getFirstChild().getNextSibling(); + Node n = node.getFirstChild().getNext(); String name = n == null ? "" : n.getString(); Context cx = Context.getCurrentContext(); if ((cx != null && cx.isActivationNeeded(name)) || @@ -516,7 +516,7 @@ public class NodeTransformer { if (nodeType != TokenStream.VAR) continue; for (Node cursor = node.getFirstChild(); cursor != null; - cursor = cursor.getNextSibling()) + cursor = cursor.getNext()) { String name = cursor.getString(); if (fNames == null || !fNames.has(name)) @@ -553,7 +553,7 @@ public class NodeTransformer { { // Add parameters for (Node cursor = args.getFirstChild(); cursor != null; - cursor = cursor.getNextSibling()) + cursor = cursor.getNext()) { String arg = cursor.getString(); vars.addParameter(arg, createVariableObject(arg, true)); @@ -588,9 +588,9 @@ public class NodeTransformer { Node left = node.getFirstChild(); // count the arguments int argCount = 0; - Node arg = left.getNextSibling(); + Node arg = left.getNext(); while (arg != null) { - arg = arg.getNextSibling(); + arg = arg.getNext(); argCount++; } boolean addGetThis = false; diff --git a/js/rhino/src/org/mozilla/javascript/PreorderNodeIterator.java b/js/rhino/src/org/mozilla/javascript/PreorderNodeIterator.java index f9c0f9b848be..bbf9fb7e783f 100644 --- a/js/rhino/src/org/mozilla/javascript/PreorderNodeIterator.java +++ b/js/rhino/src/org/mozilla/javascript/PreorderNodeIterator.java @@ -62,25 +62,26 @@ public final class PreorderNodeIterator { public Node nextNode() { if (current == null) { current = start; - } - else if (current.first != null) { - stackPush(current); - cachedPrev = null; - current = current.first; - } - else { - for (;;) { - cachedPrev = current; - current = current.next; - if (current != null) { break; } - if (stackTop == 0) { - // Iteration end: clear cachedPrev that currently points - // to the last sibling of start - cachedPrev = null; break; + } else { + Node first = current.getFirstChild(); + if (first != null) { + stackPush(current); + cachedPrev = null; + current = first; + } else { + for (;;) { + cachedPrev = current; + current = current.next; + if (current != null) { break; } + if (stackTop == 0) { + // Iteration end: clear cachedPrev that currently + // points to the last sibling of start + cachedPrev = null; break; + } + --stackTop; + current = stack[stackTop]; + stack[stackTop] = null; } - --stackTop; - current = stack[stackTop]; - stack[stackTop] = null; } } return current; diff --git a/js/rhino/src/org/mozilla/javascript/optimizer/Block.java b/js/rhino/src/org/mozilla/javascript/optimizer/Block.java index 910671f5c826..ca4d99701e6a 100644 --- a/js/rhino/src/org/mozilla/javascript/optimizer/Block.java +++ b/js/rhino/src/org/mozilla/javascript/optimizer/Block.java @@ -199,7 +199,7 @@ public class Block { case TokenStream.SETVAR : { Node lhs = n.getFirstChild(); - Node rhs = lhs.getNextSibling(); + Node rhs = lhs.getNext(); lookForVariablesAndCalls(rhs, liveSet, theVariables); Object theVarProp = n.getProp(Node.VARIABLE_PROP); if (theVarProp != null) { @@ -212,7 +212,7 @@ public class Block { Node child = n.getFirstChild(); while (child != null) { lookForVariablesAndCalls(child, liveSet, theVariables); - child = child.getNextSibling(); + child = child.getNext(); } for (int i = 0; i < liveSet.length; i++) { if (liveSet[i]) @@ -235,7 +235,7 @@ public class Block { Node child = n.getFirstChild(); while (child != null) { lookForVariablesAndCalls(child, liveSet, theVariables); - child = child.getNextSibling(); + child = child.getNext(); } break; } @@ -289,7 +289,7 @@ public class Block { case TokenStream.SETVAR : { Node lhs = n.getFirstChild(); - Node rhs = lhs.getNextSibling(); + Node rhs = lhs.getNext(); lookForVariableAccess(rhs, lastUse); Object theVarProp = n.getProp(Node.VARIABLE_PROP); if (theVarProp != null) { @@ -316,7 +316,7 @@ public class Block { Node child = n.getFirstChild(); while (child != null) { lookForVariableAccess(child, lastUse); - child = child.getNextSibling(); + child = child.getNext(); } break; } @@ -415,7 +415,7 @@ public class Block { // the result, otherwise it could be a string. Node child = n.getFirstChild(); int lType = findExpressionType(child); - int rType = findExpressionType(child.getNextSibling()); + int rType = findExpressionType(child.getNext()); return lType | rType; // we're not distinguishng strings yet } default : { @@ -426,7 +426,7 @@ public class Block { int result = TypeEvent.NoType; while (child != null) { result |= findExpressionType(child); - child = child.getNextSibling(); + child = child.getNext(); } return result; } @@ -442,7 +442,7 @@ public class Block { Node child = n.getFirstChild(); while (child != null) { result |= findDefPoints(child); - child = child.getNextSibling(); + child = child.getNext(); } } break; @@ -460,8 +460,8 @@ public class Block { case TokenStream.SETPROP : { Node baseChild = n.getFirstChild(); - Node nameChild = baseChild.getNextSibling(); - Node rhs = nameChild.getNextSibling(); + Node nameChild = baseChild.getNext(); + Node rhs = nameChild.getNext(); if (baseChild != null) { if (baseChild.getType() == TokenStream.GETVAR) { OptLocalVariable theVar = (OptLocalVariable) @@ -481,7 +481,7 @@ public class Block { OptLocalVariable theVar = (OptLocalVariable) (n.getProp(Node.VARIABLE_PROP)); if (theVar != null) { - Node rValue = firstChild.getNextSibling(); + Node rValue = firstChild.getNext(); int theType = findExpressionType(rValue); result |= theVar.assignType(theType); } @@ -500,7 +500,7 @@ public class Block { Node child = n.getFirstChild(); while (child != null) { localCSE(n, child, theCSETable, theFunction); - child = child.getNextSibling(); + child = child.getNext(); } } break; @@ -508,7 +508,7 @@ public class Block { case TokenStream.INC : { Node child = n.getFirstChild(); if (child.getType() == TokenStream.GETPROP) { - Node nameChild = child.getFirstChild().getNextSibling(); + Node nameChild = child.getFirstChild().getNext(); if (nameChild.getType() == TokenStream.STRING) theCSETable.remove(nameChild.getString()); else @@ -521,8 +521,8 @@ public class Block { break; case TokenStream.SETPROP : { Node baseChild = n.getFirstChild(); - Node nameChild = baseChild.getNextSibling(); - Node rhs = nameChild.getNextSibling(); + Node nameChild = baseChild.getNext(); + Node rhs = nameChild.getNext(); if (baseChild != null) localCSE(n, baseChild, theCSETable, theFunction); if (nameChild != null) localCSE(n, nameChild, theCSETable, theFunction); if (rhs != null) localCSE(n, rhs, theCSETable, theFunction); @@ -544,7 +544,7 @@ public class Block { if (baseChild.getType() == TokenStream.PRIMARY && baseChild.getOperation() == TokenStream.THIS) { - Node nameChild = baseChild.getNextSibling(); + Node nameChild = baseChild.getNext(); if (nameChild.getType() == TokenStream.STRING) { String theName = nameChild.getString(); // System.out.println("considering " + theName); @@ -558,7 +558,7 @@ public class Block { Node theCSE; if (cse instanceof CSEHolder) { CSEHolder cseHolder = (CSEHolder)cse; - Node nextChild = cseHolder.getPropChild.getNextSibling(); + Node nextChild = cseHolder.getPropChild.getNext(); cseHolder.getPropParent.removeChild(cseHolder.getPropChild); theCSE = itsIRFactory.createNewLocal(cseHolder.getPropChild); theFunction.incrementLocalCount(); @@ -570,7 +570,7 @@ public class Block { } else theCSE = (Node)cse; - Node nextChild = n.getNextSibling(); + Node nextChild = n.getNext(); parent.removeChild(n); Node cseUse = itsIRFactory.createUseLocal(theCSE); if (nextChild == null) @@ -585,8 +585,8 @@ public class Block { break; case TokenStream.SETELEM : { Node lhsBase = n.getFirstChild(); - Node lhsIndex = lhsBase.getNextSibling(); - Node rhs = lhsIndex.getNextSibling(); + Node lhsIndex = lhsBase.getNext(); + Node rhs = lhsIndex.getNext(); if (lhsBase != null) localCSE(n, lhsBase, theCSETable, theFunction); if (lhsIndex != null) localCSE(n, lhsIndex, theCSETable, theFunction); if (rhs != null) localCSE(n, rhs, theCSETable, theFunction); @@ -598,7 +598,7 @@ public class Block { Node child = n.getFirstChild(); while (child != null) { localCSE(n, child, theCSETable, theFunction); - child = child.getNextSibling(); + child = child.getNext(); } theCSETable.clear(); //System.out.println("clear all at CALL"); diff --git a/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java b/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java index a43ec854cee2..40ee866e65e0 100644 --- a/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java +++ b/js/rhino/src/org/mozilla/javascript/optimizer/Codegen.java @@ -141,7 +141,7 @@ public class Codegen extends Interpreter { String name = onh.getJavaScriptClassName(null, true); ScriptableObject obj = new NativeObject(); for (Node cursor = tree.getFirstChild(); cursor != null; - cursor = cursor.getNextSibling()) + cursor = cursor.getNext()) { if (cursor.getType() == TokenStream.FUNCTION) { obj.put(cursor.getString(), obj, @@ -550,7 +550,7 @@ public class Codegen extends Interpreter { visitStatement(node); while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } break; @@ -566,7 +566,7 @@ public class Codegen extends Interpreter { visitStatement(node); while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } break; @@ -619,12 +619,12 @@ public class Codegen extends Interpreter { break; case TokenStream.COMMA: { - Node next = child.getNextSibling(); + Node next = child.getNext(); while (next != null) { generateCodeFromNode(child, node, -1, -1); addByteCode(ByteCode.POP); child = next; - next = next.getNextSibling(); + next = next.getNext(); } generateCodeFromNode(child, node, trueLabel, falseLabel); break; @@ -665,7 +665,7 @@ public class Codegen extends Interpreter { else { while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) addByteCode(ByteCode.POP2); @@ -678,7 +678,7 @@ public class Codegen extends Interpreter { visitStatement(node); while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } astore(scriptResultLocal); break; @@ -722,7 +722,7 @@ public class Codegen extends Interpreter { else addByteCode(ByteCode.IFNE, falseTarget); addByteCode(ByteCode.POP); - generateCodeFromNode(child.getNextSibling(), node, trueLabel, falseLabel); + generateCodeFromNode(child.getNext(), node, trueLabel, falseLabel); markLabel(falseTarget); } else { @@ -747,7 +747,7 @@ public class Codegen extends Interpreter { } } markLabel(interLabel); - child = child.getNextSibling(); + child = child.getNext(); generateCodeFromNode(child, node, trueLabel, falseLabel); if (!childIsBoolean(child)) { addScriptRuntimeInvoke("toBoolean", @@ -761,7 +761,7 @@ public class Codegen extends Interpreter { case TokenStream.ADD: { generateCodeFromNode(child, node, trueLabel, falseLabel); - generateCodeFromNode(child.getNextSibling(), + generateCodeFromNode(child.getNext(), node, trueLabel, falseLabel); switch (node.getIntProp(Node.ISNUMBER_PROP, -1)) { case Node.BOTH: @@ -871,7 +871,7 @@ public class Codegen extends Interpreter { case TokenStream.GETELEM: while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) { @@ -912,7 +912,7 @@ public class Codegen extends Interpreter { case TokenStream.SETELEM: while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) { @@ -932,7 +932,7 @@ public class Codegen extends Interpreter { case TokenStream.DELPROP: while (child != null) { generateCodeFromNode(child, node, trueLabel, falseLabel); - child = child.getNextSibling(); + child = child.getNext(); } addScriptRuntimeInvoke("delete", "(Ljava/lang/Object;Ljava/lang/Object;)", @@ -1663,7 +1663,7 @@ public class Codegen extends Interpreter { else { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } if (type == TokenStream.JSR) addByteCode(ByteCode.JSR, targetLabel); @@ -1676,7 +1676,7 @@ public class Codegen extends Interpreter { private void visitEnumInit(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); addScriptRuntimeInvoke("initEnum", @@ -1690,7 +1690,7 @@ public class Codegen extends Interpreter { private void visitEnumNext(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } Node init = (Node) node.getProp(Node.ENUM_PROP); int local = init.getExistingIntProp(Node.LOCAL_PROP); @@ -1701,7 +1701,7 @@ public class Codegen extends Interpreter { private void visitEnumDone(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } Node init = (Node) node.getProp(Node.ENUM_PROP); int local = init.getExistingIntProp(Node.LOCAL_PROP); @@ -1711,7 +1711,7 @@ public class Codegen extends Interpreter { private void visitEnterWith(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); addScriptRuntimeInvoke("enterWith", @@ -1737,7 +1737,7 @@ public class Codegen extends Interpreter { Node child = node.getFirstChild(); while (child != null) { resetTargets(child); - child = child.getNextSibling(); + child = child.getNext(); } } @@ -1781,7 +1781,7 @@ public class Codegen extends Interpreter { if (type == TokenStream.NEW) addByteCode(ByteCode.ACONST_NULL); else { - child = child.getNextSibling(); + child = child.getNext(); generateCodeFromNode(child, node, -1, -1); } /* @@ -1791,7 +1791,7 @@ public class Codegen extends Interpreter { in the aReg and the number is the dReg Else pass the JS object in the aReg and 0.0 in the dReg. */ - child = child.getNextSibling(); + child = child.getNext(); while (child != null) { boolean handled = false; if ((child.getType() == TokenStream.GETVAR) @@ -1820,7 +1820,7 @@ public class Codegen extends Interpreter { } } resetTargets(child); - child = child.getNextSibling(); + child = child.getNext(); } addByteCode(ByteCode.ALOAD_0); @@ -1876,14 +1876,14 @@ public class Codegen extends Interpreter { if (callBase.getType() == TokenStream.GETPROP) { Node callBaseChild = callBase.getFirstChild(); if (callBaseChild.getType() == TokenStream.NEWTEMP) { - Node callBaseID = callBaseChild.getNextSibling(); + Node callBaseID = callBaseChild.getNext(); Node tempChild = callBaseChild.getFirstChild(); if (tempChild.getType() == TokenStream.GETBASE) { String functionName = tempChild.getString(); if ((callBaseID != null) && (callBaseID.getType() == TokenStream.STRING)) { if (functionName.equals(callBaseID.getString())) { - Node thisChild = callBase.getNextSibling(); + Node thisChild = callBase.getNext(); if (thisChild.getType() == TokenStream.GETTHIS) { Node useChild = thisChild.getFirstChild(); if (useChild.getType() == TokenStream.USETEMP) { @@ -1950,7 +1950,7 @@ public class Codegen extends Interpreter { int argSkipCount = (type == TokenStream.NEW) ? 1 : 2; while (child != null) { childCount++; - child = child.getNextSibling(); + child = child.getNext(); } child = chelsea; // re-start the iterator from the first child, @@ -1958,7 +1958,7 @@ public class Codegen extends Interpreter { int argIndex = -argSkipCount; if (firstArgDone && (child != null)) { - child = child.getNextSibling(); + child = child.getNext(); argIndex++; aload(contextLocal); addByteCode(ByteCode.SWAP); @@ -1978,7 +1978,7 @@ public class Codegen extends Interpreter { isSimpleCall = true; push(simpleCallName); aload(variableObjectLocal); - child = child.getNextSibling().getNextSibling(); + child = child.getNext().getNext(); argIndex = 0; push(childCount - argSkipCount); addByteCode(ByteCode.ANEWARRAY, "java/lang/Object"); @@ -2034,7 +2034,7 @@ public class Codegen extends Interpreter { // instead ? constructArgArray(childCount - argSkipCount); } - child = child.getNextSibling(); + child = child.getNext(); } String className; @@ -2145,7 +2145,7 @@ public class Codegen extends Interpreter { visitStatement(node); while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } Node catchTarget = (Node)node.getProp(Node.TARGET_PROP); @@ -2275,7 +2275,7 @@ public class Codegen extends Interpreter { visitStatement(node); while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } addByteCode(ByteCode.NEW, @@ -2293,7 +2293,7 @@ public class Codegen extends Interpreter { if (child != null) { do { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } while (child != null); } else if (inFunction) { pushUndefined(); @@ -2310,7 +2310,7 @@ public class Codegen extends Interpreter { visitStatement(node); while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } // save selector value @@ -2499,7 +2499,7 @@ public class Codegen extends Interpreter { if (child.getType() == TokenStream.GETPROP) { Node getPropChild = child.getFirstChild(); generateCodeFromNode(getPropChild, node, -1, -1); - generateCodeFromNode(getPropChild.getNextSibling(), node, -1, -1); + generateCodeFromNode(getPropChild.getNext(), node, -1, -1); aload(variableObjectLocal); addScriptRuntimeInvoke(routine, "(Ljava/lang/Object;Ljava/lang/String;" + @@ -2511,7 +2511,7 @@ public class Codegen extends Interpreter { routine += "Elem"; Node getPropChild = child.getFirstChild(); generateCodeFromNode(getPropChild, node, -1, -1); - generateCodeFromNode(getPropChild.getNextSibling(), node, -1, -1); + generateCodeFromNode(getPropChild.getNext(), node, -1, -1); aload(variableObjectLocal); addScriptRuntimeInvoke(routine, "(Ljava/lang/Object;Ljava/lang/Object;" + @@ -2544,7 +2544,7 @@ public class Codegen extends Interpreter { int childNumberFlag = node.getIntProp(Node.ISNUMBER_PROP, -1); if (childNumberFlag != -1) { generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); addByteCode(opCode); } else { @@ -2556,8 +2556,8 @@ public class Codegen extends Interpreter { generateCodeFromNode(child, node, -1, -1); if (!isArithmeticNode(child)) addScriptRuntimeInvoke("toNumber", "(Ljava/lang/Object;)", "D"); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); - if (!isArithmeticNode(child.getNextSibling())) + generateCodeFromNode(child.getNext(), node, -1, -1); + if (!isArithmeticNode(child.getNext())) addScriptRuntimeInvoke("toNumber", "(Ljava/lang/Object;)", "D"); addByteCode(opCode); if (!childOfArithmetic) { @@ -2579,7 +2579,7 @@ public class Codegen extends Interpreter { // toUint32 instead of toInt32. if (type == TokenStream.URSH) { addScriptRuntimeInvoke("toUint32", "(Ljava/lang/Object;)", "J"); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I"); // Looks like we need to explicitly mask the shift to 5 bits - // LUSHR takes 6 bits. @@ -2592,12 +2592,12 @@ public class Codegen extends Interpreter { } if (childNumberFlag == -1) { addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I"); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I"); } else { addScriptRuntimeInvoke("toInt32", "(D)", "I"); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); addScriptRuntimeInvoke("toInt32", "(D)", "I"); } switch (type) { @@ -2668,14 +2668,14 @@ public class Codegen extends Interpreter { int childNumberFlag = node.getIntProp(Node.ISNUMBER_PROP, -1); if (childNumberFlag == Node.BOTH) { generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); genSimpleCompare(op, trueGOTO, falseGOTO); } else { if (op == TokenStream.INSTANCEOF) { aload(variableObjectLocal); generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); addScriptRuntimeInvoke("instanceOf", "(Lorg/mozilla/javascript/Scriptable;"+ "Ljava/lang/Object;Ljava/lang/Object;)", "Z"); @@ -2683,7 +2683,7 @@ public class Codegen extends Interpreter { addByteCode(ByteCode.GOTO, falseGOTO); } else if (op == TokenStream.IN) { generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); aload(variableObjectLocal); addScriptRuntimeInvoke("in", "(Ljava/lang/Object;Ljava/lang/Object;"+ @@ -2691,7 +2691,7 @@ public class Codegen extends Interpreter { addByteCode(ByteCode.IFNE, trueGOTO); addByteCode(ByteCode.GOTO, falseGOTO); } else { - Node rChild = child.getNextSibling(); + Node rChild = child.getNext(); boolean leftIsDCP = nodeIsDirectCallParameter(child); boolean rightIsDCP = nodeIsDirectCallParameter(rChild); if (leftIsDCP || rightIsDCP) { @@ -2813,7 +2813,7 @@ public class Codegen extends Interpreter { if (op == TokenStream.INSTANCEOF) aload(variableObjectLocal); generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); int trueGOTO = acquireLabel(); int skip = acquireLabel(); if (op == TokenStream.INSTANCEOF) { @@ -2847,7 +2847,7 @@ public class Codegen extends Interpreter { String routine = ((op == TokenStream.LT) || (op == TokenStream.GT)) ? "cmp_LTB" : "cmp_LEB"; generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); if (childNumberFlag == -1) { if (op == TokenStream.GE || op == TokenStream.GT) { addByteCode(ByteCode.SWAP); @@ -2898,7 +2898,7 @@ public class Codegen extends Interpreter { int falseGOTO) { int op = node.getOperation(); - Node rightChild = child.getNextSibling(); + Node rightChild = child.getNext(); boolean isStrict = op == TokenStream.SHEQ || op == TokenStream.SHNE; if (trueGOTO == -1) { @@ -2936,7 +2936,7 @@ public class Codegen extends Interpreter { } generateCodeFromNode(child, node, -1, -1); - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); // JavaScript 1.2 uses shallow equality for == and != String name; @@ -3008,7 +3008,7 @@ public class Codegen extends Interpreter { return; } - Node rChild = child.getNextSibling(); + Node rChild = child.getNext(); if (nodeIsDirectCallParameter(child)) { Node convertChild = getConvertToObjectOfNumberNode(rChild); @@ -3227,7 +3227,7 @@ public class Codegen extends Interpreter { String name = node.getFirstChild().getString(); while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); push(name); @@ -3315,7 +3315,7 @@ public class Codegen extends Interpreter { if (hasVarsInRegs && lVar == null) lVar = OptLocalVariable.get(vars, child.getString()); if (lVar != null) { - generateCodeFromNode(child.getNextSibling(), node, -1, -1); + generateCodeFromNode(child.getNext(), node, -1, -1); if (lVar.getJRegister() == -1) { if (lVar.isNumber()) lVar.assignJRegister(getNewWordPairLocal()); @@ -3378,7 +3378,7 @@ public class Codegen extends Interpreter { if (s != null) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); String runtimeMethod = null; @@ -3394,7 +3394,7 @@ public class Codegen extends Interpreter { "Lorg/mozilla/javascript/Scriptable;"); return; } - Node nameChild = child.getNextSibling(); + Node nameChild = child.getNext(); /* for 'this.foo' we call thisGet which can skip some casting overhead. @@ -3438,7 +3438,7 @@ public class Codegen extends Interpreter { if (s != null) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); String runtimeMethod = null; @@ -3457,7 +3457,7 @@ public class Codegen extends Interpreter { } while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } aload(variableObjectLocal); addScriptRuntimeInvoke("setProp", @@ -3469,7 +3469,7 @@ public class Codegen extends Interpreter { private void visitBind(Node node, int type, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } // Generate code for "ScriptRuntime.bind(varObj, "s")" aload(variableObjectLocal); // get variable object @@ -3497,7 +3497,7 @@ public class Codegen extends Interpreter { private void visitNewTemp(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } short local = getLocalFromNode(node); addByteCode(ByteCode.DUP); @@ -3509,7 +3509,7 @@ public class Codegen extends Interpreter { private void visitUseTemp(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } Node temp = (Node) node.getProp(Node.TEMP_PROP); short local = getLocalFromNode(temp); @@ -3532,7 +3532,7 @@ public class Codegen extends Interpreter { private void visitNewLocal(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } short local = getLocalFromNode(node); addByteCode(ByteCode.DUP); @@ -3542,7 +3542,7 @@ public class Codegen extends Interpreter { private void visitUseLocal(Node node, Node child) { while (child != null) { generateCodeFromNode(child, node, -1, -1); - child = child.getNextSibling(); + child = child.getNext(); } Node temp = (Node) node.getProp(Node.LOCAL_PROP); short local = getLocalFromNode(temp); diff --git a/js/rhino/src/org/mozilla/javascript/optimizer/OptTransformer.java b/js/rhino/src/org/mozilla/javascript/optimizer/OptTransformer.java index 40571d712ffd..78eaeba60261 100644 --- a/js/rhino/src/org/mozilla/javascript/optimizer/OptTransformer.java +++ b/js/rhino/src/org/mozilla/javascript/optimizer/OptTransformer.java @@ -80,9 +80,9 @@ class OptTransformer extends NodeTransformer { // count the arguments int argCount = 0; - Node arg = left.getNextSibling(); + Node arg = left.getNext(); while (arg != null) { - arg = arg.getNextSibling(); + arg = arg.getNext(); argCount++; } @@ -91,7 +91,7 @@ class OptTransformer extends NodeTransformer { markDirectCall(tree, node, argCount, left.getString()); } else { if (left.getType() == TokenStream.GETPROP) { - Node name = left.getFirstChild().getNextSibling(); + Node name = left.getFirstChild().getNext(); markDirectCall(tree, node, argCount, name.getString()); } } @@ -157,7 +157,7 @@ class OptTransformer extends NodeTransformer { * count for any call it encounters */ void collectContainedFunctions(Node node) { - for (Node tNode=node; tNode != null; tNode = tNode.getNextSibling()) { + for (Node tNode=node; tNode != null; tNode = tNode.getNext()) { if (tNode.getType() == TokenStream.FUNCTION) { FunctionNode fnNode = (FunctionNode) tNode.getProp(Node.FUNCTION_PROP); diff --git a/js/rhino/src/org/mozilla/javascript/optimizer/Optimizer.java b/js/rhino/src/org/mozilla/javascript/optimizer/Optimizer.java index 112334877040..d08eb40f027d 100644 --- a/js/rhino/src/org/mozilla/javascript/optimizer/Optimizer.java +++ b/js/rhino/src/org/mozilla/javascript/optimizer/Optimizer.java @@ -415,7 +415,7 @@ public class Optimizer { } case TokenStream.SETVAR : { Node lChild = n.getFirstChild(); - Node rChild = lChild.getNextSibling(); + Node rChild = lChild.getNext(); int rType = rewriteForNumberVariables(rChild); OptLocalVariable theVar = (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP)); @@ -458,7 +458,7 @@ public class Optimizer { } case TokenStream.RELOP : { Node lChild = n.getFirstChild(); - Node rChild = lChild.getNextSibling(); + Node rChild = lChild.getNext(); int lType = rewriteForNumberVariables(lChild); int rType = rewriteForNumberVariables(rChild); markDCPNumberContext(lChild); @@ -528,7 +528,7 @@ public class Optimizer { case TokenStream.ADD : { Node lChild = n.getFirstChild(); - Node rChild = lChild.getNextSibling(); + Node rChild = lChild.getNext(); int lType = rewriteForNumberVariables(lChild); int rType = rewriteForNumberVariables(rChild); @@ -580,7 +580,7 @@ public class Optimizer { case TokenStream.DIV : case TokenStream.MOD : { Node lChild = n.getFirstChild(); - Node rChild = lChild.getNextSibling(); + Node rChild = lChild.getNext(); int lType = rewriteForNumberVariables(lChild); int rType = rewriteForNumberVariables(rChild); markDCPNumberContext(lChild); @@ -632,8 +632,8 @@ public class Optimizer { } case TokenStream.SETELEM : { Node arrayBase = n.getFirstChild(); - Node arrayIndex = arrayBase.getNextSibling(); - Node rValue = arrayIndex.getNextSibling(); + Node arrayIndex = arrayBase.getNext(); + Node rValue = arrayIndex.getNext(); int baseType = rewriteForNumberVariables(arrayBase); if (baseType == TypeEvent.NumberType) {// can never happen ??? if (!convertParameter(arrayBase)) { @@ -664,7 +664,7 @@ public class Optimizer { } case TokenStream.GETELEM : { Node arrayBase = n.getFirstChild(); - Node arrayIndex = arrayBase.getNextSibling(); + Node arrayIndex = arrayBase.getNext(); int baseType = rewriteForNumberVariables(arrayBase); if (baseType == TypeEvent.NumberType) {// can never happen ??? if (!convertParameter(arrayBase)) { @@ -695,15 +695,15 @@ public class Optimizer { */ Node child = n.getFirstChild(); // the function rewriteForNumberVariables(child); - child = child.getNextSibling(); // the 'this' object + child = child.getNext(); // the 'this' object rewriteForNumberVariables(child); - child = child.getNextSibling(); // the first arg + child = child.getNext(); // the first arg while (child != null) { int type = rewriteForNumberVariables(child); if (type == TypeEvent.NumberType) { markDCPNumberContext(child); } - child = child.getNextSibling(); + child = child.getNext(); } return TypeEvent.NoType; } @@ -712,7 +712,7 @@ public class Optimizer { default : { Node child = n.getFirstChild(); while (child != null) { - Node nextChild = child.getNextSibling(); + Node nextChild = child.getNext(); int type = rewriteForNumberVariables(child); if (type == TypeEvent.NumberType) { if (!convertParameter(child)) { @@ -743,7 +743,7 @@ public class Optimizer { if(lChild == null){ // no children -- exit return; }else{ - rChild = lChild.getNextSibling(); + rChild = lChild.getNext(); if(rChild == null){ foldConstants(lChild, n); // one child -- recurse @@ -756,10 +756,10 @@ public class Optimizer { foldConstants(rChild, n); /* take care of all the other children */ - Node child = rChild.getNextSibling(); + Node child = rChild.getNext(); while (child != null) { foldConstants(child, n); - child = child.getNextSibling(); + child = child.getNext(); } @@ -768,7 +768,7 @@ public class Optimizer { if(lChild == null){ // no children -- exit return; }else{ - rChild = lChild.getNextSibling(); + rChild = lChild.getNext(); if(rChild == null){ return; @@ -937,11 +937,11 @@ public class Optimizer { if (definedBoolean == ALWAYS_FALSE_BOOLEAN) { //if(false) -> replace by the else clause if it exists - Node next1 = rChild.getNextSibling(); + Node next1 = rChild.getNext(); if (next1 != null) { - Node next2 = next1.getNextSibling(); + Node next2 = next1.getNext(); if (next2 != null) { - Node next3 = next2.getNextSibling(); + Node next3 = next2.getNext(); if (next3 != null) { Node elseClause = next3.getFirstChild(); if (elseClause != null) { @@ -1004,7 +1004,7 @@ public class Optimizer { Node child = n.getFirstChild(); while (child != null) { replaceVariableAccess(child, theVariables); - child = child.getNextSibling(); + child = child.getNext(); } switch (n.getType()) { case TokenStream.SETVAR : { diff --git a/js/rhino/src/org/mozilla/javascript/optimizer/StmtNodeIterator.java b/js/rhino/src/org/mozilla/javascript/optimizer/StmtNodeIterator.java index 9cde59c903b5..cce814624add 100644 --- a/js/rhino/src/org/mozilla/javascript/optimizer/StmtNodeIterator.java +++ b/js/rhino/src/org/mozilla/javascript/optimizer/StmtNodeIterator.java @@ -49,21 +49,23 @@ public class StmtNodeIterator { private Node findFirstInterestingNode(Node theNode) { - if (theNode == null) return null; - - if ((theNode.getType() == TokenStream.BLOCK) - || (theNode.getType() == TokenStream.LOOP) - || (theNode.getType() == TokenStream.FUNCTION)) { - if (theNode.getFirst() == null) { - return findFirstInterestingNode(theNode.getNext()); - } - else { - itsStack.push(theNode); - return findFirstInterestingNode(theNode.getFirst()); + while (theNode != null) { + int type = theNode.getType(); + if (type == TokenStream.BLOCK || type == TokenStream.LOOP + || type == TokenStream.FUNCTION) + { + Node first = theNode.getFirstChild(); + if (first == null) { + theNode = theNode.getNext(); + } else { + itsStack.push(theNode); + theNode = first; + } + } else { + break; } } - else - return theNode; + return theNode; } public Node nextNode() @@ -75,14 +77,17 @@ public class StmtNodeIterator { if (itsCurrentNode == null) { while ( ! itsStack.isEmpty()) { Node n = (Node)(itsStack.pop()); - if (n.getNext() != null) { - return itsCurrentNode = findFirstInterestingNode(n.getNext()); + Node next = n.getNext(); + if (next != null) { + itsCurrentNode = findFirstInterestingNode(next); + return itsCurrentNode; } } return null; + } else { + itsCurrentNode = findFirstInterestingNode(itsCurrentNode); + return itsCurrentNode; } - else - return itsCurrentNode = findFirstInterestingNode(itsCurrentNode); } private ObjArray itsStack = new ObjArray();