changeset 7020:472609cc3e10

fixed implementation of HotSpotResolvedJavaType.findUniqueConcreteSubtype() for array types
author Doug Simon <doug.simon@oracle.com>
date Mon, 26 Nov 2012 11:22:26 +0100
parents 6838696d54ac
children be508977fb47 f31d374e8195
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java
diffstat 2 files changed, 22 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java	Mon Nov 26 11:21:18 2012 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaType.java	Mon Nov 26 11:22:26 2012 +0100
@@ -160,7 +160,7 @@
     @Override
     public ResolvedJavaType findUniqueConcreteSubtype() {
         if (isArrayClass()) {
-            return getComponentType().findUniqueConcreteSubtype() != null ? this : null;
+            return getComponentType().findUniqueConcreteSubtype() == getComponentType() ? this : null;
         } else {
             ResolvedJavaType subtype = (ResolvedJavaType) HotSpotGraalRuntime.getInstance().getCompilerToVM().getUniqueConcreteSubtype(this);
             assert subtype == null || !subtype.isInterface();
--- a/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java	Mon Nov 26 11:21:18 2012 +0100
+++ b/graal/com.oracle.graal.snippets.test/src/com/oracle/graal/snippets/InstanceOfTest.java	Mon Nov 26 11:22:26 2012 +0100
@@ -324,4 +324,25 @@
         }
         return b;
     }
+
+    abstract static class A {}
+    static class B extends A {}
+
+    public static boolean isArrayOfA(Object o) {
+        return o instanceof A[];
+    }
+
+    public static boolean isArrayOfB(Object o) {
+        return o instanceof A[];
+    }
+
+    @Test
+    public void testArray() {
+        Object bArray = new A[10];
+        Object aArray = new B[10];
+        test("isArrayOfA", aArray);
+        test("isArrayOfA", bArray);
+        test("isArrayOfB", aArray);
+        test("isArrayOfB", bArray);
+    }
 }