From 44de5bed8dfe57d0720d38acda253711bd6d28e5 Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 30 Jan 2004 06:45:24 +0000 Subject: [PATCH] 2002/04/27 03:42:52 darcs-hash:20040130064524-2ba56-84cea73858dae3d9b456c37c97b7ee0f74cc0c30.gz --- CHANGES | 7 ++ README | 224 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 231 insertions(+) diff --git a/CHANGES b/CHANGES index bd4a9c9..76d3a1a 100644 --- a/CHANGES +++ b/CHANGES @@ -34,4 +34,11 @@ 26-Apr megacz src/org/xwt/Main.java: included text description on splash screen +26-Apr megacz src/org/xwt/plat/Win32.xml, src/org/xwt/plat/Java2.xml: + adjusted dist / signature process. + +26-Apr megacz README: included printStackTrace() patch + + + diff --git a/README b/README index b03a8cc..10b4465 100644 --- a/README +++ b/README @@ -149,6 +149,8 @@ Building without it, however, since it puts additional strain on the gcc cvs server. + There's also a patch at the end of this file which can be applied to + the branch in order to make Throwable.printStackTrace() work. # create an install area export CLASSPATH= @@ -195,3 +197,225 @@ Building make sudo make install + + +______________________________________________________________________________ +Throwable.printStackTrace() patch + +Index: Class.h +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v +retrieving revision 1.43 +diff -u -r1.43 Class.h +--- Class.h 21 Dec 2001 19:47:50 -0000 1.43 ++++ Class.h 24 Apr 2002 03:06:14 -0000 +@@ -308,6 +308,7 @@ + friend void _Jv_LayoutVTableMethods (jclass klass); + friend void _Jv_SetVTableEntries (jclass, _Jv_VTable *); + friend void _Jv_MakeVTable (jclass); ++ friend JArray* _Jv_GetAllMethods(); + + // Return array class corresponding to element type KLASS, creating it if + // necessary. +Index: ClassLoader.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/lang/ClassLoader.java,v +retrieving revision 1.16 +diff -u -r1.16 ClassLoader.java +--- ClassLoader.java 7 Dec 2001 23:34:12 -0000 1.16 ++++ ClassLoader.java 24 Apr 2002 03:06:14 -0000 +@@ -577,4 +577,8 @@ + // Default to returning null. Derived classes implement this. + return null; + } ++ ++ static native java.lang.reflect.Method[] getAllMethods(); ++ static native long[] getAllMethodAddrs(); ++ + } +Index: Throwable.java +=================================================================== +RCS file: /cvs/gcc/gcc/libjava/java/lang/Throwable.java,v +retrieving revision 1.10 +diff -u -r1.10 Throwable.java +--- Throwable.java 24 Feb 2001 03:52:49 -0000 1.10 ++++ Throwable.java 24 Apr 2002 03:06:14 -0000 +@@ -123,21 +123,64 @@ + printStackTrace (writer); + } + ++ private native static long longFromStackTraceBytes(byte[] stackTrace, int i); ++ + public void printStackTrace (PrintWriter wr) + { +- try +- { +- CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr); +- PrintWriter writer = new PrintWriter (cPlusPlusFilter); +- printRawStackTrace (writer); +- writer.close (); +- if (cPlusPlusFilter.written == 0) // The demangler has failed... +- printRawStackTrace (wr); ++ try ++ { ++ CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr); ++ PrintWriter writer = new PrintWriter (cPlusPlusFilter); ++ printRawStackTrace (writer); ++ writer.close (); ++ if (cPlusPlusFilter.written > 0) return; ++ } ++ catch (Exception e1) ++ { ++ } ++ ++ wr.println(toString()); ++ if (stackTrace == null) { ++ wr.flush(); ++ return; + } +- catch (Exception e1) +- { +- printRawStackTrace (wr); ++ ++ long[] allAddrs = ClassLoader.getAllMethodAddrs(); ++ java.lang.reflect.Method[] meths = ClassLoader.getAllMethods(); ++ ++ // FIXME: assumes little endian ++ for(int i=0; i + #include + #include ++#include ++ ++#include ++#include + + // FIXME: remove these. + #define CloneableClass java::lang::Cloneable::class$ +@@ -347,6 +351,50 @@ + static jclass loaded_classes[HASH_LEN]; + + // This is the root of a linked list of classes ++ ++JArray* ++java::lang::ClassLoader::getAllMethods() ++{ ++ return _Jv_GetAllMethods(); ++} ++ ++JArray* ++java::lang::ClassLoader::getAllMethodAddrs() ++{ ++ JArray* arr = _Jv_GetAllMethods(); ++ java::lang::reflect::Method** el = (java::lang::reflect::Method**)elements(arr); ++ JArray* ret = JvNewLongArray(arr->length); ++ jlong* retel = (jlong*)elements(ret); ++ for(int i=0; ilength; i++) ++ retel[i] = (jlong)((unsigned int)(_Jv_FromReflectedMethod (el[i])->ncode)); ++ return ret; ++} ++ ++JArray* ++_Jv_GetAllMethods() ++{ ++ int numMethods = 0; ++ ++ for(int i=0; inext) ++ numMethods += c->getDeclaredMethods()->length; ++ ++ JArray* ret = ++ (JArray*) ++ JvNewObjectArray(numMethods, &java::lang::reflect::Method::class$, NULL); ++ ++ java::lang::reflect::Method** el = (java::lang::reflect::Method**)elements(ret); ++ ++ for(int i=0; inext) { ++ JArray* methods = c->getDeclaredMethods(); ++ jint len = methods->length; ++ java::lang::reflect::Method** meths = (java::lang::reflect::Method**)elements(methods); ++ for(int j=0; j + + #include ++#include + + #ifdef HAVE_EXECINFO_H + #include +@@ -102,3 +103,18 @@ + #endif /* HAVE_BACKTRACE */ + wr->flush (); + } ++ ++// Returns the i^th call address in the stackTrace member, or 0 if i ++// is beyond the end of the trace. This has to be done in C++ because ++// the addresses in stackTrace are the same width as the platform's ++// pointers (which is unknown to Java code), and stackTrace is a ++// byte[] using the platform's endianness (which is unknown to Java ++// code). ++jlong ++java::lang::Throwable::longFromStackTraceBytes(jbyteArray stackArr, jint i) ++{ ++ if (i * sizeof(void*) > stackArr->length) return 0; ++ unsigned int* stack = (unsigned int*)elements(stackArr); ++ return (jlong)stack[i]; ++} ++ -- 1.7.10.4