StackTraceElements (Was: [kaffe] Notes on kaffe (GNU Classpath
integration) todo items)
Mark Wielaard
mark@klomp.org
Mon Jul 14 15:55:01 2003
--=-2oaiCL66qrjsHvIE7iFl
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Hi,
On Mon, 2003-07-14 at 10:19, Helmer Kr=E4mer wrote:
> i've got a working version of this in my local tree
> (jetty for jdk 1.4 was working fine with it), but
> somehow didn't get around to commit it :( Could you
> probably post a patch of your implementation so I
> can fix and commit it?
I got rid of the crashes, but there are still some regression test
failures (some are just textual since the output of the stack trace is
different, but some seem real).
The attached patch merges Throwable.java from GNU Classpath which is
used as is and adds a Kaffe specific VMThrowable class that holds the
backtrace and provides the actual StackTraceElements when needed.
I have to admit that I actually did not really design it but just copied
bits and pieces of existing code of kaffevm. And C isn't really my
language of choice. So if you could do a review of what I have now that
would be great.
Here is a ChangeLog entry for the attached (gzipped) patch:
2003-07-14 Mark Wielaard <mark@klomp.org>
=
=20
* include/Makefile.am (INSTALL_DERIVED_HDRS): Add
java_lang_VMThrowable.h and java_lang_StackTraceElement.h.
* include/Makefile.in: Regenerated.
* kaffe/kaffevm/baseClasses.h (javaLangVMThrowable): New extern
struct.
(javaLangStackTraceElement): Likewise.
* kaffe/kaffevm/baseClasses.h (javaLangVMThrowable): New base class=
.
(javaLangVMThrowable): Likewise.
(initBaseClasses): loadStaticClass new base classes.
* kaffe/kaffevm/exception.c (throwException): Get and initialize
vmstate.
(nullException): Create vmstate for exception.
(unhandledException): Use new Throwable->detailedMessage field name=
.
(floatingException): Create vmstate for exception.
* kaffe/kaffevm/stackTrace.c (getLineNumber): New method.
(getStackTraceElements): New method.
(printStackTrace): Get backtrace from vmState.
* libraries/clib/native/System.c (java_lang_System_debugE): Use new
Throwable->detailedMessage field name.
* libraries/clib/native/Throwable.c
(java_lang_Throwable_fillInStackTrace): Removed.
(java_lang_Throwable_printStackTrace0): Likewise.
(java_lang_VMThrowable_fillInStackTrace): New method.
(java_lang_VMThrowable_getStackTrace): Likewise.
* libraries/javalib/java/lang/Throwable.java: Replaced with Classpa=
th
version.
* libraries/javalib/java/lang/VMThrowable.java: New class.
* libraries/javalib/bootstrap.classlist: Add VMThrowable.
* libraries/javalib/essential.files: Add StackTaceElement and
VMThrowable.
* libraries/javalib/Klasses.jar.bootstrap: Regenerated.
With this patch the attached program gives the following stack trace:
java.lang.NullPointerException
at Throw.testNull (Throw.java:17)
at Throw.main (Throw.java:5)
=20
java.lang.ArithmeticException
at Throw.testDivZero (Throw.java:30)
at Throw.main (Throw.java:7)
=20
java.lang.Exception: b confused
at Throw.a (Throw.java:58)
at Throw.testChain (Throw.java:42)
at Throw.main (Throw.java:9)
Caused by: java.lang.Exception: d broken
at Throw.c (Throw.java:75)
at Throw.b (Throw.java:64)
at Throw.a (Throw.java:54)
...2 more
Caused by: java.lang.Exception: fatal error
at Throw.e (Throw.java:86)
at Throw.d (Throw.java:81)
at Throw.c (Throw.java:71)
...4 more
BTW how do you keep track of copyrights? I added a new copyright header
to every file I changed, but looking through the rest of the sources
this seems not customary.
Cheers,
Mark
--=-2oaiCL66qrjsHvIE7iFl
Content-Disposition: inline; filename=Throw.java
Content-Type: text/x-java; name=Throw.java; charset=ANSI_X3.4-1968
Content-Transfer-Encoding: base64
cHVibGljIGNsYXNzIFRocm93DQp7DQogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1td
IGFyZ3MpDQogIHsNCiAgICB0ZXN0TnVsbCgpOw0KICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOw0K
ICAgIHRlc3REaXZaZXJvKCk7DQogICAgU3lzdGVtLm91dC5wcmludGxuKCk7DQogICAgdGVzdENo
YWluKCk7DQogIH0NCg0KICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3ROdWxsKCkNCiAgew0KICAg
IHRyeQ0KICAgICAgew0KCU9iamVjdCBvID0gbnVsbDsNCglvLnRvU3RyaW5nKCk7DQogICAgICB9
DQogICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KICAgICAgew0KCXQucHJpbnRTdGFja1RyYWNlKCk7
DQogICAgICB9DQogIH0NCg0KICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3REaXZaZXJvKCkNCiAg
ew0KICAgIHRyeQ0KICAgICAgew0KCWludCBpID0gMDsNCglpbnQgaiA9IDQyL2k7DQogICAgICB9
DQogICAgY2F0Y2ggKFRocm93YWJsZSB0KQ0KICAgICAgew0KCXQucHJpbnRTdGFja1RyYWNlKCk7
DQogICAgICB9DQogIH0NCg0KICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RDaGFpbigpDQogIHsN
CiAgICB0cnkNCiAgICAgIHsNCglhKCk7DQogICAgICB9DQogICAgY2F0Y2goRXhjZXB0aW9uIGUp
DQogICAgICB7DQoJZS5wcmludFN0YWNrVHJhY2UoKTsNCiAgICAgIH0NCiAgfQ0KDQogIHN0YXRp
YyB2b2lkIGEoKSB0aHJvd3MgRXhjZXB0aW9uDQogIHsNCiAgICB0cnkNCiAgICAgIHsNCgliKCk7
DQogICAgICB9DQogICAgY2F0Y2goRXhjZXB0aW9uIGUpDQogICAgICB7DQoJdGhyb3cgbmV3IEV4
Y2VwdGlvbigiYiBjb25mdXNlZCIsIGUpOw0KICAgICAgfQ0KICB9DQoNCiAgc3RhdGljIHZvaWQg
YigpIHRocm93cyBFeGNlcHRpb24NCiAgew0KICAgICAgIGMoKTsNCiAgfQ0KDQogIHN0YXRpYyB2
b2lkIGMoKSB0aHJvd3MgRXhjZXB0aW9uDQogIHsNCiAgICB0cnkNCiAgICAgIHsNCglkKCk7DQog
ICAgICB9DQogICAgY2F0Y2goRXhjZXB0aW9uIGUpDQogICAgICB7DQoJdGhyb3cgbmV3IEV4Y2Vw
dGlvbigiZCBicm9rZW4iLCBlKTsNCiAgICAgIH0NCiAgfQ0KDQogIHN0YXRpYyB2b2lkIGQoKSB0
aHJvd3MgRXhjZXB0aW9uDQogIHsNCiAgICBlKCk7DQogIH0NCiAgDQogIHN0YXRpYyB2b2lkIGUo
KSB0aHJvd3MgRXhjZXB0aW9uDQogIHsNCiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJmYXRhbCBl
cnJvciIpOw0KICB9DQp9DQoJCQkJDQo=
--=-2oaiCL66qrjsHvIE7iFl
Content-Disposition: attachment; filename=throwable.patch.gz
Content-Type: application/x-gzip; name=throwable.patch.gz
Content-Transfer-Encoding: base64
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
AcminaDqmAAA
--=-2oaiCL66qrjsHvIE7iFl--