# HG changeset patch # User Doug Simon # Date 1403900500 -7200 # Node ID d6ffc6164830bdb9fe1b03b8869d989ca8556fbf # Parent 56cd93afdc15a5d4f779cfaa89662bd9ac16e686 handle any exception raised during Graal option checking/parsing, not just those with a non-null message diff -r 56cd93afdc15 -r d6ffc6164830 src/share/vm/graal/graalRuntime.cpp --- a/src/share/vm/graal/graalRuntime.cpp Fri Jun 27 22:11:08 2014 +0200 +++ b/src/share/vm/graal/graalRuntime.cpp Fri Jun 27 22:21:40 2014 +0200 @@ -717,10 +717,14 @@ assert(HAS_PENDING_EXCEPTION, "must be"); ResourceMark rm; - oop message = java_lang_Throwable::message(PENDING_EXCEPTION); - assert(message != NULL, "Graal argument parsing exception is expected to hava message"); - tty->print_cr("Error parsing Graal options: %s", java_lang_String::as_utf8_string(message)); + Handle exception = PENDING_EXCEPTION; CLEAR_PENDING_EXCEPTION; + oop message = java_lang_Throwable::message(exception); + if (message != NULL) { + tty->print_cr("Error parsing Graal options: %s", java_lang_String::as_utf8_string(message)); + } else { + call_printStackTrace(exception, THREAD); + } return JNI_ERR; } return JNI_OK; @@ -744,7 +748,7 @@ void GraalRuntime::check_required_value(const char* name, int name_len, const char* value, TRAPS) { if (value == NULL) { char buf[200]; - jio_snprintf(buf, sizeof(buf), "Value for option %.*s must use '-G:%.*s=' format", name_len, name, name_len, name); + jio_snprintf(buf, sizeof(buf), "Must use '-G:%.*s=' format for %.*s option", name_len, name, name_len, name); THROW_MSG(vmSymbols::java_lang_InternalError(), buf); } } @@ -951,21 +955,23 @@ } } +void GraalRuntime::call_printStackTrace(Handle exception, Thread* thread) { + assert(exception->is_a(SystemDictionary::Throwable_klass()), "Throwable instance expected"); + JavaValue result(T_VOID); + JavaCalls::call_virtual(&result, + exception, + KlassHandle(thread, + SystemDictionary::Throwable_klass()), + vmSymbols::printStackTrace_name(), + vmSymbols::void_method_signature(), + thread); +} + void GraalRuntime::abort_on_pending_exception(Handle exception, const char* message, bool dump_core) { Thread* THREAD = Thread::current(); CLEAR_PENDING_EXCEPTION; - - assert(exception->is_a(SystemDictionary::Throwable_klass()), "Throwable instance expected"); - JavaValue result(T_VOID); tty->print_cr(message); - JavaCalls::call_virtual(&result, - exception, - KlassHandle(THREAD, - SystemDictionary::Throwable_klass()), - vmSymbols::printStackTrace_name(), - vmSymbols::void_method_signature(), - THREAD); - + call_printStackTrace(exception, THREAD); vm_abort(dump_core); } diff -r 56cd93afdc15 -r d6ffc6164830 src/share/vm/graal/graalRuntime.hpp --- a/src/share/vm/graal/graalRuntime.hpp Fri Jun 27 22:11:08 2014 +0200 +++ b/src/share/vm/graal/graalRuntime.hpp Fri Jun 27 22:21:40 2014 +0200 @@ -134,6 +134,11 @@ */ static void abort_on_pending_exception(Handle exception, const char* message, bool dump_core = false); + /** + * Calls Throwable.printStackTrace() on a given exception. + */ + static void call_printStackTrace(Handle exception, Thread* thread); + #define GUARANTEE_NO_PENDING_EXCEPTION(error_message) do { \ if (HAS_PENDING_EXCEPTION) { \ GraalRuntime::abort_on_pending_exception(PENDING_EXCEPTION, error_message); \