# HG changeset patch # User Bernhard Urban # Date 1381443521 -7200 # Node ID dcd412a084a2b253990b83cd2cf53373e49b6513 # Parent c3a1d5bfc3eee12f139d5dfabb75744ec1d749f7 NodeClassIterator: seperate implementation for modCount check diff -r c3a1d5bfc3ee -r dcd412a084a2 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Thu Oct 10 22:29:47 2013 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Fri Oct 11 00:18:41 2013 +0200 @@ -457,8 +457,7 @@ public abstract static class NodeClassIterator implements Iterator { private final NodeClass nodeClass; - private final Node node; - private final int modCount; + protected final Node node; private int index; private int subIndex; @@ -467,16 +466,14 @@ * * @param node the node which contains the fields. */ - protected NodeClassIterator(Node node) { + NodeClassIterator(Node node) { this.node = node; this.nodeClass = node.getNodeClass(); - this.modCount = MODIFICATION_COUNTS_ENABLED ? node.modCount() : 0; index = NOT_ITERABLE; subIndex = 0; - forward(); } - private void forward() { + void forward() { if (index < getDirectCount()) { index++; while (index < getDirectCount()) { @@ -514,11 +511,7 @@ @Override public boolean hasNext() { - try { - return index < getOffsets().length; - } finally { - assert modCount == node.modCount() : "must not be modified"; - } + return index < getOffsets().length; } @Override @@ -527,7 +520,6 @@ return nextElement(); } finally { forward(); - assert modCount == node.modCount(); } } @@ -540,7 +532,6 @@ } } finally { forward(); - assert modCount == node.modCount(); } } @@ -554,9 +545,16 @@ protected abstract long[] getOffsets(); } - private final class NodeClassInputsIterator extends NodeClassIterator { - private NodeClassInputsIterator(Node node) { + private class NodeClassInputsIterator extends NodeClassIterator { + NodeClassInputsIterator(Node node) { + this(node, true); + } + + NodeClassInputsIterator(Node node, boolean forward) { super(node); + if (forward) { + forward(); + } } @Override @@ -570,9 +568,54 @@ } } - private final class NodeClassSuccessorsIterator extends NodeClassIterator { - private NodeClassSuccessorsIterator(Node node) { + private final class NodeClassInputsWithModCountIterator extends NodeClassInputsIterator { + private final int modCount; + + private NodeClassInputsWithModCountIterator(Node node) { + super(node, false); + assert MODIFICATION_COUNTS_ENABLED; + this.modCount = node.modCount(); + forward(); + } + + @Override + public boolean hasNext() { + try { + return super.hasNext(); + } finally { + assert modCount == node.modCount() : "must not be modified"; + } + } + + @Override + public Node next() { + try { + return super.next(); + } finally { + assert modCount == node.modCount() : "must not be modified"; + } + } + + @Override + public Position nextPosition() { + try { + return super.nextPosition(); + } finally { + assert modCount == node.modCount(); + } + } + } + + private class NodeClassSuccessorsIterator extends NodeClassIterator { + NodeClassSuccessorsIterator(Node node) { + this(node, true); + } + + NodeClassSuccessorsIterator(Node node, boolean forward) { super(node); + if (forward) { + forward(); + } } @Override @@ -586,6 +629,44 @@ } } + private final class NodeClassSuccessorsWithModCountIterator extends NodeClassSuccessorsIterator { + private final int modCount; + + private NodeClassSuccessorsWithModCountIterator(Node node) { + super(node, false); + assert MODIFICATION_COUNTS_ENABLED; + this.modCount = node.modCount(); + forward(); + } + + @Override + public boolean hasNext() { + try { + return super.hasNext(); + } finally { + assert modCount == node.modCount() : "must not be modified"; + } + } + + @Override + public Node next() { + try { + return super.next(); + } finally { + assert modCount == node.modCount() : "must not be modified"; + } + } + + @Override + public Position nextPosition() { + try { + return super.nextPosition(); + } finally { + assert modCount == node.modCount(); + } + } + } + public int valueNumber(Node n) { int number = 0; if (canGVN) { @@ -837,7 +918,11 @@ @Override public NodeClassIterator iterator() { - return new NodeClassInputsIterator(node); + if (MODIFICATION_COUNTS_ENABLED) { + return new NodeClassInputsWithModCountIterator(node); + } else { + return new NodeClassInputsIterator(node); + } } @Override @@ -853,7 +938,11 @@ @Override public NodeClassIterator iterator() { - return new NodeClassSuccessorsIterator(node); + if (MODIFICATION_COUNTS_ENABLED) { + return new NodeClassSuccessorsWithModCountIterator(node); + } else { + return new NodeClassSuccessorsIterator(node); + } } @Override