I removed method duplication in Node where getNext() was duplicated as getNextSibling() and code was using both of them and similarly for getFirstChild()/getFirst().

This commit is contained in:
igor%mir2.org 2002-11-02 22:08:00 +00:00
Родитель 951de612e3
Коммит e33d132a12
10 изменённых файлов: 187 добавлений и 184 удалений

Просмотреть файл

@ -494,8 +494,8 @@ public class IRFactory {
int catchLineNo = cb.getLineno(); int catchLineNo = cb.getLineno();
Node name = cb.getFirstChild(); Node name = cb.getFirstChild();
Node cond = name.getNextSibling(); Node cond = name.getNext();
Node catchBlock = cond.getNextSibling(); Node catchBlock = cond.getNext();
cb.removeChild(name); cb.removeChild(name);
cb.removeChild(cond); cb.removeChild(cond);
cb.removeChild(catchBlock); cb.removeChild(catchBlock);
@ -525,7 +525,7 @@ public class IRFactory {
pn.addChildToBack(catchStmt); pn.addChildToBack(catchStmt);
// move to next cb // move to next cb
cb = cb.getNextSibling(); cb = cb.getNext();
} }
// Generate code to rethrow if no catch clause was executed // 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 // Move cursor to cursor.next before elem.next can be
// altered in new Node constructor // altered in new Node constructor
elem = cursor; elem = cursor;
cursor = cursor.getNextSibling(); cursor = cursor.getNext();
if (elem.getType() == TokenStream.PRIMARY && if (elem.getType() == TokenStream.PRIMARY &&
elem.getOperation() == TokenStream.UNDEFINED) elem.getOperation() == TokenStream.UNDEFINED)
{ {
@ -654,13 +654,13 @@ public class IRFactory {
Node comma = new Node(TokenStream.COMMA, temp); Node comma = new Node(TokenStream.COMMA, temp);
for (Node cursor = ((Node) obj).getFirstChild(); cursor != null;) { for (Node cursor = ((Node) obj).getFirstChild(); cursor != null;) {
Node n = cursor; Node n = cursor;
cursor = cursor.getNextSibling(); cursor = cursor.getNext();
int op = (n.getType() == TokenStream.NAME) int op = (n.getType() == TokenStream.NAME)
? TokenStream.SETPROP ? TokenStream.SETPROP
: TokenStream.SETELEM; : TokenStream.SETELEM;
// Move cursor before next.next can be altered in new Node // Move cursor before next.next can be altered in new Node
Node next = cursor; Node next = cursor;
cursor = cursor.getNextSibling(); cursor = cursor.getNext();
Node addelem = new Node(op, createUseTemp(temp), n, next); Node addelem = new Node(op, createUseTemp(temp), n, next);
comma.addChildToBack(addelem); comma.addChildToBack(addelem);
} }
@ -951,7 +951,7 @@ public class IRFactory {
if (hasSideEffects(child)) if (hasSideEffects(child))
return true; return true;
else else
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
} }

Просмотреть файл

@ -291,16 +291,16 @@ public class Interpreter {
while (child != null) { while (child != null) {
if (child.getType() != TokenStream.FUNCTION) if (child.getType() != TokenStream.FUNCTION)
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
case TokenStream.CASE : case TokenStream.CASE :
iCodeTop = updateLineNumber(node, iCodeTop); iCodeTop = updateLineNumber(node, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
while (child != null) { while (child != null) {
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
@ -314,13 +314,13 @@ public class Interpreter {
iCodeTop = updateLineNumber(node, iCodeTop); iCodeTop = updateLineNumber(node, iCodeTop);
while (child != null) { while (child != null) {
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
case TokenStream.COMMA : case TokenStream.COMMA :
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
while (null != (child = child.getNextSibling())) { while (null != (child = child.getNext())) {
iCodeTop = addByte(TokenStream.POP, iCodeTop); iCodeTop = addByte(TokenStream.POP, iCodeTop);
itsStackDepth--; itsStackDepth--;
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
@ -387,7 +387,7 @@ public class Interpreter {
case TokenStream.EQOP : case TokenStream.EQOP :
case TokenStream.RELOP : { case TokenStream.RELOP : {
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
int op = node.getOperation(); int op = node.getOperation();
if (version == Context.VERSION_1_2) { if (version == Context.VERSION_1_2) {
@ -424,7 +424,7 @@ public class Interpreter {
functionName = lastAddString; functionName = lastAddString;
} }
} }
child = child.getNextSibling(); child = child.getNext();
childCount++; childCount++;
} }
if (node.getProp(Node.SPECIALCALL_PROP) != null) { if (node.getProp(Node.SPECIALCALL_PROP) != null) {
@ -527,7 +527,7 @@ public class Interpreter {
iCodeTop = addForwardGoto(TokenStream.IFNE, iCodeTop); iCodeTop = addForwardGoto(TokenStream.IFNE, iCodeTop);
iCodeTop = addByte(TokenStream.POP, iCodeTop); iCodeTop = addByte(TokenStream.POP, iCodeTop);
itsStackDepth--; itsStackDepth--;
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
resolveForwardGoto(falseJumpStart, iCodeTop); resolveForwardGoto(falseJumpStart, iCodeTop);
break; break;
@ -543,7 +543,7 @@ public class Interpreter {
iCodeTop = addForwardGoto(TokenStream.IFEQ, iCodeTop); iCodeTop = addForwardGoto(TokenStream.IFEQ, iCodeTop);
iCodeTop = addByte(TokenStream.POP, iCodeTop); iCodeTop = addByte(TokenStream.POP, iCodeTop);
itsStackDepth--; itsStackDepth--;
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
resolveForwardGoto(trueJumpStart, iCodeTop); resolveForwardGoto(trueJumpStart, iCodeTop);
break; break;
@ -562,7 +562,7 @@ public class Interpreter {
badTree(node); badTree(node);
} }
} else { } else {
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
iCodeTop = addByte(TokenStream.GETPROP, iCodeTop); iCodeTop = addByte(TokenStream.GETPROP, iCodeTop);
itsStackDepth--; itsStackDepth--;
@ -584,7 +584,7 @@ public class Interpreter {
case TokenStream.MUL : case TokenStream.MUL :
case TokenStream.GETELEM : case TokenStream.GETELEM :
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
iCodeTop = addByte(type, iCodeTop); iCodeTop = addByte(type, iCodeTop);
itsStackDepth--; itsStackDepth--;
@ -641,7 +641,7 @@ public class Interpreter {
case TokenStream.SETPROP : { case TokenStream.SETPROP : {
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
String s = (String) node.getProp(Node.SPECIAL_PROP_PROP); String s = (String) node.getProp(Node.SPECIAL_PROP_PROP);
if (s != null) { if (s != null) {
@ -653,7 +653,7 @@ public class Interpreter {
badTree(node); badTree(node);
} }
} else { } else {
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
iCodeTop = addByte(TokenStream.SETPROP, iCodeTop); iCodeTop = addByte(TokenStream.SETPROP, iCodeTop);
itsStackDepth -= 2; itsStackDepth -= 2;
@ -663,9 +663,9 @@ public class Interpreter {
case TokenStream.SETELEM : case TokenStream.SETELEM :
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
iCodeTop = addByte(type, iCodeTop); iCodeTop = addByte(type, iCodeTop);
itsStackDepth -= 2; itsStackDepth -= 2;
@ -673,7 +673,7 @@ public class Interpreter {
case TokenStream.SETNAME : case TokenStream.SETNAME :
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
iCodeTop = addByte(TokenStream.SETNAME, iCodeTop); iCodeTop = addByte(TokenStream.SETNAME, iCodeTop);
iCodeTop = addString(firstChild.getString(), iCodeTop); iCodeTop = addString(firstChild.getString(), iCodeTop);
@ -752,7 +752,7 @@ public class Interpreter {
case TokenStream.GETELEM : { case TokenStream.GETELEM : {
Node getPropChild = child.getFirstChild(); Node getPropChild = child.getFirstChild();
iCodeTop = generateICode(getPropChild, iCodeTop); iCodeTop = generateICode(getPropChild, iCodeTop);
getPropChild = getPropChild.getNextSibling(); getPropChild = getPropChild.getNext();
iCodeTop = generateICode(getPropChild, iCodeTop); iCodeTop = generateICode(getPropChild, iCodeTop);
if (childType == TokenStream.GETPROP) { if (childType == TokenStream.GETPROP) {
iCodeTop = addByte(type == TokenStream.INC iCodeTop = addByte(type == TokenStream.INC
@ -868,7 +868,7 @@ public class Interpreter {
the try statemets, we need to emit the endtry the try statemets, we need to emit the endtry
before that goto. before that goto.
*/ */
Node nextSibling = child.getNextSibling(); Node nextSibling = child.getNext();
if (!insertedEndTry && nextSibling != null && if (!insertedEndTry && nextSibling != null &&
(nextSibling == catchTarget || (nextSibling == catchTarget ||
nextSibling == finallyTarget)) nextSibling == finallyTarget))
@ -879,7 +879,7 @@ public class Interpreter {
} }
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
lastChild = child; lastChild = child;
child = child.getNextSibling(); child = child.getNext();
} }
itsStackDepth = 0; itsStackDepth = 0;
if (finallyTarget != null) { if (finallyTarget != null) {
@ -959,7 +959,7 @@ public class Interpreter {
iCodeTop = generateICode(node, iCodeTop); iCodeTop = generateICode(node, iCodeTop);
} else { } else {
String name = child.getString(); String name = child.getString();
child = child.getNextSibling(); child = child.getNext();
iCodeTop = generateICode(child, iCodeTop); iCodeTop = generateICode(child, iCodeTop);
int index = itsVariableTable.getOrdinal(name); int index = itsVariableTable.getOrdinal(name);
iCodeTop = addByte(TokenStream.SETVAR, iCodeTop); iCodeTop = addByte(TokenStream.SETVAR, iCodeTop);

Просмотреть файл

@ -150,7 +150,7 @@ public class Node implements Cloneable {
return last; return last;
} }
public Node getNextSibling() { public Node getNext() {
return next; return next;
} }
@ -541,7 +541,7 @@ public class Node implements Cloneable {
s.append(toString()); s.append(toString());
s.append('\n'); s.append('\n');
for (Node cursor = getFirstChild(); cursor != null; for (Node cursor = getFirstChild(); cursor != null;
cursor = cursor.getNextSibling()) cursor = cursor.getNext())
{ {
Node n = cursor; Node n = cursor;
if (cursor.getType() == TokenStream.FUNCTION) { if (cursor.getType() == TokenStream.FUNCTION) {
@ -556,13 +556,10 @@ public class Node implements Cloneable {
return ""; return "";
} }
public Node getFirst() { return first; } int type; // type of the node; TokenStream.NAME for example
public Node getNext() { return next; } Node next; // next sibling
private Node first; // first element of a linked list of children
protected int type; // type of the node; TokenStream.NAME for example private Node last; // last element of a linked list of children
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
private int intDatum = -1; // encapsulated int data; depends on type private int intDatum = -1; // encapsulated int data; depends on type
private UintMap props; private UintMap props;
} }

Просмотреть файл

@ -152,11 +152,11 @@ public class NodeTransformer {
*/ */
Node breakTarget = new Node(TokenStream.TARGET); Node breakTarget = new Node(TokenStream.TARGET);
Node parent = iterator.getCurrentParent(); Node parent = iterator.getCurrentParent();
Node next = node.getNextSibling(); Node next = node.getNext();
while (next != null && while (next != null &&
(next.getType() == TokenStream.LABEL || (next.getType() == TokenStream.LABEL ||
next.getType() == TokenStream.TARGET)) next.getType() == TokenStream.TARGET))
next = next.getNextSibling(); next = next.getNext();
if (next == null) if (next == null)
break; break;
parent.addChildAfter(breakTarget, next); parent.addChildAfter(breakTarget, next);
@ -228,7 +228,7 @@ public class NodeTransformer {
((FunctionNode) tree).setRequiresActivation(true); ((FunctionNode) tree).setRequiresActivation(true);
} }
loops.push(node); loops.push(node);
Node leave = node.getNextSibling(); Node leave = node.getNext();
if (leave.getType() != TokenStream.LEAVEWITH) { if (leave.getType() != TokenStream.LEAVEWITH) {
throw new RuntimeException("Unexpected tree"); throw new RuntimeException("Unexpected tree");
} }
@ -406,7 +406,7 @@ public class NodeTransformer {
// Move cursor to next before createAssignment get chance // Move cursor to next before createAssignment get chance
// to change n.next // to change n.next
Node n = cursor; Node n = cursor;
cursor = cursor.getNextSibling(); cursor = cursor.getNext();
if (!n.hasChildren()) if (!n.hasChildren())
continue; continue;
Node init = n.getFirstChild(); Node init = n.getFirstChild();
@ -452,7 +452,7 @@ public class NodeTransformer {
case TokenStream.GETPROP: case TokenStream.GETPROP:
if (inFunction) { if (inFunction) {
Node n = node.getFirstChild().getNextSibling(); Node n = node.getFirstChild().getNext();
String name = n == null ? "" : n.getString(); String name = n == null ? "" : n.getString();
Context cx = Context.getCurrentContext(); Context cx = Context.getCurrentContext();
if ((cx != null && cx.isActivationNeeded(name)) || if ((cx != null && cx.isActivationNeeded(name)) ||
@ -516,7 +516,7 @@ public class NodeTransformer {
if (nodeType != TokenStream.VAR) if (nodeType != TokenStream.VAR)
continue; continue;
for (Node cursor = node.getFirstChild(); cursor != null; for (Node cursor = node.getFirstChild(); cursor != null;
cursor = cursor.getNextSibling()) cursor = cursor.getNext())
{ {
String name = cursor.getString(); String name = cursor.getString();
if (fNames == null || !fNames.has(name)) if (fNames == null || !fNames.has(name))
@ -553,7 +553,7 @@ public class NodeTransformer {
{ {
// Add parameters // Add parameters
for (Node cursor = args.getFirstChild(); cursor != null; for (Node cursor = args.getFirstChild(); cursor != null;
cursor = cursor.getNextSibling()) cursor = cursor.getNext())
{ {
String arg = cursor.getString(); String arg = cursor.getString();
vars.addParameter(arg, createVariableObject(arg, true)); vars.addParameter(arg, createVariableObject(arg, true));
@ -588,9 +588,9 @@ public class NodeTransformer {
Node left = node.getFirstChild(); Node left = node.getFirstChild();
// count the arguments // count the arguments
int argCount = 0; int argCount = 0;
Node arg = left.getNextSibling(); Node arg = left.getNext();
while (arg != null) { while (arg != null) {
arg = arg.getNextSibling(); arg = arg.getNext();
argCount++; argCount++;
} }
boolean addGetThis = false; boolean addGetThis = false;

Просмотреть файл

@ -62,20 +62,20 @@ public final class PreorderNodeIterator {
public Node nextNode() { public Node nextNode() {
if (current == null) { if (current == null) {
current = start; current = start;
} } else {
else if (current.first != null) { Node first = current.getFirstChild();
if (first != null) {
stackPush(current); stackPush(current);
cachedPrev = null; cachedPrev = null;
current = current.first; current = first;
} } else {
else {
for (;;) { for (;;) {
cachedPrev = current; cachedPrev = current;
current = current.next; current = current.next;
if (current != null) { break; } if (current != null) { break; }
if (stackTop == 0) { if (stackTop == 0) {
// Iteration end: clear cachedPrev that currently points // Iteration end: clear cachedPrev that currently
// to the last sibling of start // points to the last sibling of start
cachedPrev = null; break; cachedPrev = null; break;
} }
--stackTop; --stackTop;
@ -83,6 +83,7 @@ public final class PreorderNodeIterator {
stack[stackTop] = null; stack[stackTop] = null;
} }
} }
}
return current; return current;
} }

Просмотреть файл

@ -199,7 +199,7 @@ public class Block {
case TokenStream.SETVAR : case TokenStream.SETVAR :
{ {
Node lhs = n.getFirstChild(); Node lhs = n.getFirstChild();
Node rhs = lhs.getNextSibling(); Node rhs = lhs.getNext();
lookForVariablesAndCalls(rhs, liveSet, theVariables); lookForVariablesAndCalls(rhs, liveSet, theVariables);
Object theVarProp = n.getProp(Node.VARIABLE_PROP); Object theVarProp = n.getProp(Node.VARIABLE_PROP);
if (theVarProp != null) { if (theVarProp != null) {
@ -212,7 +212,7 @@ public class Block {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
lookForVariablesAndCalls(child, liveSet, theVariables); lookForVariablesAndCalls(child, liveSet, theVariables);
child = child.getNextSibling(); child = child.getNext();
} }
for (int i = 0; i < liveSet.length; i++) { for (int i = 0; i < liveSet.length; i++) {
if (liveSet[i]) if (liveSet[i])
@ -235,7 +235,7 @@ public class Block {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
lookForVariablesAndCalls(child, liveSet, theVariables); lookForVariablesAndCalls(child, liveSet, theVariables);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
} }
@ -289,7 +289,7 @@ public class Block {
case TokenStream.SETVAR : case TokenStream.SETVAR :
{ {
Node lhs = n.getFirstChild(); Node lhs = n.getFirstChild();
Node rhs = lhs.getNextSibling(); Node rhs = lhs.getNext();
lookForVariableAccess(rhs, lastUse); lookForVariableAccess(rhs, lastUse);
Object theVarProp = n.getProp(Node.VARIABLE_PROP); Object theVarProp = n.getProp(Node.VARIABLE_PROP);
if (theVarProp != null) { if (theVarProp != null) {
@ -316,7 +316,7 @@ public class Block {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
lookForVariableAccess(child, lastUse); lookForVariableAccess(child, lastUse);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
} }
@ -415,7 +415,7 @@ public class Block {
// the result, otherwise it could be a string. // the result, otherwise it could be a string.
Node child = n.getFirstChild(); Node child = n.getFirstChild();
int lType = findExpressionType(child); int lType = findExpressionType(child);
int rType = findExpressionType(child.getNextSibling()); int rType = findExpressionType(child.getNext());
return lType | rType; // we're not distinguishng strings yet return lType | rType; // we're not distinguishng strings yet
} }
default : { default : {
@ -426,7 +426,7 @@ public class Block {
int result = TypeEvent.NoType; int result = TypeEvent.NoType;
while (child != null) { while (child != null) {
result |= findExpressionType(child); result |= findExpressionType(child);
child = child.getNextSibling(); child = child.getNext();
} }
return result; return result;
} }
@ -442,7 +442,7 @@ public class Block {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
result |= findDefPoints(child); result |= findDefPoints(child);
child = child.getNextSibling(); child = child.getNext();
} }
} }
break; break;
@ -460,8 +460,8 @@ public class Block {
case TokenStream.SETPROP : { case TokenStream.SETPROP : {
Node baseChild = n.getFirstChild(); Node baseChild = n.getFirstChild();
Node nameChild = baseChild.getNextSibling(); Node nameChild = baseChild.getNext();
Node rhs = nameChild.getNextSibling(); Node rhs = nameChild.getNext();
if (baseChild != null) { if (baseChild != null) {
if (baseChild.getType() == TokenStream.GETVAR) { if (baseChild.getType() == TokenStream.GETVAR) {
OptLocalVariable theVar = (OptLocalVariable) OptLocalVariable theVar = (OptLocalVariable)
@ -481,7 +481,7 @@ public class Block {
OptLocalVariable theVar = (OptLocalVariable) OptLocalVariable theVar = (OptLocalVariable)
(n.getProp(Node.VARIABLE_PROP)); (n.getProp(Node.VARIABLE_PROP));
if (theVar != null) { if (theVar != null) {
Node rValue = firstChild.getNextSibling(); Node rValue = firstChild.getNext();
int theType = findExpressionType(rValue); int theType = findExpressionType(rValue);
result |= theVar.assignType(theType); result |= theVar.assignType(theType);
} }
@ -500,7 +500,7 @@ public class Block {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
localCSE(n, child, theCSETable, theFunction); localCSE(n, child, theCSETable, theFunction);
child = child.getNextSibling(); child = child.getNext();
} }
} }
break; break;
@ -508,7 +508,7 @@ public class Block {
case TokenStream.INC : { case TokenStream.INC : {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
if (child.getType() == TokenStream.GETPROP) { if (child.getType() == TokenStream.GETPROP) {
Node nameChild = child.getFirstChild().getNextSibling(); Node nameChild = child.getFirstChild().getNext();
if (nameChild.getType() == TokenStream.STRING) if (nameChild.getType() == TokenStream.STRING)
theCSETable.remove(nameChild.getString()); theCSETable.remove(nameChild.getString());
else else
@ -521,8 +521,8 @@ public class Block {
break; break;
case TokenStream.SETPROP : { case TokenStream.SETPROP : {
Node baseChild = n.getFirstChild(); Node baseChild = n.getFirstChild();
Node nameChild = baseChild.getNextSibling(); Node nameChild = baseChild.getNext();
Node rhs = nameChild.getNextSibling(); Node rhs = nameChild.getNext();
if (baseChild != null) localCSE(n, baseChild, theCSETable, theFunction); if (baseChild != null) localCSE(n, baseChild, theCSETable, theFunction);
if (nameChild != null) localCSE(n, nameChild, theCSETable, theFunction); if (nameChild != null) localCSE(n, nameChild, theCSETable, theFunction);
if (rhs != null) localCSE(n, rhs, theCSETable, theFunction); if (rhs != null) localCSE(n, rhs, theCSETable, theFunction);
@ -544,7 +544,7 @@ public class Block {
if (baseChild.getType() == TokenStream.PRIMARY if (baseChild.getType() == TokenStream.PRIMARY
&& baseChild.getOperation() == TokenStream.THIS) && baseChild.getOperation() == TokenStream.THIS)
{ {
Node nameChild = baseChild.getNextSibling(); Node nameChild = baseChild.getNext();
if (nameChild.getType() == TokenStream.STRING) { if (nameChild.getType() == TokenStream.STRING) {
String theName = nameChild.getString(); String theName = nameChild.getString();
// System.out.println("considering " + theName); // System.out.println("considering " + theName);
@ -558,7 +558,7 @@ public class Block {
Node theCSE; Node theCSE;
if (cse instanceof CSEHolder) { if (cse instanceof CSEHolder) {
CSEHolder cseHolder = (CSEHolder)cse; CSEHolder cseHolder = (CSEHolder)cse;
Node nextChild = cseHolder.getPropChild.getNextSibling(); Node nextChild = cseHolder.getPropChild.getNext();
cseHolder.getPropParent.removeChild(cseHolder.getPropChild); cseHolder.getPropParent.removeChild(cseHolder.getPropChild);
theCSE = itsIRFactory.createNewLocal(cseHolder.getPropChild); theCSE = itsIRFactory.createNewLocal(cseHolder.getPropChild);
theFunction.incrementLocalCount(); theFunction.incrementLocalCount();
@ -570,7 +570,7 @@ public class Block {
} }
else else
theCSE = (Node)cse; theCSE = (Node)cse;
Node nextChild = n.getNextSibling(); Node nextChild = n.getNext();
parent.removeChild(n); parent.removeChild(n);
Node cseUse = itsIRFactory.createUseLocal(theCSE); Node cseUse = itsIRFactory.createUseLocal(theCSE);
if (nextChild == null) if (nextChild == null)
@ -585,8 +585,8 @@ public class Block {
break; break;
case TokenStream.SETELEM : { case TokenStream.SETELEM : {
Node lhsBase = n.getFirstChild(); Node lhsBase = n.getFirstChild();
Node lhsIndex = lhsBase.getNextSibling(); Node lhsIndex = lhsBase.getNext();
Node rhs = lhsIndex.getNextSibling(); Node rhs = lhsIndex.getNext();
if (lhsBase != null) localCSE(n, lhsBase, theCSETable, theFunction); if (lhsBase != null) localCSE(n, lhsBase, theCSETable, theFunction);
if (lhsIndex != null) localCSE(n, lhsIndex, theCSETable, theFunction); if (lhsIndex != null) localCSE(n, lhsIndex, theCSETable, theFunction);
if (rhs != null) localCSE(n, rhs, theCSETable, theFunction); if (rhs != null) localCSE(n, rhs, theCSETable, theFunction);
@ -598,7 +598,7 @@ public class Block {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
localCSE(n, child, theCSETable, theFunction); localCSE(n, child, theCSETable, theFunction);
child = child.getNextSibling(); child = child.getNext();
} }
theCSETable.clear(); theCSETable.clear();
//System.out.println("clear all at CALL"); //System.out.println("clear all at CALL");

Просмотреть файл

@ -141,7 +141,7 @@ public class Codegen extends Interpreter {
String name = onh.getJavaScriptClassName(null, true); String name = onh.getJavaScriptClassName(null, true);
ScriptableObject obj = new NativeObject(); ScriptableObject obj = new NativeObject();
for (Node cursor = tree.getFirstChild(); cursor != null; for (Node cursor = tree.getFirstChild(); cursor != null;
cursor = cursor.getNextSibling()) cursor = cursor.getNext())
{ {
if (cursor.getType() == TokenStream.FUNCTION) { if (cursor.getType() == TokenStream.FUNCTION) {
obj.put(cursor.getString(), obj, obj.put(cursor.getString(), obj,
@ -550,7 +550,7 @@ public class Codegen extends Interpreter {
visitStatement(node); visitStatement(node);
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
@ -566,7 +566,7 @@ public class Codegen extends Interpreter {
visitStatement(node); visitStatement(node);
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
break; break;
@ -619,12 +619,12 @@ public class Codegen extends Interpreter {
break; break;
case TokenStream.COMMA: { case TokenStream.COMMA: {
Node next = child.getNextSibling(); Node next = child.getNext();
while (next != null) { while (next != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
addByteCode(ByteCode.POP); addByteCode(ByteCode.POP);
child = next; child = next;
next = next.getNextSibling(); next = next.getNext();
} }
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
break; break;
@ -665,7 +665,7 @@ public class Codegen extends Interpreter {
else { else {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1)
addByteCode(ByteCode.POP2); addByteCode(ByteCode.POP2);
@ -678,7 +678,7 @@ public class Codegen extends Interpreter {
visitStatement(node); visitStatement(node);
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
astore(scriptResultLocal); astore(scriptResultLocal);
break; break;
@ -722,7 +722,7 @@ public class Codegen extends Interpreter {
else else
addByteCode(ByteCode.IFNE, falseTarget); addByteCode(ByteCode.IFNE, falseTarget);
addByteCode(ByteCode.POP); addByteCode(ByteCode.POP);
generateCodeFromNode(child.getNextSibling(), node, trueLabel, falseLabel); generateCodeFromNode(child.getNext(), node, trueLabel, falseLabel);
markLabel(falseTarget); markLabel(falseTarget);
} }
else { else {
@ -747,7 +747,7 @@ public class Codegen extends Interpreter {
} }
} }
markLabel(interLabel); markLabel(interLabel);
child = child.getNextSibling(); child = child.getNext();
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
if (!childIsBoolean(child)) { if (!childIsBoolean(child)) {
addScriptRuntimeInvoke("toBoolean", addScriptRuntimeInvoke("toBoolean",
@ -761,7 +761,7 @@ public class Codegen extends Interpreter {
case TokenStream.ADD: { case TokenStream.ADD: {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
generateCodeFromNode(child.getNextSibling(), generateCodeFromNode(child.getNext(),
node, trueLabel, falseLabel); node, trueLabel, falseLabel);
switch (node.getIntProp(Node.ISNUMBER_PROP, -1)) { switch (node.getIntProp(Node.ISNUMBER_PROP, -1)) {
case Node.BOTH: case Node.BOTH:
@ -871,7 +871,7 @@ public class Codegen extends Interpreter {
case TokenStream.GETELEM: case TokenStream.GETELEM:
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) { if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) {
@ -912,7 +912,7 @@ public class Codegen extends Interpreter {
case TokenStream.SETELEM: case TokenStream.SETELEM:
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) { if (node.getIntProp(Node.ISNUMBER_PROP, -1) != -1) {
@ -932,7 +932,7 @@ public class Codegen extends Interpreter {
case TokenStream.DELPROP: case TokenStream.DELPROP:
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, trueLabel, falseLabel); generateCodeFromNode(child, node, trueLabel, falseLabel);
child = child.getNextSibling(); child = child.getNext();
} }
addScriptRuntimeInvoke("delete", addScriptRuntimeInvoke("delete",
"(Ljava/lang/Object;Ljava/lang/Object;)", "(Ljava/lang/Object;Ljava/lang/Object;)",
@ -1663,7 +1663,7 @@ public class Codegen extends Interpreter {
else { else {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
if (type == TokenStream.JSR) if (type == TokenStream.JSR)
addByteCode(ByteCode.JSR, targetLabel); addByteCode(ByteCode.JSR, targetLabel);
@ -1676,7 +1676,7 @@ public class Codegen extends Interpreter {
private void visitEnumInit(Node node, Node child) { private void visitEnumInit(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
addScriptRuntimeInvoke("initEnum", addScriptRuntimeInvoke("initEnum",
@ -1690,7 +1690,7 @@ public class Codegen extends Interpreter {
private void visitEnumNext(Node node, Node child) { private void visitEnumNext(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
Node init = (Node) node.getProp(Node.ENUM_PROP); Node init = (Node) node.getProp(Node.ENUM_PROP);
int local = init.getExistingIntProp(Node.LOCAL_PROP); int local = init.getExistingIntProp(Node.LOCAL_PROP);
@ -1701,7 +1701,7 @@ public class Codegen extends Interpreter {
private void visitEnumDone(Node node, Node child) { private void visitEnumDone(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
Node init = (Node) node.getProp(Node.ENUM_PROP); Node init = (Node) node.getProp(Node.ENUM_PROP);
int local = init.getExistingIntProp(Node.LOCAL_PROP); int local = init.getExistingIntProp(Node.LOCAL_PROP);
@ -1711,7 +1711,7 @@ public class Codegen extends Interpreter {
private void visitEnterWith(Node node, Node child) { private void visitEnterWith(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
addScriptRuntimeInvoke("enterWith", addScriptRuntimeInvoke("enterWith",
@ -1737,7 +1737,7 @@ public class Codegen extends Interpreter {
Node child = node.getFirstChild(); Node child = node.getFirstChild();
while (child != null) { while (child != null) {
resetTargets(child); resetTargets(child);
child = child.getNextSibling(); child = child.getNext();
} }
} }
@ -1781,7 +1781,7 @@ public class Codegen extends Interpreter {
if (type == TokenStream.NEW) if (type == TokenStream.NEW)
addByteCode(ByteCode.ACONST_NULL); addByteCode(ByteCode.ACONST_NULL);
else { else {
child = child.getNextSibling(); child = child.getNext();
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
} }
/* /*
@ -1791,7 +1791,7 @@ public class Codegen extends Interpreter {
in the aReg and the number is the dReg in the aReg and the number is the dReg
Else pass the JS object in the aReg and 0.0 in 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) { while (child != null) {
boolean handled = false; boolean handled = false;
if ((child.getType() == TokenStream.GETVAR) if ((child.getType() == TokenStream.GETVAR)
@ -1820,7 +1820,7 @@ public class Codegen extends Interpreter {
} }
} }
resetTargets(child); resetTargets(child);
child = child.getNextSibling(); child = child.getNext();
} }
addByteCode(ByteCode.ALOAD_0); addByteCode(ByteCode.ALOAD_0);
@ -1876,14 +1876,14 @@ public class Codegen extends Interpreter {
if (callBase.getType() == TokenStream.GETPROP) { if (callBase.getType() == TokenStream.GETPROP) {
Node callBaseChild = callBase.getFirstChild(); Node callBaseChild = callBase.getFirstChild();
if (callBaseChild.getType() == TokenStream.NEWTEMP) { if (callBaseChild.getType() == TokenStream.NEWTEMP) {
Node callBaseID = callBaseChild.getNextSibling(); Node callBaseID = callBaseChild.getNext();
Node tempChild = callBaseChild.getFirstChild(); Node tempChild = callBaseChild.getFirstChild();
if (tempChild.getType() == TokenStream.GETBASE) { if (tempChild.getType() == TokenStream.GETBASE) {
String functionName = tempChild.getString(); String functionName = tempChild.getString();
if ((callBaseID != null) && if ((callBaseID != null) &&
(callBaseID.getType() == TokenStream.STRING)) { (callBaseID.getType() == TokenStream.STRING)) {
if (functionName.equals(callBaseID.getString())) { if (functionName.equals(callBaseID.getString())) {
Node thisChild = callBase.getNextSibling(); Node thisChild = callBase.getNext();
if (thisChild.getType() == TokenStream.GETTHIS) { if (thisChild.getType() == TokenStream.GETTHIS) {
Node useChild = thisChild.getFirstChild(); Node useChild = thisChild.getFirstChild();
if (useChild.getType() == TokenStream.USETEMP) { if (useChild.getType() == TokenStream.USETEMP) {
@ -1950,7 +1950,7 @@ public class Codegen extends Interpreter {
int argSkipCount = (type == TokenStream.NEW) ? 1 : 2; int argSkipCount = (type == TokenStream.NEW) ? 1 : 2;
while (child != null) { while (child != null) {
childCount++; childCount++;
child = child.getNextSibling(); child = child.getNext();
} }
child = chelsea; // re-start the iterator from the first child, child = chelsea; // re-start the iterator from the first child,
@ -1958,7 +1958,7 @@ public class Codegen extends Interpreter {
int argIndex = -argSkipCount; int argIndex = -argSkipCount;
if (firstArgDone && (child != null)) { if (firstArgDone && (child != null)) {
child = child.getNextSibling(); child = child.getNext();
argIndex++; argIndex++;
aload(contextLocal); aload(contextLocal);
addByteCode(ByteCode.SWAP); addByteCode(ByteCode.SWAP);
@ -1978,7 +1978,7 @@ public class Codegen extends Interpreter {
isSimpleCall = true; isSimpleCall = true;
push(simpleCallName); push(simpleCallName);
aload(variableObjectLocal); aload(variableObjectLocal);
child = child.getNextSibling().getNextSibling(); child = child.getNext().getNext();
argIndex = 0; argIndex = 0;
push(childCount - argSkipCount); push(childCount - argSkipCount);
addByteCode(ByteCode.ANEWARRAY, "java/lang/Object"); addByteCode(ByteCode.ANEWARRAY, "java/lang/Object");
@ -2034,7 +2034,7 @@ public class Codegen extends Interpreter {
// instead ? // instead ?
constructArgArray(childCount - argSkipCount); constructArgArray(childCount - argSkipCount);
} }
child = child.getNextSibling(); child = child.getNext();
} }
String className; String className;
@ -2145,7 +2145,7 @@ public class Codegen extends Interpreter {
visitStatement(node); visitStatement(node);
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
Node catchTarget = (Node)node.getProp(Node.TARGET_PROP); Node catchTarget = (Node)node.getProp(Node.TARGET_PROP);
@ -2275,7 +2275,7 @@ public class Codegen extends Interpreter {
visitStatement(node); visitStatement(node);
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
addByteCode(ByteCode.NEW, addByteCode(ByteCode.NEW,
@ -2293,7 +2293,7 @@ public class Codegen extends Interpreter {
if (child != null) { if (child != null) {
do { do {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} while (child != null); } while (child != null);
} else if (inFunction) { } else if (inFunction) {
pushUndefined(); pushUndefined();
@ -2310,7 +2310,7 @@ public class Codegen extends Interpreter {
visitStatement(node); visitStatement(node);
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
// save selector value // save selector value
@ -2499,7 +2499,7 @@ public class Codegen extends Interpreter {
if (child.getType() == TokenStream.GETPROP) { if (child.getType() == TokenStream.GETPROP) {
Node getPropChild = child.getFirstChild(); Node getPropChild = child.getFirstChild();
generateCodeFromNode(getPropChild, node, -1, -1); generateCodeFromNode(getPropChild, node, -1, -1);
generateCodeFromNode(getPropChild.getNextSibling(), node, -1, -1); generateCodeFromNode(getPropChild.getNext(), node, -1, -1);
aload(variableObjectLocal); aload(variableObjectLocal);
addScriptRuntimeInvoke(routine, addScriptRuntimeInvoke(routine,
"(Ljava/lang/Object;Ljava/lang/String;" + "(Ljava/lang/Object;Ljava/lang/String;" +
@ -2511,7 +2511,7 @@ public class Codegen extends Interpreter {
routine += "Elem"; routine += "Elem";
Node getPropChild = child.getFirstChild(); Node getPropChild = child.getFirstChild();
generateCodeFromNode(getPropChild, node, -1, -1); generateCodeFromNode(getPropChild, node, -1, -1);
generateCodeFromNode(getPropChild.getNextSibling(), node, -1, -1); generateCodeFromNode(getPropChild.getNext(), node, -1, -1);
aload(variableObjectLocal); aload(variableObjectLocal);
addScriptRuntimeInvoke(routine, addScriptRuntimeInvoke(routine,
"(Ljava/lang/Object;Ljava/lang/Object;" + "(Ljava/lang/Object;Ljava/lang/Object;" +
@ -2544,7 +2544,7 @@ public class Codegen extends Interpreter {
int childNumberFlag = node.getIntProp(Node.ISNUMBER_PROP, -1); int childNumberFlag = node.getIntProp(Node.ISNUMBER_PROP, -1);
if (childNumberFlag != -1) { if (childNumberFlag != -1) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
addByteCode(opCode); addByteCode(opCode);
} }
else { else {
@ -2556,8 +2556,8 @@ public class Codegen extends Interpreter {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
if (!isArithmeticNode(child)) if (!isArithmeticNode(child))
addScriptRuntimeInvoke("toNumber", "(Ljava/lang/Object;)", "D"); addScriptRuntimeInvoke("toNumber", "(Ljava/lang/Object;)", "D");
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
if (!isArithmeticNode(child.getNextSibling())) if (!isArithmeticNode(child.getNext()))
addScriptRuntimeInvoke("toNumber", "(Ljava/lang/Object;)", "D"); addScriptRuntimeInvoke("toNumber", "(Ljava/lang/Object;)", "D");
addByteCode(opCode); addByteCode(opCode);
if (!childOfArithmetic) { if (!childOfArithmetic) {
@ -2579,7 +2579,7 @@ public class Codegen extends Interpreter {
// toUint32 instead of toInt32. // toUint32 instead of toInt32.
if (type == TokenStream.URSH) { if (type == TokenStream.URSH) {
addScriptRuntimeInvoke("toUint32", "(Ljava/lang/Object;)", "J"); addScriptRuntimeInvoke("toUint32", "(Ljava/lang/Object;)", "J");
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I"); addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I");
// Looks like we need to explicitly mask the shift to 5 bits - // Looks like we need to explicitly mask the shift to 5 bits -
// LUSHR takes 6 bits. // LUSHR takes 6 bits.
@ -2592,12 +2592,12 @@ public class Codegen extends Interpreter {
} }
if (childNumberFlag == -1) { if (childNumberFlag == -1) {
addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I"); addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I");
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I"); addScriptRuntimeInvoke("toInt32", "(Ljava/lang/Object;)", "I");
} }
else { else {
addScriptRuntimeInvoke("toInt32", "(D)", "I"); addScriptRuntimeInvoke("toInt32", "(D)", "I");
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
addScriptRuntimeInvoke("toInt32", "(D)", "I"); addScriptRuntimeInvoke("toInt32", "(D)", "I");
} }
switch (type) { switch (type) {
@ -2668,14 +2668,14 @@ public class Codegen extends Interpreter {
int childNumberFlag = node.getIntProp(Node.ISNUMBER_PROP, -1); int childNumberFlag = node.getIntProp(Node.ISNUMBER_PROP, -1);
if (childNumberFlag == Node.BOTH) { if (childNumberFlag == Node.BOTH) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
genSimpleCompare(op, trueGOTO, falseGOTO); genSimpleCompare(op, trueGOTO, falseGOTO);
} }
else { else {
if (op == TokenStream.INSTANCEOF) { if (op == TokenStream.INSTANCEOF) {
aload(variableObjectLocal); aload(variableObjectLocal);
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
addScriptRuntimeInvoke("instanceOf", addScriptRuntimeInvoke("instanceOf",
"(Lorg/mozilla/javascript/Scriptable;"+ "(Lorg/mozilla/javascript/Scriptable;"+
"Ljava/lang/Object;Ljava/lang/Object;)", "Z"); "Ljava/lang/Object;Ljava/lang/Object;)", "Z");
@ -2683,7 +2683,7 @@ public class Codegen extends Interpreter {
addByteCode(ByteCode.GOTO, falseGOTO); addByteCode(ByteCode.GOTO, falseGOTO);
} else if (op == TokenStream.IN) { } else if (op == TokenStream.IN) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
aload(variableObjectLocal); aload(variableObjectLocal);
addScriptRuntimeInvoke("in", addScriptRuntimeInvoke("in",
"(Ljava/lang/Object;Ljava/lang/Object;"+ "(Ljava/lang/Object;Ljava/lang/Object;"+
@ -2691,7 +2691,7 @@ public class Codegen extends Interpreter {
addByteCode(ByteCode.IFNE, trueGOTO); addByteCode(ByteCode.IFNE, trueGOTO);
addByteCode(ByteCode.GOTO, falseGOTO); addByteCode(ByteCode.GOTO, falseGOTO);
} else { } else {
Node rChild = child.getNextSibling(); Node rChild = child.getNext();
boolean leftIsDCP = nodeIsDirectCallParameter(child); boolean leftIsDCP = nodeIsDirectCallParameter(child);
boolean rightIsDCP = nodeIsDirectCallParameter(rChild); boolean rightIsDCP = nodeIsDirectCallParameter(rChild);
if (leftIsDCP || rightIsDCP) { if (leftIsDCP || rightIsDCP) {
@ -2813,7 +2813,7 @@ public class Codegen extends Interpreter {
if (op == TokenStream.INSTANCEOF) if (op == TokenStream.INSTANCEOF)
aload(variableObjectLocal); aload(variableObjectLocal);
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
int trueGOTO = acquireLabel(); int trueGOTO = acquireLabel();
int skip = acquireLabel(); int skip = acquireLabel();
if (op == TokenStream.INSTANCEOF) { if (op == TokenStream.INSTANCEOF) {
@ -2847,7 +2847,7 @@ public class Codegen extends Interpreter {
String routine = ((op == TokenStream.LT) String routine = ((op == TokenStream.LT)
|| (op == TokenStream.GT)) ? "cmp_LTB" : "cmp_LEB"; || (op == TokenStream.GT)) ? "cmp_LTB" : "cmp_LEB";
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
if (childNumberFlag == -1) { if (childNumberFlag == -1) {
if (op == TokenStream.GE || op == TokenStream.GT) { if (op == TokenStream.GE || op == TokenStream.GT) {
addByteCode(ByteCode.SWAP); addByteCode(ByteCode.SWAP);
@ -2898,7 +2898,7 @@ public class Codegen extends Interpreter {
int falseGOTO) int falseGOTO)
{ {
int op = node.getOperation(); int op = node.getOperation();
Node rightChild = child.getNextSibling(); Node rightChild = child.getNext();
boolean isStrict = op == TokenStream.SHEQ || boolean isStrict = op == TokenStream.SHEQ ||
op == TokenStream.SHNE; op == TokenStream.SHNE;
if (trueGOTO == -1) { if (trueGOTO == -1) {
@ -2936,7 +2936,7 @@ public class Codegen extends Interpreter {
} }
generateCodeFromNode(child, node, -1, -1); 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 != // JavaScript 1.2 uses shallow equality for == and !=
String name; String name;
@ -3008,7 +3008,7 @@ public class Codegen extends Interpreter {
return; return;
} }
Node rChild = child.getNextSibling(); Node rChild = child.getNext();
if (nodeIsDirectCallParameter(child)) { if (nodeIsDirectCallParameter(child)) {
Node convertChild = getConvertToObjectOfNumberNode(rChild); Node convertChild = getConvertToObjectOfNumberNode(rChild);
@ -3227,7 +3227,7 @@ public class Codegen extends Interpreter {
String name = node.getFirstChild().getString(); String name = node.getFirstChild().getString();
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
push(name); push(name);
@ -3315,7 +3315,7 @@ public class Codegen extends Interpreter {
if (hasVarsInRegs && lVar == null) if (hasVarsInRegs && lVar == null)
lVar = OptLocalVariable.get(vars, child.getString()); lVar = OptLocalVariable.get(vars, child.getString());
if (lVar != null) { if (lVar != null) {
generateCodeFromNode(child.getNextSibling(), node, -1, -1); generateCodeFromNode(child.getNext(), node, -1, -1);
if (lVar.getJRegister() == -1) { if (lVar.getJRegister() == -1) {
if (lVar.isNumber()) if (lVar.isNumber())
lVar.assignJRegister(getNewWordPairLocal()); lVar.assignJRegister(getNewWordPairLocal());
@ -3378,7 +3378,7 @@ public class Codegen extends Interpreter {
if (s != null) { if (s != null) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
String runtimeMethod = null; String runtimeMethod = null;
@ -3394,7 +3394,7 @@ public class Codegen extends Interpreter {
"Lorg/mozilla/javascript/Scriptable;"); "Lorg/mozilla/javascript/Scriptable;");
return; return;
} }
Node nameChild = child.getNextSibling(); Node nameChild = child.getNext();
/* /*
for 'this.foo' we call thisGet which can skip some for 'this.foo' we call thisGet which can skip some
casting overhead. casting overhead.
@ -3438,7 +3438,7 @@ public class Codegen extends Interpreter {
if (s != null) { if (s != null) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
String runtimeMethod = null; String runtimeMethod = null;
@ -3457,7 +3457,7 @@ public class Codegen extends Interpreter {
} }
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
aload(variableObjectLocal); aload(variableObjectLocal);
addScriptRuntimeInvoke("setProp", addScriptRuntimeInvoke("setProp",
@ -3469,7 +3469,7 @@ public class Codegen extends Interpreter {
private void visitBind(Node node, int type, Node child) { private void visitBind(Node node, int type, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
// Generate code for "ScriptRuntime.bind(varObj, "s")" // Generate code for "ScriptRuntime.bind(varObj, "s")"
aload(variableObjectLocal); // get variable object aload(variableObjectLocal); // get variable object
@ -3497,7 +3497,7 @@ public class Codegen extends Interpreter {
private void visitNewTemp(Node node, Node child) { private void visitNewTemp(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
short local = getLocalFromNode(node); short local = getLocalFromNode(node);
addByteCode(ByteCode.DUP); addByteCode(ByteCode.DUP);
@ -3509,7 +3509,7 @@ public class Codegen extends Interpreter {
private void visitUseTemp(Node node, Node child) { private void visitUseTemp(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
Node temp = (Node) node.getProp(Node.TEMP_PROP); Node temp = (Node) node.getProp(Node.TEMP_PROP);
short local = getLocalFromNode(temp); short local = getLocalFromNode(temp);
@ -3532,7 +3532,7 @@ public class Codegen extends Interpreter {
private void visitNewLocal(Node node, Node child) { private void visitNewLocal(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
short local = getLocalFromNode(node); short local = getLocalFromNode(node);
addByteCode(ByteCode.DUP); addByteCode(ByteCode.DUP);
@ -3542,7 +3542,7 @@ public class Codegen extends Interpreter {
private void visitUseLocal(Node node, Node child) { private void visitUseLocal(Node node, Node child) {
while (child != null) { while (child != null) {
generateCodeFromNode(child, node, -1, -1); generateCodeFromNode(child, node, -1, -1);
child = child.getNextSibling(); child = child.getNext();
} }
Node temp = (Node) node.getProp(Node.LOCAL_PROP); Node temp = (Node) node.getProp(Node.LOCAL_PROP);
short local = getLocalFromNode(temp); short local = getLocalFromNode(temp);

Просмотреть файл

@ -80,9 +80,9 @@ class OptTransformer extends NodeTransformer {
// count the arguments // count the arguments
int argCount = 0; int argCount = 0;
Node arg = left.getNextSibling(); Node arg = left.getNext();
while (arg != null) { while (arg != null) {
arg = arg.getNextSibling(); arg = arg.getNext();
argCount++; argCount++;
} }
@ -91,7 +91,7 @@ class OptTransformer extends NodeTransformer {
markDirectCall(tree, node, argCount, left.getString()); markDirectCall(tree, node, argCount, left.getString());
} else { } else {
if (left.getType() == TokenStream.GETPROP) { if (left.getType() == TokenStream.GETPROP) {
Node name = left.getFirstChild().getNextSibling(); Node name = left.getFirstChild().getNext();
markDirectCall(tree, node, argCount, name.getString()); markDirectCall(tree, node, argCount, name.getString());
} }
} }
@ -157,7 +157,7 @@ class OptTransformer extends NodeTransformer {
* count for any call it encounters * count for any call it encounters
*/ */
void collectContainedFunctions(Node node) { 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) { if (tNode.getType() == TokenStream.FUNCTION) {
FunctionNode fnNode = (FunctionNode) FunctionNode fnNode = (FunctionNode)
tNode.getProp(Node.FUNCTION_PROP); tNode.getProp(Node.FUNCTION_PROP);

Просмотреть файл

@ -415,7 +415,7 @@ public class Optimizer {
} }
case TokenStream.SETVAR : { case TokenStream.SETVAR : {
Node lChild = n.getFirstChild(); Node lChild = n.getFirstChild();
Node rChild = lChild.getNextSibling(); Node rChild = lChild.getNext();
int rType = rewriteForNumberVariables(rChild); int rType = rewriteForNumberVariables(rChild);
OptLocalVariable theVar OptLocalVariable theVar
= (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP)); = (OptLocalVariable)(n.getProp(Node.VARIABLE_PROP));
@ -458,7 +458,7 @@ public class Optimizer {
} }
case TokenStream.RELOP : { case TokenStream.RELOP : {
Node lChild = n.getFirstChild(); Node lChild = n.getFirstChild();
Node rChild = lChild.getNextSibling(); Node rChild = lChild.getNext();
int lType = rewriteForNumberVariables(lChild); int lType = rewriteForNumberVariables(lChild);
int rType = rewriteForNumberVariables(rChild); int rType = rewriteForNumberVariables(rChild);
markDCPNumberContext(lChild); markDCPNumberContext(lChild);
@ -528,7 +528,7 @@ public class Optimizer {
case TokenStream.ADD : { case TokenStream.ADD : {
Node lChild = n.getFirstChild(); Node lChild = n.getFirstChild();
Node rChild = lChild.getNextSibling(); Node rChild = lChild.getNext();
int lType = rewriteForNumberVariables(lChild); int lType = rewriteForNumberVariables(lChild);
int rType = rewriteForNumberVariables(rChild); int rType = rewriteForNumberVariables(rChild);
@ -580,7 +580,7 @@ public class Optimizer {
case TokenStream.DIV : case TokenStream.DIV :
case TokenStream.MOD : { case TokenStream.MOD : {
Node lChild = n.getFirstChild(); Node lChild = n.getFirstChild();
Node rChild = lChild.getNextSibling(); Node rChild = lChild.getNext();
int lType = rewriteForNumberVariables(lChild); int lType = rewriteForNumberVariables(lChild);
int rType = rewriteForNumberVariables(rChild); int rType = rewriteForNumberVariables(rChild);
markDCPNumberContext(lChild); markDCPNumberContext(lChild);
@ -632,8 +632,8 @@ public class Optimizer {
} }
case TokenStream.SETELEM : { case TokenStream.SETELEM : {
Node arrayBase = n.getFirstChild(); Node arrayBase = n.getFirstChild();
Node arrayIndex = arrayBase.getNextSibling(); Node arrayIndex = arrayBase.getNext();
Node rValue = arrayIndex.getNextSibling(); Node rValue = arrayIndex.getNext();
int baseType = rewriteForNumberVariables(arrayBase); int baseType = rewriteForNumberVariables(arrayBase);
if (baseType == TypeEvent.NumberType) {// can never happen ??? if (baseType == TypeEvent.NumberType) {// can never happen ???
if (!convertParameter(arrayBase)) { if (!convertParameter(arrayBase)) {
@ -664,7 +664,7 @@ public class Optimizer {
} }
case TokenStream.GETELEM : { case TokenStream.GETELEM : {
Node arrayBase = n.getFirstChild(); Node arrayBase = n.getFirstChild();
Node arrayIndex = arrayBase.getNextSibling(); Node arrayIndex = arrayBase.getNext();
int baseType = rewriteForNumberVariables(arrayBase); int baseType = rewriteForNumberVariables(arrayBase);
if (baseType == TypeEvent.NumberType) {// can never happen ??? if (baseType == TypeEvent.NumberType) {// can never happen ???
if (!convertParameter(arrayBase)) { if (!convertParameter(arrayBase)) {
@ -695,15 +695,15 @@ public class Optimizer {
*/ */
Node child = n.getFirstChild(); // the function Node child = n.getFirstChild(); // the function
rewriteForNumberVariables(child); rewriteForNumberVariables(child);
child = child.getNextSibling(); // the 'this' object child = child.getNext(); // the 'this' object
rewriteForNumberVariables(child); rewriteForNumberVariables(child);
child = child.getNextSibling(); // the first arg child = child.getNext(); // the first arg
while (child != null) { while (child != null) {
int type = rewriteForNumberVariables(child); int type = rewriteForNumberVariables(child);
if (type == TypeEvent.NumberType) { if (type == TypeEvent.NumberType) {
markDCPNumberContext(child); markDCPNumberContext(child);
} }
child = child.getNextSibling(); child = child.getNext();
} }
return TypeEvent.NoType; return TypeEvent.NoType;
} }
@ -712,7 +712,7 @@ public class Optimizer {
default : { default : {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
Node nextChild = child.getNextSibling(); Node nextChild = child.getNext();
int type = rewriteForNumberVariables(child); int type = rewriteForNumberVariables(child);
if (type == TypeEvent.NumberType) { if (type == TypeEvent.NumberType) {
if (!convertParameter(child)) { if (!convertParameter(child)) {
@ -743,7 +743,7 @@ public class Optimizer {
if(lChild == null){ // no children -- exit if(lChild == null){ // no children -- exit
return; return;
}else{ }else{
rChild = lChild.getNextSibling(); rChild = lChild.getNext();
if(rChild == null){ if(rChild == null){
foldConstants(lChild, n); // one child -- recurse foldConstants(lChild, n); // one child -- recurse
@ -756,10 +756,10 @@ public class Optimizer {
foldConstants(rChild, n); foldConstants(rChild, n);
/* take care of all the other children */ /* take care of all the other children */
Node child = rChild.getNextSibling(); Node child = rChild.getNext();
while (child != null) { while (child != null) {
foldConstants(child, n); foldConstants(child, n);
child = child.getNextSibling(); child = child.getNext();
} }
@ -768,7 +768,7 @@ public class Optimizer {
if(lChild == null){ // no children -- exit if(lChild == null){ // no children -- exit
return; return;
}else{ }else{
rChild = lChild.getNextSibling(); rChild = lChild.getNext();
if(rChild == null){ if(rChild == null){
return; return;
@ -937,11 +937,11 @@ public class Optimizer {
if (definedBoolean == ALWAYS_FALSE_BOOLEAN) { if (definedBoolean == ALWAYS_FALSE_BOOLEAN) {
//if(false) -> replace by the else clause if it exists //if(false) -> replace by the else clause if it exists
Node next1 = rChild.getNextSibling(); Node next1 = rChild.getNext();
if (next1 != null) { if (next1 != null) {
Node next2 = next1.getNextSibling(); Node next2 = next1.getNext();
if (next2 != null) { if (next2 != null) {
Node next3 = next2.getNextSibling(); Node next3 = next2.getNext();
if (next3 != null) { if (next3 != null) {
Node elseClause = next3.getFirstChild(); Node elseClause = next3.getFirstChild();
if (elseClause != null) { if (elseClause != null) {
@ -1004,7 +1004,7 @@ public class Optimizer {
Node child = n.getFirstChild(); Node child = n.getFirstChild();
while (child != null) { while (child != null) {
replaceVariableAccess(child, theVariables); replaceVariableAccess(child, theVariables);
child = child.getNextSibling(); child = child.getNext();
} }
switch (n.getType()) { switch (n.getType()) {
case TokenStream.SETVAR : { case TokenStream.SETVAR : {

Просмотреть файл

@ -49,20 +49,22 @@ public class StmtNodeIterator {
private Node findFirstInterestingNode(Node theNode) private Node findFirstInterestingNode(Node theNode)
{ {
if (theNode == null) return null; while (theNode != null) {
int type = theNode.getType();
if ((theNode.getType() == TokenStream.BLOCK) if (type == TokenStream.BLOCK || type == TokenStream.LOOP
|| (theNode.getType() == TokenStream.LOOP) || type == TokenStream.FUNCTION)
|| (theNode.getType() == TokenStream.FUNCTION)) { {
if (theNode.getFirst() == null) { Node first = theNode.getFirstChild();
return findFirstInterestingNode(theNode.getNext()); if (first == null) {
} theNode = theNode.getNext();
else { } else {
itsStack.push(theNode); itsStack.push(theNode);
return findFirstInterestingNode(theNode.getFirst()); theNode = first;
}
} else {
break;
} }
} }
else
return theNode; return theNode;
} }
@ -75,14 +77,17 @@ public class StmtNodeIterator {
if (itsCurrentNode == null) { if (itsCurrentNode == null) {
while ( ! itsStack.isEmpty()) { while ( ! itsStack.isEmpty()) {
Node n = (Node)(itsStack.pop()); Node n = (Node)(itsStack.pop());
if (n.getNext() != null) { Node next = n.getNext();
return itsCurrentNode = findFirstInterestingNode(n.getNext()); if (next != null) {
itsCurrentNode = findFirstInterestingNode(next);
return itsCurrentNode;
} }
} }
return null; return null;
} else {
itsCurrentNode = findFirstInterestingNode(itsCurrentNode);
return itsCurrentNode;
} }
else
return itsCurrentNode = findFirstInterestingNode(itsCurrentNode);
} }
private ObjArray itsStack = new ObjArray(); private ObjArray itsStack = new ObjArray();