changeset 24127:6d70d9c43369

added ResolvedJavaType.isPlatformType (JDK-8177845)
author Doug Simon <doug.simon@oracle.com>
date Sat, 15 Apr 2017 23:54:19 +0200
parents c80b6f33b3d9
children 7c59192857ff
files jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType.java jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaType.java jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java
diffstat 4 files changed, 55 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java	Sat Apr 15 23:53:53 2017 +0200
+++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java	Sat Apr 15 23:54:19 2017 +0200
@@ -922,4 +922,21 @@
     public boolean isCloneableWithAllocation() {
         return (getAccessFlags() & config().jvmAccIsCloneable) != 0;
     }
+
+    static class ClassLoaders {
+        static ClassLoader getExtLoader() {
+            sun.misc.Launcher l = sun.misc.Launcher.getLauncher();
+            ClassLoader cl = l.getClassLoader().getParent();
+            assert cl.getClass().getName().equals("sun.misc.Launcher$ExtClassLoader") : cl.getClass().getName();
+            return cl;
+        }
+
+        static final ClassLoader EXT_LOADER = getExtLoader();
+    }
+
+    @Override
+    public boolean isPlatformType() {
+        ClassLoader cl = mirror().getClassLoader();
+        return cl == null || cl == getClass().getClassLoader() || cl == ClassLoaders.EXT_LOADER;
+    }
 }
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType.java	Sat Apr 15 23:53:53 2017 +0200
+++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType.java	Sat Apr 15 23:54:19 2017 +0200
@@ -267,4 +267,9 @@
     public boolean isCloneableWithAllocation() {
         return false;
     }
+
+    @Override
+    public boolean isPlatformType() {
+        return true;
+    }
 }
--- a/jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaType.java	Sat Apr 15 23:53:53 2017 +0200
+++ b/jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaType.java	Sat Apr 15 23:54:19 2017 +0200
@@ -321,4 +321,10 @@
      * so they would to go through the normal {@link Object#clone} path.
      */
     boolean isCloneableWithAllocation();
+
+    /**
+     * Determines if this type is trusted by the runtime. This typically means the type is loaded by
+     * a trusted class loader such as the boot loader or platform loader.
+     */
+    boolean isPlatformType();
 }
--- a/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java	Sat Apr 15 23:53:53 2017 +0200
+++ b/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java	Sat Apr 15 23:54:19 2017 +0200
@@ -880,6 +880,33 @@
     }
 
     @Test
+    public void isPlatformTypeTest() {
+        ResolvedJavaType type = metaAccess.lookupJavaType(getClass());
+        assertFalse(type.isPlatformType());
+
+        Class<?> feedbackCipherClass = null;
+        try {
+            ClassLoader scl = ClassLoader.getSystemClassLoader();
+            feedbackCipherClass = Class.forName("com.sun.crypto.provider.FeedbackCipher", true, scl);
+        } catch (ClassNotFoundException e) {
+        }
+        if (feedbackCipherClass != null) {
+            type = metaAccess.lookupJavaType(feedbackCipherClass);
+            assertTrue(type.toString(), type.isPlatformType());
+        }
+
+        for (Class<?> c : classes) {
+            type = metaAccess.lookupJavaType(c);
+            ClassLoader cl = c.getClassLoader();
+            if (cl == null || cl == ResolvedJavaType.class.getClassLoader()) {
+                assertTrue(type.toString(), type.isPlatformType());
+            } else {
+                assertFalse(type.toString(), type.isPlatformType());
+            }
+        }
+    }
+
+    @Test
     public void findMethodTest() {
         try {
             ResolvedJavaMethod findFoo = metaAccess.lookupJavaType(D.class).findMethod("foo", metaAccess.parseMethodDescriptor("()V"));