Mercurial > hg > graal-jvmci-8
changeset 23338:a3471785190d
findLeafConcreteSubtype should handle arrays of leaf concrete subtype
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Fri, 25 Mar 2016 14:08:23 -0700 |
parents | 62804a7d3877 |
children | 13d0e0a9410e |
files | jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java |
diffstat | 2 files changed, 16 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Fri Mar 25 13:30:32 2016 +0100 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Fri Mar 25 14:08:23 2016 -0700 @@ -171,7 +171,19 @@ public AssumptionResult<ResolvedJavaType> findLeafConcreteSubtype() { HotSpotVMConfig config = config(); if (isArray()) { - return getElementalType().isLeaf() ? new AssumptionResult<>(this) : null; + ResolvedJavaType elementalType = getElementalType(); + AssumptionResult<ResolvedJavaType> elementType = elementalType.findLeafConcreteSubtype(); + if (elementType != null && elementType.getResult().equals(elementalType)) { + /* + * If the elementType is leaf then the array is leaf under the same assumptions but + * only if the element type is exactly the leaf type. The element type can be + * abstract even if there is only one implementor of the abstract type. + */ + AssumptionResult<ResolvedJavaType> result = new AssumptionResult<>(this); + result.add(elementType); + return result; + } + return null; } else if (isInterface()) { HotSpotResolvedObjectTypeImpl implementor = getSingleImplementor(); /*
--- a/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java Fri Mar 25 13:30:32 2016 +0100 +++ b/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java Fri Mar 25 14:08:23 2016 -0700 @@ -339,8 +339,10 @@ ResolvedJavaType a1a = metaAccess.lookupJavaType(Abstract1[].class); checkConcreteSubtype(a1a, null); + ResolvedJavaType i1a = metaAccess.lookupJavaType(Interface1[].class); + checkConcreteSubtype(i1a, null); ResolvedJavaType c1a = metaAccess.lookupJavaType(Concrete1[].class); - checkConcreteSubtype(c1a, null); + checkConcreteSubtype(c1a, c1a); ResolvedJavaType f1a = metaAccess.lookupJavaType(Final1[].class); checkConcreteSubtype(f1a, f1a);