changeset 16273:d6ffc6164830

handle any exception raised during Graal option checking/parsing, not just those with a non-null message
author Doug Simon <doug.simon@oracle.com>
date Fri, 27 Jun 2014 22:21:40 +0200
parents 56cd93afdc15
children 60c3f610183e
files src/share/vm/graal/graalRuntime.cpp src/share/vm/graal/graalRuntime.hpp
diffstat 2 files changed, 26 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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=<value>' format", name_len, name, name_len, name);
+    jio_snprintf(buf, sizeof(buf), "Must use '-G:%.*s=<value>' 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);
 }
 
--- 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); \