fed29f0c77925feaff19b114d245df7f6f9eac97
[org.ibex.core.git] / README
1 ==============================================================================
2 XWT README
3
4 ______________________________________________________________________________
5 Documentation
6
7 If you're new to XWT, you should read the documentation in the order
8 presented below:
9
10 - README [this file]
11
12       Start here. Includes a map of all other documentation and a
13       description of the directory strucure
14
15 - The XWT home page [http://www.xwt.org/]
16
17 - The XWT tutorial [http://www.xwt.org/tutorial.html]
18
19       Gentle introduction to what XWT is, and how to write
20       .xwt's. Good for anybody who wants to write XWT applications.
21
22 - The XWT reference [http://www.xwt.org/reference.html]
23
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
27       behave.
28
29 - Javadoc [http://www.xwt.org/javadoc/]
30
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.
34
35 - Javasrc [http://www.xwt.org/javasrc]
36
37       Javasrc generates a syntax-colored and hyperlinked html copy of
38       the XWT source code.
39
40
41 ______________________________________________________________________________
42 Directory Structure
43
44 /
45    README                - this file
46    COPYING               - copyright information for all files in this distro
47    TM                    - trademark information for XWT
48    ant                   - a unix shell script to launch ant
49    bin/                  - all binary stuff generated by ant builds
50    build.xml             - ANT build file
51
52    lib/                  - any third-party binary stuff needed during the build process
53        javago            - a copy of the javago post-compilation bytecode inliner
54        ant.jar           - the Jakarta project's ANT build tool, including Sun's XML parser
55        netscape.jar      - minimal set of classes required for compiling against Netcape's Applet interfaces
56        msjvm.jar         - minimal set of classes required for compiling against Microsoft's Applet interfaces
57        signtool          - the Netscape Object Signing tool, for signing applets
58        signcode.exe      - the Microsoft ActiveX Signing tool, for signing ActiveX controls
59        guidgen.exe       - the Microsoft GUID generator, for generating OLE clsid's
60        cabarc.exe        - the Microsoft CAB file generator, for creating .cab archives
61        javasrc.jar       - javasrc, a tool for generating hyperlinked, syntax-colored html from java code
62
63    src/                  - all java source files and xwt sources go here
64        jazz/             - jazzlib, which XWT currently uses since libgcj's java.util.zip.* is broken
65
66        org/
67            bouncycastle/ - the BouncyCastle Crypto Library
68            gimp/tigert/  - some icons used in XWT Mail, by Tigert Labs
69            mozilla/      - a copy of Rhino, the Mozilla JavaScript interpreter
70
71            xwt/          - the source code for the XWT engine
72                demo/     - the XWT widget sampler
73                chess/    - XWT Chess
74                fonts/    - some XWF fonts
75                mail/     - XWT Mail
76                plat/     - platform abstraction classes for XWT
77                tasks/    - source code for some ANT tasks used in the XWT build process
78                themes/   - some XWT themes
79                util/     - some helper classes
80
81        xwt/standard/     - the XWT standard library
82
83
84
85 ______________________________________________________________________________
86 Build Targets
87
88         *** XWT now requires JDK 1.4 or later to build ***
89
90 To build, make sure your $JAVA_HOME points to jdk1.4 or later, and type
91
92     ./ant -Dplat=<platform> <targetname>
93
94 If you're using jdk1.2 or jdk1.3 to compile, you should remove
95 src/org/xwt/plat/Java14.java, since it can only be compiled with
96 jdk1.4+.
97
98 The name of any class in org.xwt.plat is a valid <platform>; here is a
99 list as of 20-Mar-2002:
100
101     Win32         - Windows 95 / NT4 or later
102     Java2         - Any Java 1.2+ compliant JVM
103
104 Valid <target>s are:
105
106     build         - builds a binary for the selected platform
107
108 The following targets do not require that you specify a platform:
109
110     compile       - compiles all .java's to .class'es
111     clean         - empties bin/ and compiled binaries in dist/
112
113
114 ______________________________________________________________________________
115 Building
116
117 - If you only want to build the JVM version of XWT, delete these two
118   files:
119
120     xwt/src/org/xwt/plat/Win32.java
121     xwt/src/org/xwt/plat/GCJ.java
122
123   This will allow XWT to build correctly *without* gcc 3.1. Otherwise,
124   you must compile and install gcc 3.1.
125
126
127 - The Win32 native version of XWT can ONLY be built with the very
128   latest pre-release of GCC 3.1. You can follow the steps below to
129   create a cross-compiler from linux to Win32.
130
131   If the steps below fail, try adding "-D 20-Mar-2002" to the cvs
132   checkout line; 20-Mar-2002 was the last date on which the compiler
133   was known to work. Please don't do this unless you have attempted
134   without it, however, since it puts additional strain on the gcc cvs
135   server.
136
137   There are also three patches at the end of this file which can be
138   applied to the branch -- the first fixes a bug related to
139   GetFullPathName, the second disables Win32 file locking (so you can
140   view XWT's log files while it is running), and the third makes
141   Throwable.printStackTrace() work.
142
143   # create an install area
144   export CLASSPATH=
145   export PREFIX=/usr/local/gcc
146   export CC=/usr/bin/gcc
147   
148   sudo rm -rf $PREFIX
149   export PATH=$PATH:$PREFIX/bin
150   sudo mkdir $PREFIX
151   sudo mkdir $PREFIX/i686-pc-mingw32/
152   
153   wget http://prdownloads.sourceforge.net/mingw/MinGW-1.1.tar.gz
154   sudo tar -C $PREFIX/i686-pc-mingw32/ -xvzf ~/mingw-gcj/MinGW-1.1.tar.gz
155   
156   wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.11.2.tar.gz
157   tar xzvf binutils-2.11.2.tar.gz
158   cd binutils-2.11.2
159   ./configure --target=i686-pc-mingw32 --prefix=$PREFIX
160   make
161   sudo make install
162   cd ..
163   
164   cvs -d :pserver:anoncvs@subversions.gnu.org:/cvsroot/gcc co -rgcc-3_1-branch gcc
165   mkdir bin
166   cd bin
167   ../gcc/configure \
168                    --prefix=$PREFIX \
169                    --target=i686-pc-mingw32 \
170                    --host=i686-pc-linux-gnu \
171                    --enable-languages=c,c++,java \
172                    --disable-nls \
173                    --with-as=$PREFIX/i686-pc-mingw32/bin/as \
174                    --with-ld=$PREFIX/i686-pc-mingw32/bin/ld \
175                    --with-gnu-ld \
176                    --with-gnu-as \
177                    --enable-libgcj \
178                    --enable-gc-type=boehm \
179                    --disable-shared \
180                    --enable-threads=win32 \
181                    --disable-hash-synchronization \
182                    --disable-interpreter \
183                    --enable-sjlj-exceptions
184   
185   make
186   sudo make install
187
188 - The Linux native version is still experimental. You should configure
189   your compiler with:
190
191   ../gcc/configure \
192                    --prefix=$PREFIX \
193                    --enable-languages=c,c++,java \
194                    --disable-nls \
195                    --enable-libgcj \
196                    --enable-threads=posix \
197                    --enable-hash-synchronization \
198                    --enable-static \
199                    --disable-interpreter
200
201
202 ______________________________________________________________________________
203 Throwable.printStackTrace() patch
204
205 Index: Class.h
206 ===================================================================
207 RCS file: /cvs/gcc/gcc/libjava/java/lang/Class.h,v
208 retrieving revision 1.43
209 diff -u -r1.43 Class.h
210 --- Class.h     21 Dec 2001 19:47:50 -0000      1.43
211 +++ Class.h     24 Apr 2002 03:06:14 -0000
212 @@ -308,6 +308,7 @@
213    friend void _Jv_LayoutVTableMethods (jclass klass);
214    friend void _Jv_SetVTableEntries (jclass, _Jv_VTable *);
215    friend void _Jv_MakeVTable (jclass);
216 +  friend JArray<java::lang::reflect::Method*>* _Jv_GetAllMethods();
217  
218    // Return array class corresponding to element type KLASS, creating it if
219    // necessary.
220 Index: ClassLoader.java
221 ===================================================================
222 RCS file: /cvs/gcc/gcc/libjava/java/lang/ClassLoader.java,v
223 retrieving revision 1.16
224 diff -u -r1.16 ClassLoader.java
225 --- ClassLoader.java    7 Dec 2001 23:34:12 -0000       1.16
226 +++ ClassLoader.java    24 Apr 2002 03:06:14 -0000
227 @@ -577,4 +577,8 @@
228      // Default to returning null.  Derived classes implement this.
229      return null;
230    }
231 +
232 +  static native java.lang.reflect.Method[] getAllMethods();
233 +  static native long[] getAllMethodAddrs();
234 +
235  }
236 Index: Throwable.java
237 ===================================================================
238 RCS file: /cvs/gcc/gcc/libjava/java/lang/Throwable.java,v
239 retrieving revision 1.10
240 diff -u -r1.10 Throwable.java
241 --- Throwable.java      24 Feb 2001 03:52:49 -0000      1.10
242 +++ Throwable.java      24 Apr 2002 03:06:14 -0000
243 @@ -123,21 +123,64 @@
244      printStackTrace (writer);
245    }
246  
247 +  private native static long longFromStackTraceBytes(byte[] stackTrace, int i);
248 +
249    public void printStackTrace (PrintWriter wr)
250    {
251 -    try
252 -      {
253 -       CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr);
254 -       PrintWriter writer = new PrintWriter (cPlusPlusFilter);
255 -       printRawStackTrace (writer);    
256 -       writer.close ();
257 -       if (cPlusPlusFilter.written == 0) // The demangler has failed...
258 -         printRawStackTrace (wr);
259 +      try
260 +          {
261 +              CPlusPlusDemangler cPlusPlusFilter = new CPlusPlusDemangler (wr);
262 +              PrintWriter writer = new PrintWriter (cPlusPlusFilter);
263 +              printRawStackTrace (writer);     
264 +              writer.close ();
265 +              if (cPlusPlusFilter.written > 0) return;
266 +          }
267 +      catch (Exception e1)
268 +          {
269 +          }
270 +
271 +      wr.println(toString());
272 +      if (stackTrace == null) {
273 +          wr.flush();
274 +          return;
275        }
276 -    catch (Exception e1)
277 -      {
278 -       printRawStackTrace (wr);
279 +      
280 +      long[] allAddrs = ClassLoader.getAllMethodAddrs();
281 +      java.lang.reflect.Method[] meths = ClassLoader.getAllMethods();
282 +      
283 +      // FIXME: assumes little endian
284 +      for(int i=0; i<stackTrace.length; i++) {
285 +          long addr = longFromStackTraceBytes(stackTrace, i);
286 +          if (addr == 0) break;
287 +          
288 +          int whichMethod = -1;
289 +          for(int j=0; j<allAddrs.length; j++) {
290 +              if (allAddrs[j] <= addr &&
291 +                  (whichMethod == -1 || allAddrs[whichMethod] < allAddrs[j])) {
292 +                  whichMethod = j;
293 +              }
294 +          }
295 +          
296 +          if (whichMethod == -1) {
297 +              wr.println("[" + Long.toString(addr, 16) + "]  " + "??");
298 +              continue;
299 +          }
300 +          
301 +          if (meths[whichMethod].getDeclaringClass().getName().equals("gnu.gcj.runtime.FirstThread") &&
302 +              meths[whichMethod].getName().equals("call_main"))
303 +              break;
304 +          
305 +          wr.println("    [" + Long.toString(addr, 16) + "] " +
306 +                     meths[whichMethod].getDeclaringClass().getName() + "." +
307 +                     meths[whichMethod].getName() + "() " +
308 +                     "+" + (addr - allAddrs[whichMethod])
309 +                     );
310 +          
311 +          if (java.lang.Thread.class.isAssignableFrom(meths[whichMethod].getDeclaringClass()) &&
312 +              meths[whichMethod].getName().equals("run"))
313 +              break;
314        }
315 +      wr.flush();
316    }
317  
318    public Throwable ()
319 Index: natClassLoader.cc
320 ===================================================================
321 RCS file: /cvs/gcc/gcc/libjava/java/lang/natClassLoader.cc,v
322 retrieving revision 1.47.8.1
323 diff -u -r1.47.8.1 natClassLoader.cc
324 --- natClassLoader.cc   2 Apr 2002 22:19:55 -0000       1.47.8.1
325 +++ natClassLoader.cc   24 Apr 2002 03:06:14 -0000
326 @@ -40,6 +40,10 @@
327  #include <java/lang/StringBuffer.h>
328  #include <java/io/Serializable.h>
329  #include <java/lang/Cloneable.h>
330 +#include <java/lang/reflect/Method.h>
331 +
332 +#include<java/lang/reflect/Constructor.h>
333 +#include<gcj/method.h>
334  
335  // FIXME: remove these.
336  #define CloneableClass java::lang::Cloneable::class$
337 @@ -347,6 +351,50 @@
338  static jclass loaded_classes[HASH_LEN];
339  
340  // This is the root of a linked list of classes
341 +
342 +JArray<java::lang::reflect::Method*>*
343 +java::lang::ClassLoader::getAllMethods()
344 +{
345 +    return _Jv_GetAllMethods();
346 +}
347 +
348 +JArray<jlong>*
349 +java::lang::ClassLoader::getAllMethodAddrs()
350 +{
351 +    JArray<java::lang::reflect::Method*>* arr = _Jv_GetAllMethods();
352 +    java::lang::reflect::Method** el = (java::lang::reflect::Method**)elements(arr);
353 +    JArray<jlong>* ret = JvNewLongArray(arr->length);
354 +    jlong* retel = (jlong*)elements(ret);
355 +    for(int i=0; i<arr->length; i++)
356 +        retel[i] = (jlong)((unsigned int)(_Jv_FromReflectedMethod (el[i])->ncode));
357 +    return ret;
358 +}
359 +
360 +JArray<java::lang::reflect::Method*>*
361 +_Jv_GetAllMethods()
362 +{
363 +  int numMethods = 0;
364 +
365 +  for(int i=0; i<HASH_LEN; i++)
366 +      for(jclass c = loaded_classes[i]; c; c = c->next)
367 +          numMethods += c->getDeclaredMethods()->length;
368 +
369 +  JArray<java::lang::reflect::Method*>* ret =
370 +    (JArray<java::lang::reflect::Method*>*)
371 +    JvNewObjectArray(numMethods, &java::lang::reflect::Method::class$, NULL);
372 +
373 +  java::lang::reflect::Method** el = (java::lang::reflect::Method**)elements(ret);
374 +
375 +  for(int i=0; i<HASH_LEN; i++)
376 +      for(jclass c = loaded_classes[i]; c; c = c->next) {
377 +          JArray<java::lang::reflect::Method*>* methods = c->getDeclaredMethods();
378 +          jint len = methods->length;
379 +          java::lang::reflect::Method** meths = (java::lang::reflect::Method**)elements(methods);
380 +          for(int j=0; j<len; j++) el[--numMethods] = meths[j];
381 +      }
382 +
383 +  return ret;
384 +}
385  
386  \f
387  
388 Index: natThrowable.cc
389 ===================================================================
390 RCS file: /cvs/gcc/gcc/libjava/java/lang/natThrowable.cc,v
391 retrieving revision 1.11
392 diff -u -r1.11 natThrowable.cc
393 --- natThrowable.cc     7 Feb 2002 19:26:06 -0000       1.11
394 +++ natThrowable.cc     24 Apr 2002 03:06:14 -0000
395 @@ -32,6 +32,7 @@
396  #include <stdio.h>
397  
398  #include <unistd.h>
399 +#include <platform.h>
400  
401  #ifdef HAVE_EXECINFO_H
402  #include <execinfo.h>
403 @@ -102,3 +103,18 @@
404  #endif /* HAVE_BACKTRACE */
405    wr->flush ();
406  }
407 +
408 +// Returns the i^th call address in the stackTrace member, or 0 if i
409 +// is beyond the end of the trace. This has to be done in C++ because
410 +// the addresses in stackTrace are the same width as the platform's
411 +// pointers (which is unknown to Java code), and stackTrace is a
412 +// byte[] using the platform's endianness (which is unknown to Java
413 +// code).
414 +jlong
415 +java::lang::Throwable::longFromStackTraceBytes(jbyteArray stackArr, jint i)
416 +{
417 +    if (i * sizeof(void*) > stackArr->length) return 0;
418 +    unsigned int* stack = (unsigned int*)elements(stackArr);
419 +    return (jlong)stack[i];
420 +}
421 +
422
423
424
425
426