diff src/share/vm/c1/c1_Runtime1.cpp @ 6453:3bba61323b38

added VMErrorNode intrinsic to support handling fatal errors in snippets
author Doug Simon <doug.simon@oracle.com>
date Thu, 27 Sep 2012 14:23:04 +0200
parents c8759f9f9e3c
children 921005bb0b45
line wrap: on
line diff
--- a/src/share/vm/c1/c1_Runtime1.cpp	Wed Sep 26 21:48:07 2012 +0200
+++ b/src/share/vm/c1/c1_Runtime1.cpp	Thu Sep 27 14:23:04 2012 +0200
@@ -761,68 +761,40 @@
   bool newline = flags & LOG_OBJECT_NEWLINE;
   if (!string) {
     if (!address && obj->is_oop_or_null(true)) {
-      char buf[400];
-      tty->print("%s@%p", obj->klass()->klass_part()->name()->as_C_string(buf, 400), obj);
+      char buf[O_BUFLEN];
+      tty->print("%s@%p", obj->klass()->klass_part()->name()->as_C_string(buf, O_BUFLEN), obj);
     } else {
       tty->print("%p", obj);
     }
   } else {
+    ResourceMark rm;
     assert(obj != NULL && java_lang_String::is_instance(obj), "must be");
-
-    typeArrayOop value  = java_lang_String::value(obj);
-    int          offset = java_lang_String::offset(obj);
-    int          length = java_lang_String::length(obj);
-
-    if (length != 0) {
-      int printLength = MIN2(length, 1024);
-      if (value == NULL) {
-        // This can happen if, e.g., printing a String
-        // object before its initializer has been called
-        tty->print("null");
-      } else if (printLength < 256 - 1) {
-        // Use an intermediate buffer to try and prevent interlacing of multi-threaded output
-        char buf[256];
-        for (int index = 0; index < printLength; index++) {
-          buf[index] = value->char_at(index + offset);
-        }
-        buf[printLength] = 0;
-        tty->print("%s", buf);
-        if (printLength < length) {
-          tty->print("... (%d more)", length - printLength);
-        }
-      } else {
-        for (int index = 0; index < printLength; index++) {
-          tty->print("%c", value->char_at(index + offset));
-        }
-        if (printLength < length) {
-          tty->print("... (%d more)", length - printLength);
-        }
-      }
-    }
+    char *buf = java_lang_String::as_utf8_string(obj);
+    tty->print(buf);
   }
   if (newline) {
     tty->cr();
   }
 JRT_END
 
-JRT_ENTRY(void, Runtime1::graal_log_printf(JavaThread* thread, oop format, jlong val))
-  char buf[1025];
-  assert(format != NULL && java_lang_String::is_instance(format), "must be");
-
-  typeArrayOop value  = java_lang_String::value(format);
-  int          offset = java_lang_String::offset(format);
-  int          length = java_lang_String::length(format);
+JRT_ENTRY(void, Runtime1::graal_vm_error(JavaThread* thread, oop where, oop format, jlong value))
+  ResourceMark rm;
+  assert(where == NULL || java_lang_String::is_instance(where), "must be");
+  const char *error_msg = where == NULL ? "<internal Graal error>" : java_lang_String::as_utf8_string(where);
+  char *detail_msg = NULL;
+  if (format != NULL) {
+    const char* buf = java_lang_String::as_utf8_string(format);
+    int detail_msg_length = strlen(buf) * 2;
+    detail_msg = (char *) NEW_RESOURCE_ARRAY(u_char, detail_msg_length);
+    jio_snprintf(detail_msg, detail_msg_length, buf, value);
+  }
+  report_vm_error(__FILE__, __LINE__, error_msg, detail_msg);
+JRT_END
 
-  assert(value != NULL, "fmtString must be a literal");
-  assert(length >= 0 && length <= 1024, "format must be between 0 and 1024 characters");
-  length = MIN2(length, 1024);
-
-  int index = 0;
-  while (index < length) {
-    buf[index] = value->char_at(index + offset);
-    index++;
-  }
-  buf[index++] = 0;
+JRT_ENTRY(void, Runtime1::graal_log_printf(JavaThread* thread, oop format, jlong val))
+  ResourceMark rm;
+  assert(format != NULL && java_lang_String::is_instance(format), "must be");
+  char *buf = java_lang_String::as_utf8_string(format);
   tty->print(buf, val);
 JRT_END