Mercurial > hg > graal-jvmci-8
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"));