changeset 12047:dcd412a084a2

NodeClassIterator: seperate implementation for modCount check
author Bernhard Urban <bernhard.urban@jku.at>
date Fri, 11 Oct 2013 00:18:41 +0200
parents c3a1d5bfc3ee
children 30ca2c3ad590
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java
diffstat 1 files changed, 108 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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<Node> {
 
         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