============================================================================== XWT README ______________________________________________________________________________ Documentation If you're new to XWT, you should read the documentation in the order presented below: - README [this file] Start here. Includes a map of all other documentation and a description of the directory strucure - The XWT home page [http://www.xwt.org/] - The XWT tutorial [http://www.xwt.org/tutorial.html] Gentle introduction to what XWT is, and how to write .xwt's. Good for anybody who wants to write XWT applications. - The XWT reference [http://www.xwt.org/reference.html] Precise, technical spec of exactly how XWT works. Assumes familiarity with XWT (ie, you've read the tutorial). This is the authoritative source for how an XWT engine should behave. - Javadoc [http://www.xwt.org/javadoc/] The org.xwt.* packages are all documented with javadoc. You should start by reading the package summary for org.xwt.Main, and work your way around from there. - Javasrc [http://www.xwt.org/javasrc] Javasrc generates a syntax-colored and hyperlinked html copy of the XWT source code. ______________________________________________________________________________ Directory Structure / AUTHORS - people involved in developing XWT README - this file COPYING - copyright information for all files in this distro TM - trademark information for XWT ant - a unix shell script to launch ant bin/ - all binary stuff generated by ant builds build.xml - ANT build file lib/ - any third-party binary stuff needed during the build process javago - a copy of the javago post-compilation bytecode inliner ant.jar - the Jakarta project's ANT build tool, including Sun's XML parser netscape.jar - minimal set of classes required for compiling against Netcape's Applet interfaces msjvm.jar - minimal set of classes required for compiling against Microsoft's Applet interfaces javasrc.jar - javasrc, a tool for generating hyperlinked, syntax-colored html from java code src/ - all java source files and xwt sources go here jazz/ - jazzlib, which XWT currently uses since libgcj's java.util.zip.* is broken org/ bouncycastle/ - the BouncyCastle Crypto Library mozilla/ - a copy of Rhino, the Mozilla JavaScript interpreter xwt/builtin/ - .xwt's and .png's that are essential to bootstrapping the engine xwt/plat/ - platform-specific code ______________________________________________________________________________ Build Targets *** XWT now requires JDK 1.4 or later to build *** To build, make sure your $JAVA_HOME points to jdk1.4 or later, and type ./ant -Dplat= The name of any class in org.xwt.plat is a valid ; here is a list as of 20-Mar-2002: Win32 - Windows 95 / NT4 or later Java12 - Any Java 1.2+ compliant JVM Valid s are: build - builds a binary for the selected platform The following targets do not require that you specify a platform: compile - compiles all .java's to .class'es clean - empties bin/ and compiled binaries in dist/ ______________________________________________________________________________ Building - WARNING: Jikes 1.16 has a bug which will cause it to generate corrupt .class files; you must downgrade to 1.15 in order to compile XWT. - If you only want to build the JVM version of XWT, delete these three files: xwt/src/org/xwt/plat/Win32.java xwt/src/org/xwt/plat/POSIX.java xwt/src/org/xwt/plat/GCJ.java This will allow XWT to build correctly *without* gcc 3.1. Otherwise, you must compile and install gcc 3.1. - The Win32 native version of XWT can ONLY be built with the very latest pre-release of GCC 3.1. You can follow the steps below to create a cross-compiler from linux to Win32. If the steps below fail, try adding "-D 20-Mar-2002" to the cvs checkout line; 20-Mar-2002 was the last date on which the compiler was known to work. Please don't do this unless you have attempted without it, however, since it puts additional strain on the gcc cvs server. There are also three patches at the end of this file which can be applied to the branch -- the first fixes an inet_addr() bug on Win32, the second fixes a garbage collector bug, and the third enables stack traces. # create an install area export CLASSPATH= export PREFIX=/usr/local/gcc export CC=/usr/bin/gcc sudo rm -rf $PREFIX export PATH=$PATH:$PREFIX/bin sudo mkdir $PREFIX sudo mkdir $PREFIX/i686-pc-mingw32/ wget http://telia.dl.sourceforge.net/sourceforge/mingw/MinGW-1.1.tar.gz sudo tar -C $PREFIX/i686-pc-mingw32/ -xvzf MinGW-1.1.tar.gz wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.11.2.tar.gz tar xzvf binutils-2.11.2.tar.gz cd binutils-2.11.2 ./configure --target=i686-pc-mingw32 --prefix=$PREFIX make sudo make install cd .. cvs -d :pserver:anoncvs@subversions.gnu.org:/cvsroot/gcc co -rgcc-3_1-branch gcc mkdir bin cd bin ../gcc/configure \ --prefix=$PREFIX \ --target=i686-pc-mingw32 \ --host=i686-pc-linux-gnu \ --enable-languages=c,c++,java \ --disable-nls \ --with-as=$PREFIX/i686-pc-mingw32/bin/as \ --with-ld=$PREFIX/i686-pc-mingw32/bin/ld \ --with-gnu-ld \ --with-gnu-as \ --enable-libgcj \ --enable-gc-type=boehm \ --disable-shared \ --enable-threads=win32 \ --disable-hash-synchronization \ --disable-interpreter \ --enable-sjlj-exceptions make sudo make install - The Linux native version is still experimental. You should configure your compiler with: ../gcc/configure \ --prefix=$PREFIX \ --enable-languages=c,c++,java \ --disable-nls \ --enable-libgcj \ --enable-threads=posix \ --enable-hash-synchronization \ --enable-static \ --disable-interpreter ______________________________________________________________________________ Native-Code "ant" ** THIS DOESN'T WORK YET ** Ant takes a long time to start up, mainly because it has to load a JVM. If you compile ant to native code using GCJ, it will load much more quickly. So far, this only works on Linux. mkdir /tmp/ant cd /tmp/ant jar xvf ~/xwt/lib/ant.jar for A in `find * -name \*.properties -or -name \*.txt -or -name \*.mf` do gcj -c --resource $A $A -o $A.o done CLASSPATH= gcj --main=org.apache.tools.ant.Main \ `find . -name \*.class -or -name \*.o` -o ant mv ant ~/xwt/ant ______________________________________________________________________________ inet_addr patch Index: java/net/natInetAddress.cc =================================================================== RCS file: /cvs/gcc/gcc/libjava/java/net/natInetAddress.cc,v retrieving revision 1.18.18.1 diff -u -r1.18.18.1 natInetAddress.cc --- java/net/natInetAddress.cc 4 Mar 2002 20:02:19 -0000 1.18.18.1 +++ java/net/natInetAddress.cc 27 May 2002 22:54:40 -0000 @@ -9,6 +9,7 @@ details. */ #include +#include #ifdef WIN32 Index: include/win32.h =================================================================== RCS file: /cvs/gcc/gcc/libjava/include/win32.h,v retrieving revision 1.3.8.5 diff -u -r1.3.8.5 win32.h --- include/win32.h 24 Apr 2002 01:04:45 -0000 1.3.8.5 +++ include/win32.h 27 May 2002 22:54:40 -0000 @@ -35,4 +35,8 @@ ARRAY and return the exact number of values stored. */ extern int backtrace (void **__array, int __size); +// configure cannot correctly detect inet_addr due to Win32's +// oddball header naming scheme +#define HAVE_INET_ADDR + #endif /* __JV_WIN32_H__ */ ______________________________________________________________________________ GC patch Index: win32_threads.c =================================================================== RCS file: /cvs/gcc/gcc/boehm-gc/win32_threads.c,v retrieving revision 1.9.2.2 diff -u -r1.9.2.2 win32_threads.c --- win32_threads.c 29 Jun 2002 17:29:51 -0000 1.9.2.2 +++ win32_threads.c 2 Jul 2002 18:10:02 -0000 @@ -134,10 +134,7 @@ (LPCONTEXT)&thread_table[i].context)) ABORT("GetThreadContext failed"); # ifdef I386 - if (thread_table[i].context.Esp >= (DWORD)thread_table[i].stack - || thread_table[i].context.Esp < (DWORD)bottom) - ABORT("Thread stack pointer out of range"); - GC_push_one ((word) thread_table[i].context.Edi); + GC_push_one ((word) thread_table[i].context.Edi); GC_push_one ((word) thread_table[i].context.Esi); GC_push_one ((word) thread_table[i].context.Ebp); GC_push_one ((word) thread_table[i].context.Ebx); ______________________________________________________________________________ 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]; +} +