VMThrowable.java (getStackTrace): Pass trace as-is to modified lookup().

* java/lang/VMThrowable.java (getStackTrace): Pass trace as-is to
	modified lookup().
	* gnu/gcj/runtime/NameFinder.java (lookup): Change to take in a
	StackTraceElement directly.
	(newElement): New native helper method to create StackTraceElement
	bypassing Java access control.
	(createStackTraceElement): Use newElement() instead of directly
	calling StackTraceElement's constructor.
	* gnu/gcj/runtime/natNameFinder.cc (newElement): New method.

From-SVN: r80541
This commit is contained in:
Ranjit Mathew 2004-04-09 04:39:24 +00:00 committed by Ranjit Mathew
parent 886733617a
commit 84264cb69e
4 changed files with 43 additions and 8 deletions

View File

@ -1,3 +1,15 @@
2004-04-09 Ranjit Mathew <rmathew@hotmail.com>
* java/lang/VMThrowable.java (getStackTrace): Pass trace as-is to
modified lookup().
* gnu/gcj/runtime/NameFinder.java (lookup): Change to take in a
StackTraceElement directly.
(newElement): New native helper method to create StackTraceElement
bypassing Java access control.
(createStackTraceElement): Use newElement() instead of directly
calling StackTraceElement's constructor.
* gnu/gcj/runtime/natNameFinder.cc (newElement): New method.
2004-04-01 Michael Koch <konqueror@gmx.de>
* java/lang/SecurityManager.java

View File

@ -1,5 +1,5 @@
/* NameFinder.java -- Translates addresses to StackTraceElements.
Copyright (C) 2002 Free Software Foundation, Inc.
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of libgcj.
@ -241,8 +241,11 @@ public class NameFinder
* Given an Throwable and a native stacktrace returns an array of
* StackTraceElement containing class, method, file and linenumbers.
*/
public StackTraceElement[] lookup(Throwable t, RawData addrs, int length)
public StackTraceElement[] lookup(Throwable t, StackTrace trace)
{
RawData addrs = trace.stackTraceAddrs();
int length = trace.length();
StackTraceElement[] elements = new StackTraceElement[length];
for (int i=0; i < length; i++)
elements[i] = lookup(addrs, i);
@ -352,6 +355,16 @@ public class NameFinder
return stack;
}
/**
* Native helper method to create a StackTraceElement. Needed to work
* around normal Java access restrictions.
*/
native private StackTraceElement newElement(String fileName,
int lineNumber,
String className,
String methName,
boolean isNative);
/**
* Creates a StackTraceElement given a string and a filename.
* Splits the given string into the class and method part.
@ -363,7 +376,7 @@ public class NameFinder
private StackTraceElement createStackTraceElement(String name, String file)
{
if (!demangle)
return new StackTraceElement(file, -1, null, name, false);
return newElement(file, -1, null, name, false);
String s = demangleName(name);
String methodName = s;
@ -409,7 +422,7 @@ public class NameFinder
}
}
return new StackTraceElement(fileName, line, className, methodName, false);
return newElement(fileName, line, className, methodName, false);
}
/**

View File

@ -1,6 +1,6 @@
// natNameFinder.cc - native helper methods for NameFinder.java
/* Copyright (C) 2002, 2003 Free Software Foundation, Inc
/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc
This file is part of libgcj.
@ -48,6 +48,17 @@ details. */
#endif /* ! __USER_LABEL_PREFIX__ */
java::lang::StackTraceElement*
gnu::gcj::runtime::NameFinder::newElement (java::lang::String* fileName,
jint lineNumber,
java::lang::String* className,
java::lang::String* methName,
jboolean isNative)
{
return new java::lang::StackTraceElement( fileName, lineNumber,
className, methName, isNative);
}
java::lang::String*
gnu::gcj::runtime::NameFinder::getExternalLabel (java::lang::String* name)
{

View File

@ -1,5 +1,5 @@
/* java.lang.VMThrowable -- VM support methods for Throwable.
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -96,8 +96,7 @@ final class VMThrowable
if (trace != null)
{
NameFinder nameFinder = new NameFinder();
result = nameFinder.lookup(t, trace.stackTraceAddrs(),
trace.length());
result = nameFinder.lookup(t, trace);
nameFinder.close();
}
else