# HG changeset patch # User Doug Simon # Date 1492293259 -7200 # Node ID 6d70d9c433695201ea98a48be577cbb35ea0f5f9 # Parent c80b6f33b3d91861049ae131dcb246bb1cd8ee2f added ResolvedJavaType.isPlatformType (JDK-8177845) diff -r c80b6f33b3d9 -r 6d70d9c43369 jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java --- 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; + } } diff -r c80b6f33b3d9 -r 6d70d9c43369 jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType.java --- 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; + } } diff -r c80b6f33b3d9 -r 6d70d9c43369 jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaType.java --- 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(); } diff -r c80b6f33b3d9 -r 6d70d9c43369 jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java --- 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"));