From: Bryce McKinlay Date: Tue, 23 Oct 2001 05:42:03 +0000 (+0000) Subject: prims.cc (_Jv_Abort): Always print error message using fprintf, don't try to allocate. X-Git-Tag: prereleases/libstdc++-3.0.95~1469 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=afb2dec5269ed1cc728aed0a2cb169eef4ed66f3;p=thirdparty%2Fgcc.git prims.cc (_Jv_Abort): Always print error message using fprintf, don't try to allocate. * prims.cc (_Jv_Abort): Always print error message using fprintf, don't try to allocate. (_Jv_CreateJavaVM): Set gcj::runTimeInitialized. * include/jvm.h (gcj::runTimeInitialized): New variable declaration. * java/lang/natClassLoader.cc (_Jv_RegisterClassHookDefault): Handle duplicate class registration with JvFail if the runtime hasn't been initialized yet. From-SVN: r46424 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index ba393cc9e697..8cb0dab502a3 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,13 @@ +2001-10-23 Bryce McKinlay + + * prims.cc (_Jv_Abort): Always print error message using fprintf, + don't try to allocate. + (_Jv_CreateJavaVM): Set gcj::runTimeInitialized. + * include/jvm.h (gcj::runTimeInitialized): New variable declaration. + * java/lang/natClassLoader.cc (_Jv_RegisterClassHookDefault): Handle + duplicate class registration with JvFail if the runtime hasn't been + initialized yet. + 2001-10-22 Tom Tromey * java/util/GregorianCalendar.java (getGregorianChange): Removed diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h index bb54c8b58d88..858d960bf201 100644 --- a/libjava/include/jvm.h +++ b/libjava/include/jvm.h @@ -131,6 +131,9 @@ namespace gcj extern _Jv_Utf8Const *clinit_name; /* "" */ extern _Jv_Utf8Const *init_name; /* "" */ extern _Jv_Utf8Const *finit_name; /* "finit$", */ + + /* Set to true by _Jv_CreateJavaVM. */ + extern bool runtimeInitialized; }; /* Type of pointer used as finalizer. */ diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 3c2679bd8b43..d92a90c8b8c6 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -14,6 +14,7 @@ details. */ #include #include +#include #include #include @@ -452,7 +453,17 @@ _Jv_RegisterClassHookDefault (jclass klass) { // If you get this, it means you have the same class in two // different libraries. - throw new java::lang::VirtualMachineError (JvNewStringLatin1 ("class registered twice")); + char *message; + asprintf (&message, "Duplicate class registration: %s", + klass->name->data); + if (! gcj::runtimeInitialized) + JvFail (message); + else + { + java::lang::String *str = JvNewStringLatin1 (message); + free (message); + throw new java::lang::VirtualMachineError (str); + } } check_class = check_class->next; diff --git a/libjava/prims.cc b/libjava/prims.cc index 7b3dd6c6a005..f2f2d6578a23 100644 --- a/libjava/prims.cc +++ b/libjava/prims.cc @@ -299,10 +299,7 @@ _Jv_Abort (const char *, const char *, int, const char *message) "libgcj failure: %s\n in function %s, file %s, line %d\n", message, function, file, line); #else - java::io::PrintStream *err = java::lang::System::err; - err->print(JvNewStringLatin1 ("libgcj failure: ")); - err->println(JvNewStringLatin1 (message)); - err->flush(); + fprintf (stderr, "libgcj failure: %s\n", message); #endif abort (); } @@ -872,6 +869,8 @@ namespace gcj _Jv_Utf8Const *clinit_name; _Jv_Utf8Const *init_name; _Jv_Utf8Const *finit_name; + + bool runtimeInitialized = false; } jint @@ -879,12 +878,10 @@ _Jv_CreateJavaVM (void* /*vm_args*/) { using namespace gcj; - static bool init = false; - - if (init) + if (runtimeInitialized) return -1; - init = true; + runtimeInitialized = true; PROCESS_GCJ_PROPERTIES;