changeset 18182:e8c54fd622a4

Add ResolvedJavaType.getImplementor().
author Josef Eisl <josef.eisl@jku.at>
date Tue, 28 Oct 2014 13:43:24 +0100
parents d28acaa63680
children d3dfd1f9545f
files graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java
diffstat 3 files changed, 30 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java	Wed Oct 29 13:31:25 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ResolvedJavaType.java	Tue Oct 28 13:43:24 2014 +0100
@@ -179,6 +179,14 @@
     ResolvedJavaType[] getInterfaces();
 
     /**
+     * Gets the the single implementor of this type.
+     *
+     * @return {@code null} if there is no implementor or this type is not an interface, the
+     *         implementor if there is only one, or {@code this} if there are more than one.
+     */
+    ResolvedJavaType getImplementor();
+
+    /**
      * Walks the class hierarchy upwards and returns the least common class that is a superclass of
      * both the current and the given type.
      *
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java	Wed Oct 29 13:31:25 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType.java	Tue Oct 28 13:43:24 2014 +0100
@@ -151,15 +151,11 @@
         if (isArray()) {
             return getElementalType().isFinal() ? this : null;
         } else if (isInterface()) {
-            final long implementorMetaspaceKlass = runtime().getCompilerToVM().getKlassImplementor(getMetaspaceKlass());
-
-            // No implementor.
-            if (implementorMetaspaceKlass == 0) {
+            HotSpotResolvedObjectType type = getImplementor();
+            if (type == null) {
                 return null;
             }
 
-            HotSpotResolvedObjectType type = fromMetaspaceKlass(implementorMetaspaceKlass);
-
             /*
              * If the implementor field contains itself that indicates that the interface has more
              * than one implementors (see: InstanceKlass::add_implementor). The isInterface check
@@ -224,6 +220,21 @@
         return interfaces;
     }
 
+    @Override
+    public HotSpotResolvedObjectType getImplementor() {
+        if (!isInterface()) {
+            return null;
+        }
+        final long implementorMetaspaceKlass = runtime().getCompilerToVM().getKlassImplementor(getMetaspaceKlass());
+
+        // No implementor.
+        if (implementorMetaspaceKlass == 0) {
+            return null;
+        }
+
+        return fromMetaspaceKlass(implementorMetaspaceKlass);
+    }
+
     public HotSpotResolvedObjectType getSupertype() {
         if (isArray()) {
             ResolvedJavaType componentType = getComponentType();
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java	Wed Oct 29 13:31:25 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedPrimitiveType.java	Tue Oct 28 13:43:24 2014 +0100
@@ -104,6 +104,11 @@
     }
 
     @Override
+    public ResolvedJavaType getImplementor() {
+        return null;
+    }
+
+    @Override
     public ResolvedJavaType findLeastCommonAncestor(ResolvedJavaType otherType) {
         return null;
     }