mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| // natThrowable.cc - Superclass for all exceptions.
 | |
| 
 | |
| /* Copyright (C) 2000  Red Hat Inc
 | |
| 
 | |
|    This file is part of libgcj.
 | |
| 
 | |
| This software is copyrighted work licensed under the terms of the
 | |
| Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
 | |
| details.  */
 | |
| 
 | |
| /**
 | |
|  * @author Andrew Haley <aph@cygnus.com>
 | |
|  * @date Jan 6  2000
 | |
|  */
 | |
| 
 | |
| #include <config.h>
 | |
| 
 | |
| #include <string.h>
 | |
| 
 | |
| #include <gcj/cni.h>
 | |
| #include <jvm.h>
 | |
| #include <java/lang/Object.h>
 | |
| #include <java-threads.h>
 | |
| #include <java/lang/Throwable.h>
 | |
| #include <java/io/PrintStream.h>
 | |
| #include <java/io/PrintWriter.h>
 | |
| #include <java/io/IOException.h>
 | |
| 
 | |
| #include <sys/types.h>
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #include <unistd.h>
 | |
| 
 | |
| #ifdef HAVE_EXECINFO_H
 | |
| #include <execinfo.h>
 | |
| #endif
 | |
| 
 | |
| #include <name-finder.h>
 | |
| 
 | |
| /* FIXME: size of the stack trace is limited to 128 elements.  It's
 | |
|    undoubtedly sensible to limit the stack trace, but 128 is rather
 | |
|    arbitrary.  It may be better to configure this.  */
 | |
| 
 | |
| java::lang::Throwable *
 | |
| java::lang::Throwable::fillInStackTrace (void)
 | |
| {
 | |
|   if (! trace_enabled)
 | |
|     return this;
 | |
| #if defined (HAVE_BACKTRACE)
 | |
|   void *p[128];
 | |
|   
 | |
|   // We subtract 1 from the number of elements because we don't want
 | |
|   // to include the call to fillInStackTrace in the trace.
 | |
|   int n = backtrace (p, 128) - 1;  
 | |
| 
 | |
|   if (n > 0)
 | |
|     {
 | |
|       // We copy the array below to deal with alignment issues.
 | |
|       stackTrace = JvNewByteArray (n * sizeof p[0]);
 | |
|       memcpy (elements (stackTrace), p+1, (n * sizeof p[0]));
 | |
|     }
 | |
| 
 | |
| #endif
 | |
| 
 | |
|   return this;
 | |
| }
 | |
| 
 | |
| void 
 | |
| java::lang::Throwable::printRawStackTrace (java::io::PrintWriter *wr)
 | |
| {
 | |
|   wr->println (toString ());
 | |
| #ifdef HAVE_BACKTRACE
 | |
|   if (!stackTrace)
 | |
|     return;
 | |
| 
 | |
|   int depth = stackTrace->length / sizeof (void *);
 | |
|   void *p[depth];
 | |
|   memcpy (p, elements (stackTrace), sizeof p);
 | |
| 
 | |
|   _Jv_name_finder finder (_Jv_ThisExecutable ());
 | |
| 
 | |
|   for (int i = 0; i < depth; i++)
 | |
|     {
 | |
|       bool found = finder.lookup (p[i]);
 | |
|       wr->print (JvNewStringLatin1 ("   at "));
 | |
|       wr->print (JvNewStringLatin1 (finder.hex));
 | |
|       if (found)
 | |
| 	{
 | |
| 	  wr->print (JvNewStringLatin1 (": "));
 | |
| 	  wr->print (JvNewStringLatin1 (finder.method_name));
 | |
| 	  if (finder.file_name[0])
 | |
| 	    {
 | |
| 	      wr->print (JvNewStringLatin1 (" ("));
 | |
| 	      wr->print (JvNewStringLatin1 (finder.file_name));
 | |
| 	      wr->print (JvNewStringLatin1 (")"));
 | |
| 	    }
 | |
| 	}
 | |
|       wr->println ();
 | |
|     }
 | |
| #endif /* HAVE_BACKTRACE */
 | |
|   wr->flush ();
 | |
| }
 |