2001-03-12 Bryce McKinlay <bryce@albatross.co.nz>
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Mar 2001 07:40:17 +0000 (07:40 +0000)
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Mar 2001 07:40:17 +0000 (07:40 +0000)
* java/lang/Runtime.java (_exit): Declare new package-private native.
* java/lang/natRuntime.cc (_exit): Implemented. Same as exit() but
without a security manager check.
(exit): Call _exit after security check.
* prims.cc (JvRunMain): Call Runtime._exit to shutdown the runtime
"naturally".
* java/lang/System.java (setSecurityManager): If a security manager
is already in place, call checkPermission.
* java/lang/ThreadGroup.java (uncaughtException): If printStackTrace()
throws an exception, try to deal with it gracefully.
* java/lang/ExceptionInInitializerError.java (printStackTrace):
Only try to print the subordinate stack trace if "exception" is set.
Print our class name first.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40401 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/lang/ExceptionInInitializerError.java
libjava/java/lang/Runtime.java
libjava/java/lang/System.java
libjava/java/lang/ThreadGroup.java
libjava/java/lang/natRuntime.cc
libjava/prims.cc

index ce7250e..44a3bd8 100644 (file)
@@ -1,3 +1,19 @@
+2001-03-12  Bryce McKinlay  <bryce@albatross.co.nz>
+
+       * java/lang/Runtime.java (_exit): Declare new package-private native.
+       * java/lang/natRuntime.cc (_exit): Implemented. Same as exit() but
+       without a security manager check.
+       (exit): Call _exit after security check.
+       * prims.cc (JvRunMain): Call Runtime._exit to shutdown the runtime
+       "naturally".
+       * java/lang/System.java (setSecurityManager): If a security manager
+       is already in place, call checkPermission. 
+       * java/lang/ThreadGroup.java (uncaughtException): If printStackTrace()
+       throws an exception, try to deal with it gracefully.
+       * java/lang/ExceptionInInitializerError.java (printStackTrace):
+       Only try to print the subordinate stack trace if "exception" is set.
+       Print our class name first.
+
 2001-03-08  Tom Tromey  <tromey@redhat.com>
 
        * java/io/ObjectStreamClass.java (setUID): Don't write interface
index 0aad2fc..95b4311 100644 (file)
@@ -1,6 +1,6 @@
 // ExceptionInInitializerError.java
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -38,7 +38,7 @@ public class ExceptionInInitializerError extends LinkageError
 
   public ExceptionInInitializerError (Throwable e)
   {
-    super ();
+    super (e.toString());
     exception = e;
   }
 
@@ -49,17 +49,35 @@ public class ExceptionInInitializerError extends LinkageError
 
   public void printStackTrace ()
   {
-    exception.printStackTrace ();
+    if (exception != null)
+      {
+       System.err.print (this.getClass() + ": ");
+       exception.printStackTrace ();
+      }
+    else
+      super.printStackTrace ();
   }
 
   public void printStackTrace (PrintStream ps)
   {
-    exception.printStackTrace (ps);
+    if (exception != null)
+      {
+       ps.print (this.getClass() + ": ");
+       exception.printStackTrace (ps);
+      }
+    else
+      super.printStackTrace (ps);
   }
 
   public void printStackTrace (PrintWriter pw)
   {
-    exception.printStackTrace (pw);
+    if (exception != null)
+      {
+       pw.print (this.getClass() + ": ");
+       exception.printStackTrace (pw);
+      }
+    else
+      super.printStackTrace (pw);
   }
 
   // The exception that caused this error.
index e746c60..28befc2 100644 (file)
@@ -1,6 +1,6 @@
 // Runtime.java - Runtime class.
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -63,6 +63,10 @@ public class Runtime
   }
 
   public native void exit (int status);
+  
+  // Shutdown the runtime without a SecurityManager check. libgcj uses this 
+  // exit function internally.
+  final native void _exit (int status);
 
   public native long freeMemory ();
   public native void gc ();
index 162bc1f..0f7bd7b 100644 (file)
@@ -230,7 +230,7 @@ public final class System
   public static void setSecurityManager (SecurityManager s)
   {
     if (secman != null)
-      throw new SecurityException ();
+      secman.checkPermission(new RuntimePermission("setSecurityManager"));
     secman = s;
   }
 
index e8b4446..bdf37f9 100644 (file)
@@ -511,7 +511,19 @@ public class ThreadGroup
       {
         if (thread != null)
           System.out.print("Exception in thread \"" + thread.getName() + "\" ");
-       t.printStackTrace();
+       try
+         {
+           t.printStackTrace();
+         }
+       catch (Throwable x)
+         {
+           // This means that something is badly screwed up with the runtime,
+           // or perhaps someone is messing with the SecurityManager. In any
+           // case, try to deal with it gracefully.
+           System.out.println(t);
+           System.err.println("*** Got " + x.toString() + 
+                              " while trying to print stack trace");
+         }
        had_uncaught_exception = true;
       }
   }
index 5ff7d2e..3f1a0b3 100644 (file)
@@ -1,6 +1,6 @@
 // natRuntime.cc - Implementation of native side of Runtime class.
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -78,7 +78,12 @@ void
 java::lang::Runtime::exit (jint status)
 {
   checkExit (status);
+  _exit (status);
+}
 
+void
+java::lang::Runtime::_exit (jint status)
+{
   // Make status right for Unix.  This is perhaps strange.
   if (status < 0 || status > 255)
     status = 255;
index 85264bb..f68b2f0 100644 (file)
@@ -850,7 +850,7 @@ JvRunMain (jclass klass, int argc, const char **argv)
 
   int status = (int) java::lang::ThreadGroup::had_uncaught_exception;
     
-  java::lang::Runtime::getRuntime ()->exit (status);
+  java::lang::Runtime::getRuntime ()->_exit (status);
 }
 
 void