1 ==============================================================================
4 ______________________________________________________________________________
7 If you're new to XWT, you should read the documentation in the order
12 Start here. Includes a map of all other documentation and a
13 description of the directory strucure
15 - The XWT home page [http://www.xwt.org/]
17 - The XWT tutorial [http://www.xwt.org/tutorial.html]
19 Gentle introduction to what XWT is, and how to write
20 .xwt's. Good for anybody who wants to write XWT applications.
22 - The XWT reference [http://www.xwt.org/reference.html]
24 Precise, technical spec of exactly how XWT works. Assumes
25 familiarity with XWT (ie, you've read the tutorial). This is the
26 authoritative source for how an XWT engine should
29 - Javadoc [http://www.xwt.org/javadoc/]
31 The org.xwt.* packages are all documented with javadoc. You
32 should start by reading the package summary for org.xwt.Main,
33 and work your way around from there.
35 - Javasrc [http://www.xwt.org/javasrc]
37 Javasrc generates a syntax-colored and hyperlinked html copy of
41 ______________________________________________________________________________
45 AUTHORS - people involved in developing XWT
47 COPYING - copyright information for all files in this distro
48 TM - trademark information for XWT
49 ant - a unix shell script to launch ant
50 bin/ - all binary stuff generated by ant builds
51 build.xml - ANT build file
53 lib/ - any third-party binary stuff needed during the build process
54 javago - a copy of the javago post-compilation bytecode inliner
55 ant.jar - the Jakarta project's ANT build tool, including Sun's XML parser
56 netscape.jar - minimal set of classes required for compiling against Netcape's Applet interfaces
57 msjvm.jar - minimal set of classes required for compiling against Microsoft's Applet interfaces
58 javasrc.jar - javasrc, a tool for generating hyperlinked, syntax-colored html from java code
60 src/ - all java source files and xwt sources go here
61 jazz/ - jazzlib, which XWT currently uses since libgcj's java.util.zip.* is broken
63 bouncycastle/ - the BouncyCastle Crypto Library
64 mozilla/ - a copy of Rhino, the Mozilla JavaScript interpreter
65 xwt/builtin/ - .xwt's and .png's that are essential to bootstrapping the engine
66 xwt/plat/ - platform-specific code
68 ______________________________________________________________________________
71 *** XWT now requires JDK 1.4 or later to build ***
73 To build, make sure your $JAVA_HOME points to jdk1.4 or later, and type
75 ./ant -Dplat=<platform> <targetname>
77 The name of any class in org.xwt.plat is a valid <platform>; here is a
78 list as of 20-Mar-2002:
80 Win32 - Windows 95 / NT4 or later
81 Java12 - Any Java 1.2+ compliant JVM
85 build - builds a binary for the selected platform
87 The following targets do not require that you specify a platform:
89 compile - compiles all .java's to .class'es
90 clean - empties bin/ and compiled binaries in dist/
93 ______________________________________________________________________________
96 - WARNING: Jikes 1.16 has a bug which will cause it to generate
97 corrupt .class files; you must downgrade to 1.15 in order to compile
100 - If you only want to build the JVM version of XWT, delete these three
103 xwt/src/org/xwt/plat/Win32.java
104 xwt/src/org/xwt/plat/POSIX.java
105 xwt/src/org/xwt/plat/GCJ.java
107 This will allow XWT to build correctly *without* gcc 3.1. Otherwise,
108 you must compile and install gcc 3.1.
111 - The Win32 native version of XWT can ONLY be built with the very
112 latest pre-release of GCC 3.1. You can follow the steps below to
113 create a cross-compiler from linux to Win32.
115 If the steps below fail, try adding "-D 20-Mar-2002" to the cvs
116 checkout line; 20-Mar-2002 was the last date on which the compiler
117 was known to work. Please don't do this unless you have attempted
118 without it, however, since it puts additional strain on the gcc cvs
121 There are also three patches at the end of this file which can be
122 applied to the branch -- the first fixes an inet_addr() bug on
123 Win32, the second fixes a garbage collector bug, and the third
124 enables stack traces.
126 # create an install area
128 export PREFIX=/usr/local/gcc
129 export CC=/usr/bin/gcc
132 export PATH=$PATH:$PREFIX/bin
134 sudo mkdir $PREFIX/i686-pc-mingw32/
136 wget http://telia.dl.sourceforge.net/sourceforge/mingw/MinGW-1.1.tar.gz
137 sudo tar -C $PREFIX/i686-pc-mingw32/ -xvzf MinGW-1.1.tar.gz
139 wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.11.2.tar.gz
140 tar xzvf binutils-2.11.2.tar.gz
142 ./configure --target=i686-pc-mingw32 --prefix=$PREFIX
147 cvs -d :pserver:anoncvs@subversions.gnu.org:/cvsroot/gcc co -rgcc-3_1-branch gcc
152 --target=i686-pc-mingw32 \
153 --host=i686-pc-linux-gnu \
154 --enable-languages=c,c++,java \
156 --with-as=$PREFIX/i686-pc-mingw32/bin/as \
157 --with-ld=$PREFIX/i686-pc-mingw32/bin/ld \
161 --enable-gc-type=boehm \
163 --enable-threads=win32 \
164 --disable-hash-synchronization \
165 --disable-interpreter \
166 --enable-sjlj-exceptions
171 - The Linux native version is still experimental. You should configure
176 --enable-languages=c,c++,java \
179 --enable-threads=posix \
180 --enable-hash-synchronization \
182 --disable-interpreter
185 ______________________________________________________________________________
188 ** THIS DOESN'T WORK YET **
190 Ant takes a long time to start up, mainly because it has to load a
191 JVM. If you compile ant to native code using GCJ, it will load much
192 more quickly. So far, this only works on Linux.
196 jar xvf ~/xwt/lib/ant.jar
197 for A in `find * -name \*.properties -or -name \*.txt -or -name \*.mf`
198 do gcj -c --resource $A $A -o $A.o
200 CLASSPATH= gcj --main=org.apache.tools.ant.Main \
201 `find . -name \*.class -or -name \*.o` -o ant
205 ______________________________________________________________________________
208 Index: java/net/natInetAddress.cc
209 ===================================================================
210 RCS file: /cvs/gcc/gcc/libjava/java/net/natInetAddress.cc,v
211 retrieving revision 1.18.18.1
212 diff -u -r1.18.18.1 natInetAddress.cc
213 --- java/net/natInetAddress.cc 4 Mar 2002 20:02:19 -0000 1.18.18.1
214 +++ java/net/natInetAddress.cc 27 May 2002 22:54:40 -0000
219 +#include <platform.h>
223 Index: include/win32.h
224 ===================================================================
225 RCS file: /cvs/gcc/gcc/libjava/include/win32.h,v
226 retrieving revision 1.3.8.5
227 diff -u -r1.3.8.5 win32.h
228 --- include/win32.h 24 Apr 2002 01:04:45 -0000 1.3.8.5
229 +++ include/win32.h 27 May 2002 22:54:40 -0000
231 ARRAY and return the exact number of values stored. */
232 extern int backtrace (void **__array, int __size);
234 +// configure cannot correctly detect inet_addr due to Win32's
235 +// oddball header naming scheme
236 +#define HAVE_INET_ADDR
238 #endif /* __JV_WIN32_H__ */
242 ______________________________________________________________________________
245 Index: win32_threads.c
246 ===================================================================
247 RCS file: /cvs/gcc/gcc/boehm-gc/win32_threads.c,v
248 retrieving revision 1.9.2.2
249 diff -u -r1.9.2.2 win32_threads.c
250 --- win32_threads.c 29 Jun 2002 17:29:51 -0000 1.9.2.2
251 +++ win32_threads.c 2 Jul 2002 18:10:02 -0000
253 (LPCONTEXT)&thread_table[i].context))
254 ABORT("GetThreadContext failed");
256 - if (thread_table[i].context.Esp >= (DWORD)thread_table[i].stack
257 - || thread_table[i].context.Esp < (DWORD)bottom)
258 - ABORT("Thread stack pointer out of range");
259 - GC_push_one ((word) thread_table[i].context.Edi);
260 + GC_push_one ((word) thread_table[i].context.Edi);
261 GC_push_one ((word) thread_table[i].context.Esi);
262 GC_push_one ((word) thread_table[i].context.Ebp);
263 GC_push_one ((word) thread_table[i].context.Ebx);
267 ______________________________________________________________________________
268 Throwable.printStackTrace() patch
271 ===================================================================
272 RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v
273 retrieving revision 1.43
274 diff -u -r1.43 Class.h
275 --- Class.h 21 Dec 2001 19:47:50 -0000 1.43
276 +++ Class.h 24 Apr 2002 03:06:14 -0000
278 friend void _Jv_LayoutVTableMethods (jclass klass);
279 friend void _Jv_SetVTableEntries (jclass, _Jv_VTable *);
280 friend void _Jv_MakeVTable (jclass);
281 + friend JArray<java::lang::reflect::Method*>* _Jv_GetAllMethods();
283 // Return array class corresponding to element type KLASS, creating it if
285 Index: ClassLoader.java
286 ===================================================================
287 RCS file: /cvs/gcc/gcc/libjava/java/lang/ClassLoader.java,v
288 retrieving revision 1.16
289 diff -u -r1.16 ClassLoader.java
290 --- ClassLoader.java 7 Dec 2001 23:34:12 -0000 1.16
291 +++ ClassLoader.java 24 Apr 2002 03:06:14 -0000
293 // Default to returning null. Derived classes implement this.
297 + static native java.lang.reflect.Method[] getAllMethods();
298 + static native long[] getAllMethodAddrs();
301 Index: Throwable.java
302 ===================================================================
303 RCS file: /cvs/gcc/gcc/libjava/java/lang/Throwable.java,v
304 retrieving revision 1.10
305 diff -u -r1.10 Throwable.java
306 --- Throwable.java 24 Feb 2001 03:52:49 -0000 1.10
307 +++ Throwable.java 24 Apr 2002 03:06:14 -0000
308 @@ -123,21 +123,64 @@
309 printStackTrace (writer);
312 + private native static long longFromStackTraceBytes(byte[] stackTrace, int i);
314 public void printStackTrace (PrintWriter wr)
318 - CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr);
319 - PrintWriter writer = new PrintWriter (cPlusPlusFilter);
320 - printRawStackTrace (writer);
322 - if (cPlusPlusFilter.written == 0) // The demangler has failed...
323 - printRawStackTrace (wr);
326 + CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr);
327 + PrintWriter writer = new PrintWriter (cPlusPlusFilter);
328 + printRawStackTrace (writer);
330 + if (cPlusPlusFilter.written > 0) return;
332 + catch (Exception e1)
336 + wr.println(toString());
337 + if (stackTrace == null) {
341 - catch (Exception e1)
343 - printRawStackTrace (wr);
345 + long[] allAddrs = ClassLoader.getAllMethodAddrs();
346 + java.lang.reflect.Method[] meths = ClassLoader.getAllMethods();
348 + // FIXME: assumes little endian
349 + for(int i=0; i<stackTrace.length; i++) {
350 + long addr = longFromStackTraceBytes(stackTrace, i);
351 + if (addr == 0) break;
353 + int whichMethod = -1;
354 + for(int j=0; j<allAddrs.length; j++) {
355 + if (allAddrs[j] <= addr &&
356 + (whichMethod == -1 || allAddrs[whichMethod] < allAddrs[j])) {
361 + if (whichMethod == -1) {
362 + wr.println("[" + Long.toString(addr, 16) + "] " + "??");
366 + if (meths[whichMethod].getDeclaringClass().getName().equals("gnu.gcj.runtime.FirstThread") &&
367 + meths[whichMethod].getName().equals("call_main"))
370 + wr.println(" [" + Long.toString(addr, 16) + "] " +
371 + meths[whichMethod].getDeclaringClass().getName() + "." +
372 + meths[whichMethod].getName() + "() " +
373 + "+" + (addr - allAddrs[whichMethod])
376 + if (java.lang.Thread.class.isAssignableFrom(meths[whichMethod].getDeclaringClass()) &&
377 + meths[whichMethod].getName().equals("run"))
384 Index: natClassLoader.cc
385 ===================================================================
386 RCS file: /cvs/gcc/gcc/libjava/java/lang/natClassLoader.cc,v
387 retrieving revision 1.47.8.1
388 diff -u -r1.47.8.1 natClassLoader.cc
389 --- natClassLoader.cc 2 Apr 2002 22:19:55 -0000 1.47.8.1
390 +++ natClassLoader.cc 24 Apr 2002 03:06:14 -0000
392 #include <java/lang/StringBuffer.h>
393 #include <java/io/Serializable.h>
394 #include <java/lang/Cloneable.h>
395 +#include <java/lang/reflect/Method.h>
397 +#include<java/lang/reflect/Constructor.h>
398 +#include<gcj/method.h>
400 // FIXME: remove these.
401 #define CloneableClass java::lang::Cloneable::class$
403 static jclass loaded_classes[HASH_LEN];
405 // This is the root of a linked list of classes
407 +JArray<java::lang::reflect::Method*>*
408 +java::lang::ClassLoader::getAllMethods()
410 + return _Jv_GetAllMethods();
414 +java::lang::ClassLoader::getAllMethodAddrs()
416 + JArray<java::lang::reflect::Method*>* arr = _Jv_GetAllMethods();
417 + java::lang::reflect::Method** el = (java::lang::reflect::Method**)elements(arr);
418 + JArray<jlong>* ret = JvNewLongArray(arr->length);
419 + jlong* retel = (jlong*)elements(ret);
420 + for(int i=0; i<arr->length; i++)
421 + retel[i] = (jlong)((unsigned int)(_Jv_FromReflectedMethod (el[i])->ncode));
425 +JArray<java::lang::reflect::Method*>*
428 + int numMethods = 0;
430 + for(int i=0; i<HASH_LEN; i++)
431 + for(jclass c = loaded_classes[i]; c; c = c->next)
432 + numMethods += c->getDeclaredMethods()->length;
434 + JArray<java::lang::reflect::Method*>* ret =
435 + (JArray<java::lang::reflect::Method*>*)
436 + JvNewObjectArray(numMethods, &java::lang::reflect::Method::class$, NULL);
438 + java::lang::reflect::Method** el = (java::lang::reflect::Method**)elements(ret);
440 + for(int i=0; i<HASH_LEN; i++)
441 + for(jclass c = loaded_classes[i]; c; c = c->next) {
442 + JArray<java::lang::reflect::Method*>* methods = c->getDeclaredMethods();
443 + jint len = methods->length;
444 + java::lang::reflect::Method** meths = (java::lang::reflect::Method**)elements(methods);
445 + for(int j=0; j<len; j++) el[--numMethods] = meths[j];
453 Index: natThrowable.cc
454 ===================================================================
455 RCS file: /cvs/gcc/gcc/libjava/java/lang/natThrowable.cc,v
456 retrieving revision 1.11
457 diff -u -r1.11 natThrowable.cc
458 --- natThrowable.cc 7 Feb 2002 19:26:06 -0000 1.11
459 +++ natThrowable.cc 24 Apr 2002 03:06:14 -0000
464 +#include <platform.h>
466 #ifdef HAVE_EXECINFO_H
467 #include <execinfo.h>
469 #endif /* HAVE_BACKTRACE */
473 +// Returns the i^th call address in the stackTrace member, or 0 if i
474 +// is beyond the end of the trace. This has to be done in C++ because
475 +// the addresses in stackTrace are the same width as the platform's
476 +// pointers (which is unknown to Java code), and stackTrace is a
477 +// byte[] using the platform's endianness (which is unknown to Java
480 +java::lang::Throwable::longFromStackTraceBytes(jbyteArray stackArr, jint i)
482 + if (i * sizeof(void*) > stackArr->length) return 0;
483 + unsigned int* stack = (unsigned int*)elements(stackArr);
484 + return (jlong)stack[i];