src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/interpreter/linkResolver.cpp	Sat Oct 12 11:31:01 2013
--- new/src/share/vm/interpreter/linkResolver.cpp	Sat Oct 12 11:31:01 2013

*** 1,6 **** --- 1,7 ---- /* + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 155,164 **** --- 156,177 ---- ResourceMark rm; klassVtable* vt = InstanceKlass::cast(resolved_klass)->vtable(); index = vt->index_of_miranda(resolved_method->name(), resolved_method->signature()); kind = CallInfo::vtable_call; + } else if (resolved_method -> has_vtable_index()) { + // Can occur if an interface redeclares a method of Object. + // Ensure that this is really the case. + DEBUG_ONLY(KlassHandle object_klass = SystemDictionary::Object_klass()); + DEBUG_ONLY(Method * object_resolved_method = object_klass()->vtable()->method_at(index)); + assert(object_resolved_method->name() == resolved_method->name(), + err_msg("Object and interface method names should match at vtable index %d, %s != %s", + index, object_resolved_method->name()->as_C_string(), resolved_method->name()->as_C_string())); + assert(object_resolved_method->signature() == resolved_method->signature(), + err_msg("Object and interface method signatures should match at vtable index %d, %s != %s", + index, object_resolved_method->signature()->as_C_string(), resolved_method->signature()->as_C_string())); + kind = CallInfo::vtable_call; } else { // A regular interface call. kind = CallInfo::itable_call; index = resolved_method->itable_index(); }

src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File