# HG changeset patch # User never # Date 1468977460 25200 # Node ID ef4e7f394fc898aa95f0eaa84835b6ddb358ce1b # Parent 135bb8aa1e18c18238b0b6886c20d751db679c63 8161603: [JVMCI] HotSpotVMConfig.baseVtableLength is incorrectly computed Reviewed-by: kvn diff -r 135bb8aa1e18 -r ef4e7f394fc8 hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotVMConfig.java --- 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"); diff -r 135bb8aa1e18 -r ef4e7f394fc8 hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java --- 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()) {