Commit 456c0b60 by Bryce McKinlay Committed by Bryce McKinlay

Runtime.java (_exit): Declare new package-private native.

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.

From-SVN: r40401
parent 9612ab65
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> 2001-03-08 Tom Tromey <tromey@redhat.com>
* java/io/ObjectStreamClass.java (setUID): Don't write interface * java/io/ObjectStreamClass.java (setUID): Don't write interface
......
// ExceptionInInitializerError.java // 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. This file is part of libgcj.
...@@ -38,7 +38,7 @@ public class ExceptionInInitializerError extends LinkageError ...@@ -38,7 +38,7 @@ public class ExceptionInInitializerError extends LinkageError
public ExceptionInInitializerError (Throwable e) public ExceptionInInitializerError (Throwable e)
{ {
super (); super (e.toString());
exception = e; exception = e;
} }
...@@ -49,17 +49,35 @@ public class ExceptionInInitializerError extends LinkageError ...@@ -49,17 +49,35 @@ public class ExceptionInInitializerError extends LinkageError
public void printStackTrace () public void printStackTrace ()
{ {
exception.printStackTrace (); if (exception != null)
{
System.err.print (this.getClass() + ": ");
exception.printStackTrace ();
}
else
super.printStackTrace ();
} }
public void printStackTrace (PrintStream ps) 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) 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. // The exception that caused this error.
......
// Runtime.java - Runtime class. // 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. This file is part of libgcj.
...@@ -63,6 +63,10 @@ public class Runtime ...@@ -63,6 +63,10 @@ public class Runtime
} }
public native void exit (int status); 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 long freeMemory ();
public native void gc (); public native void gc ();
......
...@@ -230,7 +230,7 @@ public final class System ...@@ -230,7 +230,7 @@ public final class System
public static void setSecurityManager (SecurityManager s) public static void setSecurityManager (SecurityManager s)
{ {
if (secman != null) if (secman != null)
throw new SecurityException (); secman.checkPermission(new RuntimePermission("setSecurityManager"));
secman = s; secman = s;
} }
......
...@@ -511,7 +511,19 @@ public class ThreadGroup ...@@ -511,7 +511,19 @@ public class ThreadGroup
{ {
if (thread != null) if (thread != null)
System.out.print("Exception in thread \"" + thread.getName() + "\" "); 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; had_uncaught_exception = true;
} }
} }
......
// natRuntime.cc - Implementation of native side of Runtime class. // 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. This file is part of libgcj.
...@@ -78,7 +78,12 @@ void ...@@ -78,7 +78,12 @@ void
java::lang::Runtime::exit (jint status) java::lang::Runtime::exit (jint status)
{ {
checkExit (status); checkExit (status);
_exit (status);
}
void
java::lang::Runtime::_exit (jint status)
{
// Make status right for Unix. This is perhaps strange. // Make status right for Unix. This is perhaps strange.
if (status < 0 || status > 255) if (status < 0 || status > 255)
status = 255; status = 255;
......
...@@ -850,7 +850,7 @@ JvRunMain (jclass klass, int argc, const char **argv) ...@@ -850,7 +850,7 @@ JvRunMain (jclass klass, int argc, const char **argv)
int status = (int) java::lang::ThreadGroup::had_uncaught_exception; int status = (int) java::lang::ThreadGroup::had_uncaught_exception;
java::lang::Runtime::getRuntime ()->exit (status); java::lang::Runtime::getRuntime ()->_exit (status);
} }
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment