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

src/share/vm/interpreter/linkResolver.cpp

Print this page

        

*** 913,922 **** --- 913,941 ---- resolved_method->signature()->as_C_string() ); return; } + // check if invokespecial's interface method reference is in an indirect superinterface + if (!current_klass.is_null() && resolved_klass->is_interface()) { + Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ? + current_klass() : + InstanceKlass::cast(current_klass())->host_klass(); + + if (!InstanceKlass::cast(klass_to_check)->is_same_or_direct_interface(resolved_klass())) { + ResourceMark rm(THREAD); + char buf[200]; + jio_snprintf(buf, sizeof(buf), + "Interface method reference: %s, is in an indirect superinterface of %s", + Method::name_and_sig_as_C_string(resolved_klass(), + resolved_method->name(), + resolved_method->signature()), + current_klass->external_name()); + THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); + } + } + // check if not static if (resolved_method->is_static()) { ResourceMark rm(THREAD); char buf[200]; jio_snprintf(buf, sizeof(buf),
src/share/vm/interpreter/linkResolver.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File