# HG changeset patch # User Doug Simon # Date 1411036091 -7200 # Node ID 3837c6aa9fd03e943597f78f19e1afee73665a4e # Parent 7a3f6543d383c691bdbd4644c6357015cf926a7a ensure NodeClass initialization follows class hierarchy order diff -r 7a3f6543d383 -r 3837c6aa9fd0 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 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 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;