8161603: [JVMCI] HotSpotVMConfig.baseVtableLength is incorrectly computed
Reviewed-by: kvn
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java Tue Jul 19 18:59:11 2016 +0000
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java Tue Jul 19 18:17:40 2016 -0700
@@ -252,7 +252,7 @@
final int universeBaseVtableSize = getFieldValue("CompilerToVM::Data::Universe_base_vtable_size", Integer.class, "int");
final int baseVtableLength() {
- return universeBaseVtableSize / vtableEntrySize;
+ return universeBaseVtableSize / (vtableEntrySize / heapWordSize);
}
final int klassOffset = getFieldValue("java_lang_Class::_klass_offset", Integer.class, "int");
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java Tue Jul 19 18:59:11 2016 +0000
+++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java Tue Jul 19 18:17:40 2016 -0700
@@ -422,6 +422,25 @@
assertFalse(ResolvedJavaMethod.isSignaturePolymorphic(metaAccess.lookupJavaType(Object.class), "toString", metaAccess));
}
+ /**
+ * All public non-final methods should be available in the vtable.
+ */
+ @Test
+ public void testVirtualMethodTableAccess() {
+ for (Class<?> c : classes) {
+ if (c.isPrimitive() || c.isInterface()) {
+ continue;
+ }
+ ResolvedJavaType receiverType = metaAccess.lookupJavaType(c);
+ for (Method m : c.getMethods()) {
+ ResolvedJavaMethod method = metaAccess.lookupJavaMethod(m);
+ if (!method.isStatic() && !method.isFinal() && !method.getDeclaringClass().isLeaf() && !method.getDeclaringClass().isInterface()) {
+ assertTrue(method + " not available in " + receiverType, method.isInVirtualMethodTable(receiverType));
+ }
+ }
+ }
+ }
+
private Method findTestMethod(Method apiMethod) {
String testName = apiMethod.getName() + "Test";
for (Method m : getClass().getDeclaredMethods()) {