Mercurial > hg > graal-jvmci-8
changeset 19823:a71b0398f8c7
fix race in expansion of superclass iterableIds
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Thu, 12 Mar 2015 12:15:06 -0700 |
parents | 7ee442766685 |
children | 8b7a143aea6b 2fcc5ea8c110 |
files | graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java |
diffstat | 1 files changed, 18 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Thu Mar 12 16:45:24 2015 +0100 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Thu Mar 12 12:15:06 2015 -0700 @@ -182,9 +182,7 @@ NodeClass<?> snc = superNodeClass; while (snc != null && IterableNodeType.class.isAssignableFrom(snc.getClazz())) { - assert !containsId(this.iterableId, snc.iterableIds); - snc.iterableIds = Arrays.copyOf(snc.iterableIds, snc.iterableIds.length + 1); - snc.iterableIds[snc.iterableIds.length - 1] = this.iterableId; + snc.addIterableId(iterableId); snc = snc.superNodeClass; } @@ -195,6 +193,23 @@ this.iterableIds = null; } nodeIterableCount = Debug.metric("NodeIterable_%s", clazz); + assert verifyIterableIds(); + } + + private synchronized void addIterableId(int newIterableId) { + assert !containsId(newIterableId, iterableIds); + int[] copy = Arrays.copyOf(iterableIds, iterableIds.length + 1); + copy[iterableIds.length] = newIterableId; + iterableIds = copy; + } + + private boolean verifyIterableIds() { + NodeClass<?> snc = superNodeClass; + while (snc != null && IterableNodeType.class.isAssignableFrom(snc.getClazz())) { + assert containsId(iterableId, snc.iterableIds); + snc = snc.superNodeClass; + } + return true; } private static boolean containsId(int iterableId, int[] iterableIds) {