< prev index next >
src/hotspot/share/interpreter/interpreterRuntime.cpp
Print this page
rev 49017 : 8197405: Improve messages of AbstractMethodErrors and IncompatibleClassChangeErrors.
Reviewed-by: coleenp, dholmes
*** 484,495 ****
// tracing
if (log_is_enabled(Info, exceptions)) {
ResourceMark rm(thread);
stringStream tempst;
tempst.print("interpreter method <%s>\n"
! " at bci %d for thread " INTPTR_FORMAT,
! h_method->print_value_string(), current_bci, p2i(thread));
Exceptions::log_exception(h_exception, tempst);
}
// Don't go paging in something which won't be used.
// else if (extable->length() == 0) {
// // disabled for now - interpreter is not using shortcut yet
--- 484,495 ----
// tracing
if (log_is_enabled(Info, exceptions)) {
ResourceMark rm(thread);
stringStream tempst;
tempst.print("interpreter method <%s>\n"
! " at bci %d for thread " INTPTR_FORMAT " (%s)",
! h_method->print_value_string(), current_bci, p2i(thread), thread->name());
Exceptions::log_exception(h_exception, tempst);
}
// Don't go paging in something which won't be used.
// else if (extable->length() == 0) {
// // disabled for now - interpreter is not using shortcut yet
*** 579,593 ****
--- 579,628 ----
IRT_ENTRY(void, InterpreterRuntime::throw_AbstractMethodError(JavaThread* thread))
THROW(vmSymbols::java_lang_AbstractMethodError());
IRT_END
+ // This method is called from the "abstract_entry" of the interpreter.
+ // At that point, the arguments have already been removed from the stack
+ // and therefore we don't have the receiver object at our fingertips. (Though,
+ // on some platforms the receiver still resides in a register...). Thus,
+ // we have no choice but print an error message not containing the receiver
+ // type.
+ IRT_ENTRY(void, InterpreterRuntime::throw_AbstractMethodErrorWithMethod(JavaThread* thread, Method* missingMethod))
+ ResourceMark rm(thread);
+ if (missingMethod != NULL) {
+ methodHandle m(thread, missingMethod);
+ if (m.not_null() && m->is_abstract()) {
+ LinkResolver::throw_abstract_method_error(missingMethod, THREAD);
+ }
+ }
+ THROW(vmSymbols::java_lang_AbstractMethodError());
+ IRT_END
+
+ IRT_ENTRY(void, InterpreterRuntime::throw_AbstractMethodErrorVerbose(JavaThread* thread, Klass* recvKlass,
+ Method* missingMethod))
+ ResourceMark rm(thread);
+ methodHandle mh = methodHandle(thread, missingMethod);
+ LinkResolver::throw_abstract_method_error(mh, recvKlass, THREAD);
+ IRT_END
+
IRT_ENTRY(void, InterpreterRuntime::throw_IncompatibleClassChangeError(JavaThread* thread))
THROW(vmSymbols::java_lang_IncompatibleClassChangeError());
IRT_END
+ IRT_ENTRY(void, InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose(JavaThread* thread, Klass* recvKlass,
+ Klass* interfaceKlass))
+ ResourceMark rm(thread);
+ char buf[1000];
+ buf[0] = '\0';
+ jio_snprintf(buf, sizeof(buf),
+ "Class %s does not implement the requested interface %s",
+ recvKlass ? recvKlass->external_name() : "NULL",
+ interfaceKlass ? interfaceKlass->external_name() : "NULL");
+ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ IRT_END
//------------------------------------------------------------------------------------------------------------------------
// Fields
//
< prev index next >