--- old/src/hotspot/share/interpreter/linkResolver.cpp 2018-02-27 10:50:34.855948000 +0100 +++ new/src/hotspot/share/interpreter/linkResolver.cpp 2018-02-27 10:50:34.496919000 +0100 @@ -1373,7 +1373,7 @@ // check if abstract if (check_null_and_abstract && selected_method->is_abstract()) { // Pass arguments for generating a verbose error message. - throw_abstract_method_error_abstract(resolved_method, selected_method, recv_klass, CHECK); + throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK); } if (log_develop_is_enabled(Trace, vtables)) { @@ -1454,7 +1454,7 @@ } // check if abstract if (check_null_and_abstract && selected_method->is_abstract()) { - throw_abstract_method_error_abstract(resolved_method, selected_method, recv_klass, CHECK); + throw_abstract_method_error(resolved_method, selected_method, recv_klass, CHECK); } if (log_develop_is_enabled(Trace, itables)) { @@ -1759,46 +1759,37 @@ Exceptions::wrap_dynamic_exception(CHECK); } -// No need to report selected method differing from resolved method. -void LinkResolver::throw_abstract_method_error(const methodHandle& resolved_method, Klass *recv_klass, TRAPS) { +// Selected method is abstract. +void LinkResolver::throw_abstract_method_error(const methodHandle& resolved_method, + const methodHandle& selected_method, + Klass *recv_klass, TRAPS) { Klass *resolved_klass = resolved_method->method_holder(); ResourceMark rm; + stringStream ss; - char buf[1000]; - jio_snprintf(buf, sizeof(buf), - "Receiver class %s does not define or inherit an implementation of the resolved method %s%s%s of %s %s.", - recv_klass->external_name(), - resolved_method->modifiers_as_C_string(), - resolved_method->name()->as_C_string(), - resolved_method->signature()->as_C_string(), - resolved_klass->external_kind(), - resolved_klass->external_name()); - - THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), buf); -} - -// Selected method is abstract. -void LinkResolver::throw_abstract_method_error_abstract(const methodHandle& resolved_method, - const methodHandle& selected_method, - Klass *recv_klass, TRAPS) { - if (resolved_method == selected_method) { - throw_abstract_method_error(resolved_method, recv_klass, CHECK); + if (recv_klass != NULL) { + ss.print("Receiver class %s does not define or inherit an " + "implementation of the", + recv_klass->external_name()); + } else { + ss.print("Missing implementation of"); } - Klass *resolved_klass = resolved_method->method_holder(); - ResourceMark rm; - char buf[1000]; - jio_snprintf(buf, sizeof(buf), - "Receiver class %s does not define or inherit an implementation of the resolved method %s%s%s of %s %s." - " Selected method is %s%s.", - recv_klass->external_name(), - resolved_method->modifiers_as_C_string(), - resolved_method->name()->as_C_string(), - resolved_method->signature()->as_C_string(), - resolved_klass->external_kind(), - resolved_klass->external_name(), - selected_method->modifiers_as_C_string(), // This should print 'abstract'. - selected_method->name_and_sig_as_C_string()); + assert(resolved_method.not_null(), "Sanity"); + ss.print(" resolved method %s%s%s%s of %s %s.", + resolved_method->is_abstract() ? "abstract " : "", + resolved_method->is_private() ? "private " : "", + resolved_method->name()->as_C_string(), + resolved_method->signature()->as_C_string(), + resolved_klass->external_kind(), + resolved_klass->external_name()); + + if (selected_method.not_null() && !(resolved_method == selected_method)) { + ss.print(" Selected method is %s%s%s.", + selected_method->is_abstract() ? "abstract " : "", + selected_method->is_private() ? "private " : "", + selected_method->name_and_sig_as_C_string()); + } - THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), buf); + THROW_MSG(vmSymbols::java_lang_AbstractMethodError(), ss.as_string()); }