This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi,
this patch cleans up some stack trace issues, makes sure that the
initial NoClassDefFoundError is chained with the proper cause and fixes
a buglet that Andrew spotted where our StackTraceElements had null
method or class names.
This patch removes the extra creation and wrapping of the
NoClassFoundException in ClassLoader.loadClass() which makes the
implementation of this method similar to the GNU Classpath version
again. This code was added in the very early stages of the new-bc-abi
branch with a lot of other experimental ClassLoader changes. None of
that code survived, only this little snippet was brought on the trunk in
the end. I suspect that it was debugging code that had to be removed
anyway. The extra wrapping of the exception was actually confusing since
it would duplicate the stack trace in the cause again. We do loose the
little extra information in adding the parent exception message. But I
think the fact that loadClass() is now much simpler and doesn't create
an extra ClassNotFoundException makes more then up for that.
2005-02-10 Mark Wielaard <mark@klomp.org>
Fixes bug libgcj/8170
* java/lang/ClassLoader.java (loadClass): Don't rewrap
ClassNotFoundException.
* gnu/java/lang/MainThread.java (run): Chain NoClassDefFoundError.
* gnu/gcj/runtime/NameFinder.java (remove_interpreter): Removed.
(remove_internal): New field superceding remove_interpreter.
(sanitizeStack): Remove all no-package classes starting with "_Jv_".
Remove no-class methods starting with "_Jv_". And Replace null
class or method names with the empty string. Stop at either the
MainThread or a real Thread run() method.
(newElement): Made static.
OK to commit?
No regressions and (long) stack traces look much nicer in tools such as
eclipse with this.
Cheers,
Mark
Index: java/lang/ClassLoader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/ClassLoader.java,v
retrieving revision 1.36
diff -u -r1.36 ClassLoader.java
--- java/lang/ClassLoader.java 7 Jan 2005 22:15:46 -0000 1.36
+++ java/lang/ClassLoader.java 11 Feb 2005 02:08:16 -0000
@@ -288,8 +288,6 @@
if (c != null)
return c;
- ClassNotFoundException ex = null;
-
// Can the class be loaded by a parent?
try
{
@@ -306,20 +304,9 @@
}
catch (ClassNotFoundException e)
{
- ex = e;
}
// Still not found, we have to do it ourself.
- try
- {
- c = findClass(name);
- }
- catch (ClassNotFoundException cause)
- {
- if (ex != null)
- throw new ClassNotFoundException(ex.toString(), cause);
- else
- throw cause;
- }
+ c = findClass(name);
if (resolve)
resolveClass(c);
return c;
Index: gnu/java/lang/MainThread.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/lang/MainThread.java,v
retrieving revision 1.2
diff -u -r1.2 MainThread.java
--- gnu/java/lang/MainThread.java 29 Jul 2004 13:48:17 -0000 1.2
+++ gnu/java/lang/MainThread.java 11 Feb 2005 02:08:16 -0000
@@ -95,7 +95,9 @@
}
catch (ClassNotFoundException x)
{
- throw new NoClassDefFoundError(klass_name);
+ NoClassDefFoundError ncdfe = new NoClassDefFoundError(klass_name);
+ ncdfe.initCause(x);
+ throw ncdfe;
}
}
Index: gnu/gcj/runtime/NameFinder.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/gcj/runtime/NameFinder.java,v
retrieving revision 1.7
diff -u -r1.7 NameFinder.java
--- gnu/gcj/runtime/NameFinder.java 9 Apr 2004 04:39:24 -0000 1.7
+++ gnu/gcj/runtime/NameFinder.java 11 Feb 2005 02:08:16 -0000
@@ -37,8 +37,8 @@
* Whether calls to unknown functions (class and method names are unknown)
* should be removed from the stack trace. Only done when the stack is
* sanitized.</ul>
- * <ul><code>gnu.gcj.runtime.NameFinder.remove_interpreter</code>
- * Whether runtime interpreter calls (methods in the _Jv_InterpMethod class
+ * <ul><code>gnu.gcj.runtime.NameFinder.remove_internal</code>
+ * Whether runtime internal calls (methods in the internal _Jv_* classes
* and functions starting with 'ffi_') should be removed from the stack
* trace. Only done when the stack is sanitized.</ul>
* <ul><code>gnu.gcj.runtime.NameFinder.use_addr2line</code>
@@ -72,10 +72,18 @@
= Boolean.valueOf(System.getProperty
("gnu.gcj.runtime.NameFinder.remove_unknown", "true")
).booleanValue();
- private static final boolean remove_interpreter
- = Boolean.valueOf(System.getProperty
+
+ // The remove_interpreter name is an old 3.3/3.4 (deprecated) synonym.
+ private static final boolean remove_internal
+ = (Boolean.valueOf(System.getProperty
+ ("gnu.gcj.runtime.NameFinder.remove_internal", "true")
+ ).booleanValue()
+ ||
+ Boolean.valueOf(System.getProperty
("gnu.gcj.runtime.NameFinder.remove_interpreter", "true")
- ).booleanValue();
+ ).booleanValue()
+ );
+
private static final boolean use_addr2line
= Boolean.valueOf(System.getProperty
("gnu.gcj.runtime.NameFinder.use_addr2line", "true")
@@ -280,7 +288,7 @@
consName = className.substring(lastDot + 1) + '(';
int unknown = 0;
- int interpreter = 0;
+ int internal = 0;
int last_throw = -1;
int length = elements.length;
int end = length-1;
@@ -300,19 +308,23 @@
|| MName.startsWith("fillInStackTrace("))))
{
last_throw = i;
- // Reset counting of unknown and interpreter frames.
+ // Reset counting of unknown and internal frames.
unknown = 0;
- interpreter = 0;
+ internal = 0;
}
else if (remove_unknown && CName == null
&& (MName == null || MName.startsWith("0x")))
unknown++;
- else if (remove_interpreter
+ else if (remove_internal
&& ((CName == null
&& MName != null && MName.startsWith("ffi_"))
- || (CName != null && CName.equals("_Jv_InterpMethod"))))
- interpreter++;
- else if ("main(java.lang.String[])".equals(MName))
+ || (CName != null && CName.startsWith("_Jv_"))
+ || (CName == null && MName != null
+ && MName.startsWith("_Jv_"))))
+ internal++;
+ else if (("java.lang.Thread".equals(CName)
+ || "gnu.java.lang.MainThread".equals(CName))
+ && "run()".equals(MName))
{
end = i;
break;
@@ -321,11 +333,11 @@
int begin = last_throw+1;
// Now filter out everything at the start and the end that is not part
- // of the "normal" user program including any elements that are interpreter
+ // of the "normal" user program including any elements that are internal
// calls or have no usefull information whatsoever.
// Unless that means we filter out all info.
- int nr_elements = end-begin-unknown-interpreter+1;
- if ((begin > 0 || end < length-1 || unknown > 0 || interpreter > 0)
+ int nr_elements = end - begin - unknown - internal + 1;
+ if ((begin > 0 || end < length-1 || unknown > 0 || internal > 0)
&& nr_elements > 0)
{
stack = new StackTraceElement[nr_elements];
@@ -337,14 +349,27 @@
if (remove_unknown && CName == null
&& (MName == null || MName.startsWith("0x")))
; // Skip unknown frame
- else if (remove_interpreter
+ else if (remove_internal
&& ((CName == null
- && MName != null && MName.startsWith("ffi_"))
- || (CName != null && CName.equals("_Jv_InterpMethod"))))
- ; // Skip interpreter runtime frame
+ && MName != null && MName.startsWith("ffi_"))
+ || (CName != null && CName.startsWith("_Jv_"))
+ || (CName == null && MName != null
+ && MName.startsWith("_Jv_"))))
+ ; // Skip internal runtime frame
else
{
- stack[pos] = elements[i];
+ // Null Class or Method name in elements are not allowed.
+ if (MName == null || CName == null)
+ {
+ MName = MName == null ? "" : MName;
+ CName = CName == null ? "" : CName;
+ stack[pos] = newElement(elements[i].getFileName(),
+ elements[i].getLineNumber(),
+ CName, MName,
+ elements[i].isNativeMethod());
+ }
+ else
+ stack[pos] = elements[i];
pos++;
}
}
@@ -359,11 +384,11 @@
* 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);
+ native static private StackTraceElement newElement(String fileName,
+ int lineNumber,
+ String className,
+ String methName,
+ boolean isNative);
/**
* Creates a StackTraceElement given a string and a filename.
Attachment:
signature.asc
Description: This is a digitally signed message part
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |