diff graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java @ 17148:3837c6aa9fd0

ensure NodeClass initialization follows class hierarchy order
author Doug Simon <doug.simon@oracle.com>
date Thu, 18 Sep 2014 12:28:11 +0200
parents 7a3f6543d383
children 63870b298b39
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Thu Sep 18 12:22:35 2014 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java	Thu Sep 18 12:28:11 2014 +0200
@@ -81,6 +81,11 @@
                                 assert value.genClass == c;
                             }
                         } else {
+                            Class<?> superclass = c.getSuperclass();
+                            if (superclass != NODE_CLASS) {
+                                // Ensure NodeClass for superclass exists
+                                get(superclass);
+                            }
                             value = new NodeClass(key);
                         }
                         Object old = allClasses.putIfAbsent(key, value);
@@ -248,30 +253,19 @@
         } else if (IterableNodeType.class.isAssignableFrom(clazz)) {
             ITERABLE_NODE_TYPES.increment();
             this.iterableId = nextIterableId++;
-            List<NodeClass> existingClasses = new LinkedList<>();
-            for (FieldIntrospection nodeClass : allClasses.values()) {
-                // There are duplicate entries in allClasses when using generated nodes
-                // hence the extra logic below guarded by USE_GENERATED_NODES
-                if (clazz.isAssignableFrom(nodeClass.getClazz())) {
-                    if (!USE_GENERATED_NODES || !existingClasses.contains(nodeClass)) {
-                        existingClasses.add((NodeClass) nodeClass);
-                    }
+
+            Class<?> superclass = clazz.getSuperclass();
+            while (superclass != NODE_CLASS) {
+                if (IterableNodeType.class.isAssignableFrom(superclass)) {
+                    NodeClass superNodeClass = NodeClass.get(superclass);
+                    assert !containsId(this.iterableId, superNodeClass.iterableIds);
+                    superNodeClass.iterableIds = Arrays.copyOf(superNodeClass.iterableIds, superNodeClass.iterableIds.length + 1);
+                    superNodeClass.iterableIds[superNodeClass.iterableIds.length - 1] = this.iterableId;
                 }
-                if (nodeClass.getClazz().isAssignableFrom(clazz) && IterableNodeType.class.isAssignableFrom(nodeClass.getClazz())) {
-                    NodeClass superNodeClass = (NodeClass) nodeClass;
-                    if (!containsId(this.iterableId, superNodeClass.iterableIds)) {
-                        superNodeClass.iterableIds = Arrays.copyOf(superNodeClass.iterableIds, superNodeClass.iterableIds.length + 1);
-                        superNodeClass.iterableIds[superNodeClass.iterableIds.length - 1] = this.iterableId;
-                    }
-                }
+                superclass = superclass.getSuperclass();
             }
-            int[] ids = new int[existingClasses.size() + 1];
-            ids[0] = iterableId;
-            int i = 1;
-            for (NodeClass other : existingClasses) {
-                ids[i++] = other.iterableId;
-            }
-            this.iterableIds = ids;
+
+            this.iterableIds = new int[]{iterableId};
         } else {
             this.iterableId = Node.NOT_ITERABLE;
             this.iterableIds = null;