# HG changeset patch # User Doug Simon # Date 1498835397 -7200 # Node ID 26a414946c568d0ef78961bf095d77b5bfecac6d # Parent 95d0e0762de53e10c5b33ff8cb3b6d98884c3301 Get host class of VM anonymous class (JDK-8182310) diff -r 95d0e0762de5 -r 26a414946c56 jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java --- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Wed Jun 28 06:27:49 2017 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Fri Jun 30 17:09:57 2017 +0200 @@ -631,4 +631,9 @@ * {@link Long} */ native Object getFlagValue(String name); + + /** + * Gets the host class for {@code type}. + */ + native HotSpotResolvedObjectTypeImpl getHostClass(HotSpotResolvedObjectTypeImpl type); } diff -r 95d0e0762de5 -r 26a414946c56 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 Wed Jun 28 06:27:49 2017 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java Fri Jun 30 17:09:57 2017 +0200 @@ -412,6 +412,14 @@ } @Override + public ResolvedJavaType getHostClass() { + if (isArray()) { + return null; + } + return compilerToVM().getHostClass(this); + } + + @Override public boolean isJavaLangObject() { return javaClass.equals(Object.class); } diff -r 95d0e0762de5 -r 26a414946c56 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 Wed Jun 28 06:27:49 2017 -0700 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedPrimitiveType.java Fri Jun 30 17:09:57 2017 +0200 @@ -154,6 +154,11 @@ } @Override + public ResolvedJavaType getHostClass() { + return null; + } + + @Override public JavaKind getJavaKind() { return kind; } diff -r 95d0e0762de5 -r 26a414946c56 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 Wed Jun 28 06:27:49 2017 -0700 +++ b/jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaType.java Fri Jun 30 17:09:57 2017 +0200 @@ -105,6 +105,13 @@ boolean isAssignableFrom(ResolvedJavaType other); /** + * Returns the {@link ResolvedJavaType} object representing the host class of this VM anonymous + * class (as opposed to the unrelated concept specified by {@link Class#isAnonymousClass()}) or + * {@code null} if this object does not represent a VM anonymous class. + */ + ResolvedJavaType getHostClass(); + + /** * Returns true if this type is exactly the type {@link java.lang.Object}. */ default boolean isJavaLangObject() { diff -r 95d0e0762de5 -r 26a414946c56 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 Wed Jun 28 06:27:49 2017 -0700 +++ b/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaType.java Fri Jun 30 17:09:57 2017 +0200 @@ -52,6 +52,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.function.Supplier; import org.junit.Test; @@ -137,6 +138,29 @@ } @Test + public void getHostClassTest() { + for (Class c : classes) { + ResolvedJavaType type = metaAccess.lookupJavaType(c); + ResolvedJavaType host = type.getHostClass(); + assertNull(host); + } + + class LocalClass { + } + Cloneable clone = new Cloneable() { + }; + assertNull(metaAccess.lookupJavaType(LocalClass.class).getHostClass()); + assertNull(metaAccess.lookupJavaType(clone.getClass()).getHostClass()); + + Supplier lambda = () -> () -> System.out.println("run"); + ResolvedJavaType lambdaType = metaAccess.lookupJavaType(lambda.getClass()); + ResolvedJavaType nestedLambdaType = metaAccess.lookupJavaType(lambda.get().getClass()); + assertNotNull(lambdaType.getHostClass()); + assertNotNull(nestedLambdaType.getHostClass()); + assertEquals(lambdaType.getHostClass(), nestedLambdaType.getHostClass()); + } + + @Test public void getModifiersTest() { for (Class c : classes) { ResolvedJavaType type = metaAccess.lookupJavaType(c); diff -r 95d0e0762de5 -r 26a414946c56 src/share/vm/jvmci/jvmciCompilerToVM.cpp --- a/src/share/vm/jvmci/jvmciCompilerToVM.cpp Wed Jun 28 06:27:49 2017 -0700 +++ b/src/share/vm/jvmci/jvmciCompilerToVM.cpp Fri Jun 30 17:09:57 2017 +0200 @@ -1597,6 +1597,13 @@ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("Invalid profile data position %d", position)); C2V_END +C2V_VMENTRY(jobject, getHostClass, (JNIEnv*, jobject, jobject jvmci_type)) + InstanceKlass* k = InstanceKlass::cast(CompilerToVM::asKlass(jvmci_type)); + Klass* host = k->host_klass(); + oop result = CompilerToVM::get_jvmci_type(host, CHECK_NULL); + return JNIHandles::make_local(THREAD, result); +C2V_END + C2V_VMENTRY(int, interpreterFrameSize, (JNIEnv*, jobject, jobject bytecode_frame_handle)) if (bytecode_frame_handle == NULL) { THROW_0(vmSymbols::java_lang_NullPointerException()); @@ -1724,6 +1731,7 @@ {CC"writeDebugOutput", CC"([BII)V", FN_PTR(writeDebugOutput)}, {CC"flushDebugOutput", CC"()V", FN_PTR(flushDebugOutput)}, {CC"methodDataProfileDataSize", CC"(JI)I", FN_PTR(methodDataProfileDataSize)}, + {CC"getHostClass", CC"("HS_RESOLVED_KLASS")"HS_RESOLVED_KLASS, FN_PTR(getHostClass)}, {CC"interpreterFrameSize", CC"("BYTECODE_FRAME")I", FN_PTR(interpreterFrameSize)}, {CC"compileToBytecode", CC"("OBJECT")V", FN_PTR(compileToBytecode)}, {CC"getFlagValue", CC"("STRING")"OBJECT, FN_PTR(getFlagValue)},