32 * jdk.vm.ci.hotspot.CompilerToVMHelper 33 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockExperimentalVMOptions 34 * -XX:+EnableJVMCI compiler.jvmci.compilerToVM.ResolveMethodTest 35 */ 36 37 package compiler.jvmci.compilerToVM; 38 39 import compiler.jvmci.common.testcases.AbstractClass; 40 import compiler.jvmci.common.testcases.AbstractClassExtender; 41 import compiler.jvmci.common.testcases.MultipleImplementer1; 42 import compiler.jvmci.common.testcases.MultipleImplementer2; 43 import compiler.jvmci.common.testcases.MultipleImplementersInterface; 44 import compiler.jvmci.common.testcases.SingleImplementer; 45 import compiler.jvmci.common.testcases.SingleImplementerInterface; 46 import compiler.jvmci.common.testcases.SingleSubclass; 47 import compiler.jvmci.common.testcases.SingleSubclassedClass; 48 import compiler.jvmci.common.CTVMUtilities; 49 import java.util.HashSet; 50 import java.util.Set; 51 import jdk.vm.ci.hotspot.CompilerToVMHelper; 52 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl; 53 import jdk.vm.ci.hotspot.HotSpotResolvedObjectTypeImpl; 54 import jdk.test.lib.Asserts; 55 import jdk.test.lib.Utils; 56 import sun.misc.Unsafe; 57 58 public class ResolveMethodTest { 59 private static final Unsafe UNSAFE = Utils.getUnsafe(); 60 61 public static void main(String args[]) { 62 ResolveMethodTest test = new ResolveMethodTest(); 63 // positive cases 64 try { 65 for (TestCase tcase: createTestCases()) { 66 test.runTest(tcase); 67 } 68 } catch (NoSuchMethodException e) { 69 throw new Error("TEST BUG: can't find requested method", e); 70 } 71 } 72 73 private static Set<TestCase> createTestCases() { 108 // private method with right accessor 109 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 110 "privateMethod", SingleSubclass.class, true)); 111 // package-private method with right accessor 112 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 113 "defaultAccessMethod", SingleSubclass.class, true)); 114 115 // negative cases 116 117 // private method of another class 118 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 119 "privateMethod", ResolveMethodTest.class, false)); 120 // package-private method from another package 121 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 122 "defaultAccessMethod", ResolveMethodTest.class, false)); 123 return result; 124 } 125 126 private void runTest(TestCase tcase) throws NoSuchMethodException { 127 System.out.println(tcase); 128 HotSpotResolvedJavaMethodImpl metaspaceMethod = CTVMUtilities 129 .getResolvedMethod(tcase.holder, 130 tcase.holder.getDeclaredMethod(tcase.methodName)); 131 HotSpotResolvedObjectTypeImpl holderMetaspace = CompilerToVMHelper 132 .lookupType(Utils.toJVMTypeSignature(tcase.holder), 133 getClass(), /* resolve = */ true); 134 HotSpotResolvedObjectTypeImpl callerMetaspace = CompilerToVMHelper 135 .lookupType(Utils.toJVMTypeSignature(tcase.caller), 136 getClass(), /* resolve = */ true); 137 HotSpotResolvedJavaMethodImpl resolvedMetaspaceMethod 138 = CompilerToVMHelper.resolveMethod(holderMetaspace, 139 metaspaceMethod, callerMetaspace); 140 if (tcase.isPositive) { 141 Asserts.assertNotNull(resolvedMetaspaceMethod, 142 "Unexpected null resolved method value for " 143 + tcase.methodName); 144 Asserts.assertEQ(metaspaceMethod.getName(), tcase.methodName, 145 "Reflection and c2vm method names doesn't match"); 146 } else { 147 Asserts.assertNull(resolvedMetaspaceMethod, 148 "Method unexpectedly resolved"); 149 } 150 } 151 152 private static class TestCase { 153 public final Class<?> receiver; 154 public final Class<?> holder; 155 public final Class<?> caller; 156 public final String methodName; 157 public final boolean isPositive; | 32 * jdk.vm.ci.hotspot.CompilerToVMHelper 33 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockExperimentalVMOptions 34 * -XX:+EnableJVMCI compiler.jvmci.compilerToVM.ResolveMethodTest 35 */ 36 37 package compiler.jvmci.compilerToVM; 38 39 import compiler.jvmci.common.testcases.AbstractClass; 40 import compiler.jvmci.common.testcases.AbstractClassExtender; 41 import compiler.jvmci.common.testcases.MultipleImplementer1; 42 import compiler.jvmci.common.testcases.MultipleImplementer2; 43 import compiler.jvmci.common.testcases.MultipleImplementersInterface; 44 import compiler.jvmci.common.testcases.SingleImplementer; 45 import compiler.jvmci.common.testcases.SingleImplementerInterface; 46 import compiler.jvmci.common.testcases.SingleSubclass; 47 import compiler.jvmci.common.testcases.SingleSubclassedClass; 48 import compiler.jvmci.common.CTVMUtilities; 49 import java.util.HashSet; 50 import java.util.Set; 51 import jdk.vm.ci.hotspot.CompilerToVMHelper; 52 import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod; 53 import jdk.vm.ci.hotspot.HotSpotResolvedObjectType; 54 import jdk.test.lib.Asserts; 55 import jdk.test.lib.Utils; 56 import sun.misc.Unsafe; 57 58 public class ResolveMethodTest { 59 private static final Unsafe UNSAFE = Utils.getUnsafe(); 60 61 public static void main(String args[]) { 62 ResolveMethodTest test = new ResolveMethodTest(); 63 // positive cases 64 try { 65 for (TestCase tcase: createTestCases()) { 66 test.runTest(tcase); 67 } 68 } catch (NoSuchMethodException e) { 69 throw new Error("TEST BUG: can't find requested method", e); 70 } 71 } 72 73 private static Set<TestCase> createTestCases() { 108 // private method with right accessor 109 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 110 "privateMethod", SingleSubclass.class, true)); 111 // package-private method with right accessor 112 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 113 "defaultAccessMethod", SingleSubclass.class, true)); 114 115 // negative cases 116 117 // private method of another class 118 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 119 "privateMethod", ResolveMethodTest.class, false)); 120 // package-private method from another package 121 result.add(new TestCase(SingleSubclass.class, SingleSubclass.class, 122 "defaultAccessMethod", ResolveMethodTest.class, false)); 123 return result; 124 } 125 126 private void runTest(TestCase tcase) throws NoSuchMethodException { 127 System.out.println(tcase); 128 HotSpotResolvedJavaMethod metaspaceMethod = CTVMUtilities 129 .getResolvedMethod(tcase.holder, 130 tcase.holder.getDeclaredMethod(tcase.methodName)); 131 HotSpotResolvedObjectType holderMetaspace = CompilerToVMHelper 132 .lookupType(Utils.toJVMTypeSignature(tcase.holder), 133 getClass(), /* resolve = */ true); 134 HotSpotResolvedObjectType callerMetaspace = CompilerToVMHelper 135 .lookupType(Utils.toJVMTypeSignature(tcase.caller), 136 getClass(), /* resolve = */ true); 137 HotSpotResolvedJavaMethod resolvedMetaspaceMethod 138 = CompilerToVMHelper.resolveMethod(holderMetaspace, 139 metaspaceMethod, callerMetaspace); 140 if (tcase.isPositive) { 141 Asserts.assertNotNull(resolvedMetaspaceMethod, 142 "Unexpected null resolved method value for " 143 + tcase.methodName); 144 Asserts.assertEQ(metaspaceMethod.getName(), tcase.methodName, 145 "Reflection and c2vm method names doesn't match"); 146 } else { 147 Asserts.assertNull(resolvedMetaspaceMethod, 148 "Method unexpectedly resolved"); 149 } 150 } 151 152 private static class TestCase { 153 public final Class<?> receiver; 154 public final Class<?> holder; 155 public final Class<?> caller; 156 public final String methodName; 157 public final boolean isPositive; |