Mercurial > hg > graal-jvmci-8
changeset 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 | 0a35e2789735 |
files | graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java |
diffstat | 1 files changed, 16 insertions(+), 22 deletions(-) [+] |
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;