diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 6d3454a5eee..787119bde05 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,15 @@ +2004-04-09 Ranjit Mathew + + * 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 * java/lang/SecurityManager.java diff --git a/libjava/gnu/gcj/runtime/NameFinder.java b/libjava/gnu/gcj/runtime/NameFinder.java index 0c358368390..024a6eeb232 100644 --- a/libjava/gnu/gcj/runtime/NameFinder.java +++ b/libjava/gnu/gcj/runtime/NameFinder.java @@ -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); } /** diff --git a/libjava/gnu/gcj/runtime/natNameFinder.cc b/libjava/gnu/gcj/runtime/natNameFinder.cc index 41b8f4badf2..d688884ca36 100644 --- a/libjava/gnu/gcj/runtime/natNameFinder.cc +++ b/libjava/gnu/gcj/runtime/natNameFinder.cc @@ -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) { diff --git a/libjava/java/lang/VMThrowable.java b/libjava/java/lang/VMThrowable.java index 4c3385757c4..102916a5d7c 100644 --- a/libjava/java/lang/VMThrowable.java +++ b/libjava/java/lang/VMThrowable.java @@ -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