Commit 43c5c8a6 by Andrew Haley Committed by Andrew Haley

Throwable.java (CPlusPlusDemangler): New class.

2000-02-04  Andrew Haley  <aph@cygnus.com>

        * java/lang/Throwable.java (CPlusPlusDemangler): New class.
        (printStackTrace): Use a CPlusPlusDemangler to demangle names.
        * java/lang/natThrowable.cc (printRawStackTrace): Rename
        printStackTrace to printRawStackTrace.

From-SVN: r31785
parent 8760eaae
2000-02-04 Andrew Haley <aph@cygnus.com>
* java/lang/Throwable.java (CPlusPlusDemangler): New class.
(printStackTrace): Use a CPlusPlusDemangler to demangle names.
* java/lang/natThrowable.cc (printRawStackTrace): Rename
printStackTrace to printRawStackTrace.
2000-02-03 Tom Tromey <tromey@cygnus.com> 2000-02-03 Tom Tromey <tromey@cygnus.com>
* java/util/Calendar.java (toString): New method. * java/util/Calendar.java (toString): New method.
......
...@@ -13,6 +13,9 @@ import java.io.PrintStream; ...@@ -13,6 +13,9 @@ import java.io.PrintStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.Serializable; import java.io.Serializable;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
/** /**
* @author Tom Tromey <tromey@cygnus.com> * @author Tom Tromey <tromey@cygnus.com>
...@@ -25,6 +28,69 @@ import java.io.OutputStreamWriter; ...@@ -25,6 +28,69 @@ import java.io.OutputStreamWriter;
* bytecode not implemented. JDK 1.1. * bytecode not implemented. JDK 1.1.
*/ */
/* A CPlusPlusDemangler sits on top of a PrintWriter. All input is
* passed through the "c++filt" program (part of GNU binutils) which
* demangles internal symbols to their C++ source form.
*
* Closing a CPlusPlusDemangler doesn't close the underlying
* PrintWriter; it does, however close underlying process and flush
* all its buffers, so it's possible to guarantee that after a
* CPlusPlusDemangler has been closed no more will ever be written to
* the underlying PrintWriter.
*
* FIXME: This implictly converts data from the input stream, which is
* a stream of characters, to a stream of bytes. We need a way of
* handling Unicode characters in demangled identifiers. */
class CPlusPlusDemangler extends OutputStream
{
java.io.OutputStream procOut;
java.io.InputStream procIn;
java.lang.Process proc;
PrintWriter p;
/* The number of bytes written to the underlying PrintWriter. This
provides a crude but fairly portable way to determine whether or
not the attempt to exec c++filt worked. */
public int written = 0;
CPlusPlusDemangler (PrintWriter writer) throws IOException
{
p = writer;
proc = Runtime.getRuntime ().exec ("c++filt");
procOut = proc.getOutputStream ();
procIn = proc.getInputStream ();
}
public void write (int b) throws IOException
{
procOut.write (b);
while (procIn.available () != 0)
{
int c = procIn.read ();
if (c == -1)
break;
else
{
p.write (c);
written++;
}
}
}
public void close () throws IOException
{
procOut.close ();
int c;
while ((c = procIn.read ()) != -1)
{
p.write (c);
written++;
}
p.flush ();
}
}
public class Throwable implements Serializable public class Throwable implements Serializable
{ {
public native Throwable fillInStackTrace (); public native Throwable fillInStackTrace ();
...@@ -46,11 +112,27 @@ public class Throwable implements Serializable ...@@ -46,11 +112,27 @@ public class Throwable implements Serializable
public void printStackTrace (PrintStream ps) public void printStackTrace (PrintStream ps)
{ {
printStackTrace (new PrintWriter(new OutputStreamWriter(ps))); PrintWriter writer = new PrintWriter (ps);
printStackTrace (writer);
} }
public native void printStackTrace (PrintWriter wr); public void printStackTrace (PrintWriter wr)
{
try
{
CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr);
PrintWriter writer = new PrintWriter (cPlusPlusFilter);
printRawStackTrace (writer);
writer.close ();
if (cPlusPlusFilter.written == 0) // The demangler has failed...
printRawStackTrace (wr);
}
catch (Exception e1)
{
printRawStackTrace (wr);
}
}
public Throwable () public Throwable ()
{ {
detailMessage = null; detailMessage = null;
...@@ -70,6 +152,8 @@ public class Throwable implements Serializable ...@@ -70,6 +152,8 @@ public class Throwable implements Serializable
: getClass().getName() + ": " + getMessage ()); : getClass().getName() + ": " + getMessage ());
} }
private native final void printRawStackTrace (PrintWriter wr);
// Name of this field comes from serialization spec. // Name of this field comes from serialization spec.
private String detailMessage; private String detailMessage;
......
...@@ -24,6 +24,7 @@ details. */ ...@@ -24,6 +24,7 @@ details. */
#include <java/lang/Throwable.h> #include <java/lang/Throwable.h>
#include <java/io/PrintStream.h> #include <java/io/PrintStream.h>
#include <java/io/PrintWriter.h> #include <java/io/PrintWriter.h>
#include <java/io/IOException.h>
#include <sys/types.h> #include <sys/types.h>
...@@ -61,7 +62,7 @@ java::lang::Throwable::fillInStackTrace (void) ...@@ -61,7 +62,7 @@ java::lang::Throwable::fillInStackTrace (void)
} }
void void
java::lang::Throwable::printStackTrace (java::io::PrintWriter *wr) java::lang::Throwable::printRawStackTrace (java::io::PrintWriter *wr)
{ {
wr->println (toString ()); wr->println (toString ());
#ifdef HAVE_BACKTRACE #ifdef HAVE_BACKTRACE
...@@ -90,4 +91,3 @@ java::lang::Throwable::printStackTrace (java::io::PrintWriter *wr) ...@@ -90,4 +91,3 @@ java::lang::Throwable::printStackTrace (java::io::PrintWriter *wr)
} }
#endif /* HAVE_BACKTRACE */ #endif /* HAVE_BACKTRACE */
} }
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