Fix LDC, LDC_W, and INSTANCEOF opcodes, more debugging
[jamvm-avr32-jem.git] / NEWS
blobb06d6603d6eee708418af8eccdd09a0d0b376d4a
1 JamVM 1.5.0 released on 28th October 2007
2 =========================================
4 A summary of changes since 1.4.5:
6 - Substantially modified the interpreter to implement inline-threading
7   (also known as super-instructions or code-copying).  This copies
8   code sequences together to produce native code that executes without
9   the normal interpreter dispatch overhead (similar to a simple JIT).
11   - Supported on i386, AMD64, PowerPC and ARM, with or without stack-
12     caching.  It is enabled by default on i386, AMD64 and PowerPC.
14   - Performance improvement upto 300% on Pentium 4 (NetBurst), and upto
15     200% on Athlon 64.  Less on Core 2 Duo (upto 70% faster as it has
16     indirect branch prediction), and PowerPC which was already very
17     optimised (upto 30% faster).
19   - Tested on gcc 3.4 (i386, AMD64, PowerPC), 4.0 (i386), 4.1
20     (i386, AMD64, PowerPC, ARM), 4.2 (i386, AMD64)
22   - Several new command line options to control inlining:
24       -Xreplication : determines whether duplicate code sequences
25        are replicated or shared.  Can be set to 'none' (no replication),
26        'always' (all sequences are copies) or a threshold value (e.g.
27        10, when sharing of a sequence reaches the threshold the sequence
28        is replicated).
30       -Xcodemem : the maximum amount of memory for super-instructions.
31        Once the maximum is reached no new super-instructions are generated
32        but existing super-instructions are reused (class unloading will
33        also free unused sequences).  Can be set to a value or 'unlimited'.
34        This option can be used to limit code memory on systems with little
35        RAM (i.e. embedded).
37       -Xshowreloc : debugging option, which shows which opcodes were
38        determined to be relocatable, and for opcodes which aren't why
39        they aren't relocatable.  When using stack-caching there are
40        three versions of each opcode (for 3 stack-cache levels).
42       -Xnoinlining : turns off inlining (equivalent to setting codemem
43        to zero).
45   - Opcode relocatability is determined by default at build time, but
46     this doesn't work when cross-compiling (so inlining is disabled).
47     Relocatability can be determined at runtime using configure option
48     --enable-runtime-reloc-checks, but this increases executable size
49     by approx 30%.
51 - Command line options -version and -showversion now shows build
52   information.  This includes the execution engine (e.g. inline-
53   threaded interpreter with stack-caching), the gcc version which
54   was used to compile JamVM (useful for debugging) and the "built in"
55   boot library path and classpath.
57 - Ported to ARM systems using EABI.  This is a full port, with hand-
58   coded assembler to handle the construction of a call-frame for calling
59   JNI native methods.
61 - Refactored GC to remove all possible calls which may deadlock
62   with threads suspended in "unsafe" operations.  This includes
63   use of malloc/realloc/free and pthreads operations.
65 - In allocClass() check if gcMalloc() returns NULL (i.e. OOM).
67 - Copy Sun's behaviour when dealing with an empty property key or no
68   equals after key.
70 - Add java.util.concurrent.atomic.AtomicLong.VMSupportsCS8.
72 - In method and field access checks, put back in access check for
73   class (removed previously because it caused regressions, since
74   fixed in Classpath).
76 - Enable suspend on thread creation (parent thread created thread with
77   suspension disabled).  Effects threads which immediately call a long
78   running native method.
80 - Fixed race condition in thread creation and compaction (start function
81   obtains class reference when it is not suspendable, if compaction
82   occurs, the reference may be threaded, or moved).
84 - Fix potential deadlock in threadInterrupt under Linuxthreads.
86 - Protect lock operation in resetPeakThreadsCount().
88 - In createJavaThread(), re-enable suspension if pthread_create fails.
90 - Fix race-condition in thread deletion.
92 - Fix bug in hash table "scavenge".  This could lead to entries not being
93   freed, and exhaustion of Monitors on embedded systems.
95 - Removed use of malloc/free in thread dump.  Removes potential deadlock
96   with threads suspended in malloc/realloc/free.
98 - Added symbolic link from lib/rt.jar to Classpath's glibj.zip (fixes
99   programs such as ecj which locates rt.jar via java.home).
101 - Bumped Java compatible version to 1.5.0 as Classpath is now the generics
102   branch (since Classpath 0.95).
105 JamVM 1.4.5 released on 4th February 2007
106 =========================================
108 A summary of changes since 1.4.4:
110 - Support for Java 1.5 Annotations.  This includes the following
111   methods for reflection access to Annotations:
113     - VMClass.getDeclaredAnnotations
114     - java.lang.reflect.Field.getDeclaredAnnotations
115     - java.lang.reflect.Constructor
116         - getAnnotation, getDeclaredAnnotations, getParameterAnnotations
117     - java.lang.reflect.Method
118         - getDefaultValue, getAnnotation, getDeclaredAnnotations,
119           getParameterAnnotations
121 - Class sun.misc.Unsafe implemented, providing VM support for
122   JSR-166 (Concurrency Utilities).
124 - Ported to the mipsel architecture.  This is a full port, with hand-
125   coded assembler to handle the construction of a call-frame for calling
126   JNI native methods.  This supports the O32 ABI (for other ABIs libffi
127   can be used).
129 - Bug fix in registering references external to the heap with the GC.
130   The table should be locked for references registered after VM
131   initialisation.
133 - Bug fix when expanding the heap and the free-list is empty.
135 - Fixed race-condition when rewriting OPC_NEW in the indirect-threaded
136   interpreter (by default the direct-threaded interpreter is used).
138 - Bug fix in the GC compaction phase.  The class-loader references
139   within the loaded DLL hashtable must be updated when the class-loader
140   is moved during compaction.  This is a regression introduced in
141   JamVM 1.4.3 (DLL unloading), seen while running Eclipse.
143 - Bug fix in JNI_GetStringUTFLength.  The reported length should not
144   include space for a NULL terminator.
146 - Various compile fixes for uClibc.  Support for the JNI invocation
147   API requires glibc features not implemented in uClibc.
149 - Command line option -fullversion implemented.
152 JamVM 1.4.4 released on 2nd November 2006
153 =========================================
155 A summary of changes since 1.4.3:
157 - Full JNI Invocation API implemented, enabling JamVM to be linked into
158   another program.
160     - JNI_CreateJavaVM, DestroyJavaVM, AttachCurrentThread,
161     - AttachCurrentThreadAsDaemon, DetachCurrentThread
162     - JNI_GetDefaultJavaVMInitArgs
164 - JamVM is now also built as a shared library (lib/libjvm.so).
165     - The executable (bin/jamvm) is statically linked with this library
166       instead of being a wrapper.  This is because the shared library
167       runs slower than static linking on some architectures.  As JamVM
168       is small this is not a problem.
170 - Improved class-loader and shared library support
172     - When a class-loader (and all its classes) is unloaded all shared
173       libraries loaded by the class-loader are unloaded and JNI_OnUnload
174       called (if defined)
176     - A shared library can no longer be opened by two class-loaders
177       at once
179     - A class can only resolve native methods defined in shared libraries
180       opened by its defining class-loader
182 - Major re-working of thread/locking code to support additional Java 1.5
183   functionality
185     - Thread.getState() implemented
186         - correct thread states and their transistions (e.g. BLOCKING,
187           WAITING, TIMED_WAITING, etc.)
189     - native support for the ThreadMXBean thread system management API
190         - thread creation statistics (count of live, started and
191           peak threads)
193         - Information about a thread (ThreadInfo)
194             - execution information (thread state, stack backtrace to
195               a particular depth, object upon which the thread is blocked
196               or waiting to be notified)
198             - synchronization statistics (counts of the times the thread
199               has been blocked or waited for notification)
201     - Thread.interrupt() re-implemented fixing several bugs
202         - if a thread was waiting on a monitor, previous implementation
203           required the monitor lock to be obtained.  If a 3rd thread
204           was holding this, the  interrupt could not occur to avoid
205           deadlock.  New thread-code does not require lock to be obtained.
207         - in rare circumstances another thread waiting on the monitor
208           could be notified (when there was pending notifications,
209           and then an interrupt, and subsequent threads waiting on the
210           monitor).
212         - a thread waiting on a thin-lock (waiting for inflation)
213           could erroneously report an InterruptedException
215 - GC bug fix for class-unloading when only using the compactor
216   (-Xcompactalways).  The compactor in some circumstances could move
217   objects ontop of the object holding the native class-loader VM data
218   before it was freed leading to a SEGV.
220 - Bug fix for abstract methods which fell through previous
221   AbstractMethodError checks (using a stub method) 
222     - AbstractMethodError now also gives the method name
224 - Bug fix to not allow abstract classes to be instantiated
226 - Bug fix for NULL in identityHashCode (a regression in JamVM 1.4.3)
228 - Bug fix for NULL in JNI method GetStringUTFLength|Chars
230 - Bug fix for $ in native method names
232 - FirstNonNullClassLoader implemented
234 - Access-checking bug fix.  In reflection method/field access, also
235   check class access in addition to method/field.
237 - Ensure created threads have a native stack size of at least 2MB.  This
238   fixes SEGVs due to stack overflow seen on OpenBSD/Darwin
239   (default 512KB).
241 - Property sun.boot.class.path is now also defined in addition to
242   java.boot.classpath.  Certain applications look for the Sun property
243   (e.g. Dacapo bloat benchmark).
245 - Extra bootclasspath command line options
246     - bootclasspath/v overrides the default VM classes path
247     - bootclasspath/c overrides the default GNU Classpath classes path
249 - java.endorsed.dirs support added
250     - directories are scanned and any jar/zip files are added to the
251       boot classpath.
253 - Improved thread dump (produced via ctrl-\).  Now shows thread state.
255 - JamVM by default now installs in its own directory (/usr/local/jamvm)
258 JamVM 1.4.3 released on 21st May 2006
259 =====================================
261 A summary of changes since 1.4.2:
263 - Heap compaction implemented.  Previously on some programs the object
264   allocation pattern could lead to a highly fragmented heap (lots of
265   small holes).  This caused early heap expansion, and in some cases
266   an OutOfMemory exception (a result of repeated heap expansion until
267   heap fully expanded).
269   JamVM now includes a mark/compact collector in addition to the
270   mark/sweep GC.  This is normally ran after forced finalisation, and
271   before heap expansion.  It removes fragmentation by sliding the objects
272   to the bottom of the heap, closing the holes.
274   Two new command line options can be used to control compaction :
276     -Xnocompact : don't do compaction and just use the mark/sweep
277                   collector.  This is equivalent to JamVM 1.4.2 behaviour.
279     -Xcompactalways : do compaction on every garbage-collection.   In
280                       some cases this may lead to less collections, but
281                       the compactor is slower than the sweeper.
283 - The interned String table is now garbage-collected (JamVM uses its
284   own interned String hashtable).
286 - Additional Java 1.5 support
287     - New methods within VMClass implemented
288         - isMemberClass, isLocalClass, isAnonymousClass,
289           getEnclosingClass, getEnclosingMethod,
290           getEnclosingConstructor, getClassSignature.
292     - Generic signature support in reflection classes (Constructor, Method
293       Field).
294         - getTypeParameters, getSignature, getGenericExceptionTypes,
295           getGenericParameterTypes, toGenericString, getGenericType,
296           getGenericReturnType
298     - Uncaught exceptions will now use the thread's uncaughtExceptionHandler
299       (if available).
301 - Fix for Non-ASCII characters in class name parameter
302     - affected methods Class.ForName, ClassLoader.defineClass
304 - Use getcwd() instead of PWD enviroment variable for user.dir
305   property.  This fixes problems seen on some applications.
307 - Fix in VMClass.defineClass on 64-bit machines (protection domain
308   parameter assumed to be 4 bytes).
310 - Minor interpreter optimisation in direct-mode with handler
311   prefetch (reload of handler address in aload_0/getfield pair).
313 - Command line options -version and -showversion now prints a "Java
314   compatible" version number.  This is to work with shell scripts which
315   parse the output to get the Java version.
317 - Set the java.home property to the JAVA_HOME environment variable if set.
319 - Ported to Mac OS X on Intel.
321 - Runtime.availableProcessors implemented (Linux, Mac OS X and BSD
322   systems).
324 - Updated to be compatible with Classpath 0.91.
325     - Merged in changes to GNU Classpath's VM reference classes and
326       JamVM's classes.
328 - Various compiler warnings.
331 JamVM 1.4.2 released on 22nd January 2006
332 =========================================
334 A summary of changes since 1.4.1:
336 - JamVM now supports class garbage-collection and unloading.  It is
337   implemented according to the clarifications to the JLS.  This states
338   that a class may be unloaded if and only if its class loader is
339   unreachable.  As the loader is reachable while any classes defined
340   by it are reachable, the class loader and all its classes will be
341   collected together.
343 - Bug-fix for field name/type lookup and obfuscated code.  Previously
344   a minor optimisation halted the search if a name was found with the
345   wrong type (as a class cannot have two fields with the same name).
346   However, this breaks obfuscated code which renames variables.  With 
347   field resolution the optimisation is redundant, as fields are only
348   looked up once.
350 - Added stub for VMClassLoader.defineClassWithTransformers.  This is
351   a change in the VM interface in the generics branch of Classpath
352   0.20.
354 - Various build changes :
355     - fix errors/warnings on Open/Free BSD.  Part of this is a move
356       to using config.h.
358     - find Java compiler via path (try ecj, then jikes, gcj, javac).
360 - Fixed a minor garbage-collector bug.  Scan phase could SEGV if a GC
361   occurred when a reference class was partially created.
364 JamVM 1.4.1 released on 28th November 2005
365 ==========================================
367 A summary of changes since 1.4.0:
369 - As part of the GC optimisations in 1.4.0 some redundant checks were
370   removed.  One of these was hiding a garbage-collector bug.  Classes
371   that have not been linked should not be scanned, as their static
372   fields have not been initialised.  The bug only manifested itself
373   in certain applications, as the window between loading and linking
374   is normally small.  Found with Tomcat, but also seen with Ant.
375   
376 - Fix for an array overrun in VMAccessController.getStack (native
377   method) on 64-bit machines.
379 - Support for FreeBSD.
381 - Support for OpenBSD (added in 1.3.3 but not previously mentioned).
383 - A couple of Mauve fixes relating to changing daemon status on threads
384   that have died.
387 JamVM 1.4.0 released on 20th November 2005
388 ==========================================
390 A summary of changes since 1.3.3:
392 - Support for Soft/Weak/Phantom References
393     - As specified in the specification, Weak and Phantom References are
394       cleared as soon as they become weakly or phantom reachable.  It is
395       left up to the VM when Soft References (which are softly reachable)
396       are cleared; only they must be cleared before throwing OutOfMemoryError.
397       JamVM clears them as a last resort, when the heap is fully expanded,
398       and insufficient memory can be reclaimed.
400     - To support Soft/Weak/Phantom references a Reference Handler thread
401       is now created on VM start-up.  This is additional to the Finaliser
402       thread.
404 - Garbage Collector optimisations
405     - Re-implementation of object reference scanning via reference offset
406       lists.  Previously, references were scanned by finding references
407       by following the class hierarchy.
409     - As part of this the object layout has changed.
411 - Added Java language-level access checks (e.g. access to private/protected
412   and package-private methods and fields).  This includes access via
413   reflection.
415 - Fix for inheritance of inaccessible methods.
417 - Linux PowerPC build fix (this was quickly fixed in CVS).
419 - FFI fix.  The size of ffi-type-uint on 64-bit platforms has changed between
420   libffi 2.00-beta and later versions.  This only affected AMD64, as this
421   is the only platform that uses libffi.
423 - Fix for initiating loaders and array classes.
425 - Mauve tests.  Many extra VM-level Mauve tests now pass (35+).  These
426   are mostly concerned with testing boundary-conditions in class-loading,
427   Class.forName() and Thread.sleep().  Extra tests pass due to the
428   implementation of Soft/Weak/PhantomReferences and access checks.
430 - Classpath-0.19 merge.
431     - Merged in changes to GNU Classpath's VM reference classes and
432       JamVM's classes.
434 - Support for kfreebsd and Linux-powerpc64.
436 - Many other code tidy-ups.
439 JamVM 1.3.3 released on 12th September 2005
440 ===========================================
442 A summary of changes since 1.3.2:
444 - JamVM is now 64-bit "clean".
446 - As part of the changes above, JamVM has been ported to:
448     - AMD64 under Linux:
449         - JamVM should also work on Pentium 4 with EM64T technology.
451     - PowerPC64 under Mac OS X:
452         - to build a 64-bit executable CFLAGS must include the flag -arch
453           ppc64.  If no option is given a 32-bit executable is built by
454           default.
456     - JamVM should also work on PowerPC64 under Linux, if the --enable-ffi
457       flag is given to configure, but I have been unable to test.
459 - LibFFI is now supported.  Upto now, all ports required the native
460   calling convention to be written "by hand" for each new architecture/
461   platform.  Generic calling-convention code is now supported via libffi.
462   Currently this is only used for AMD64/Linux, but can be enabled for
463   all platforms using --enable-ffi.  The "hand-written" routines should
464   be faster, and are used by default, but this will make porting to new
465   architectures/platforms easier.
467 - Bug-fix enabling heaps larger than 2Gb to be specified on 32-bit
468   architectures.  On 64-bit machines, heap sizes > 4Gb are now
469   supported.
471 - Bug-fix for JNI return values smaller than 4 bytes (e.g.  byte, short,
472   etc.) on big-endian machines.
474 - Under Mac OS X multiple DLL extensions will now be tried.  Classpath
475   libraries end in .dylib, but native JNI libraries end in .jnilib.
476   Both are now supported.
478 - Backwards compatibility workarounds for Classpath-0.17 removed.  JamVM
479   will now only work with Classpath-0.18 and CVS (as of 12th September).
482 JamVM 1.3.2 released on 29th July 2005
483 ======================================
485 JamVM 1.3.2 is a minor feature/bug-fix release.  A summary of changes since
486 1.3.1:
488 - Updated to be compatible with Classpath-0.17 and Classpath from
489   CVS (as of 28th July).
491 - Shutdown hooks are now ran on VM termination, either normally, or via user
492   interruption (i.e ctrl-C).
494 - Revised GC allocation failure policy
495     - Using a simple heuristic the GC attempts to maintain at least 25% heap
496       free.  If it fails the heap is expanded, regardless of whether the
497       allocation request could be satisfied.  This reduces frequent garbage
498       collection cycles when GC returns only a limited amount of memory.
500 - Revised Object finalization
501     - during GC a thread could deadlock waiting for finalization.  This
502       occurred when a finalizer (running in the finalizer thread) attempted
503       to grab a lock the thread is holding.
505     - a minor bug fix where finalized objects waiting for the finalizer to 
506       be ran could keep alive other finalized objects (if it had the only
507       reference to it).
509     - a minor bug fix where objects waiting for finalization could be lost
510       (i.e. finalize() method not called).  This only happened when >1000
511       objects were outstanding.
513     - VMRuntime.runFinalization() implemented.  This enables a thread to force
514       finalization.
516 - In certain circumstances a class loader would be unmarked during GC,
517   enabling it to be collected.  This resulted in a SEGV.
519 - JNI FindClass now uses the current class loader, not the first non-null on
520   the stack.
522 - VMClass.getModifiers() now handles inner class attributes.
524 - Fix to enable build directory to be different to source directory (this was
525   broken in 1.3.0).
528 JamVM 1.3.1 released on 12th June 2005
529 ======================================
531 A summary of changes since 1.3.0:
533 - Re-worked thread suspension enable/disable code
534     - implemented a fast enable/disable suspend mechanism for critical code
535       sections, which is now used in hash table access and heap allocation :
536         - much faster object allocation
537         - much faster primitive array allocation
538         - faster string interning
540     - removed some minor potential (as yet unseen) race conditions
542 - Integrated all outstanding patches
543     - generics branch patch, implementing VMClass.isEnum(), isAnnotation()
544        and isSynthetic()
546     - Boot library path patch (support for system property
547       gnu.classpath.boot.library.path)
549 - Enabled different min/max heap values for each architecture
550     - ARM values are back to the defaults for JamVM 1.2.5.  Default max heap
551       of 128Mb is too large for typical embedded ARM systems.
553 - Fixed the new compiler warnings from gcc-4.0 (under Mac OS X) related
554   to char/signed char usage.
556 - Fixed compiler error on gcc-4.0 under Mac OS X 10.4 (duplicate definitions
557   of wait).
559 - Fixed rare, potential dead-lock in direct.c when preparing methods
561 - Fixed a bug in VMClassLoader.defineClass(), where offset or length is wrong.
563 - Fixed bug in DCONST_1 on mixed-endian ARM architectures (this bug was
564   fixed in JamVM 1.2.2 but it crept back in, due to the new interpreter
565    in JamVM 1.2.5).
567 - Improved thread dump (produced via SIGQUIT, or ctrl-\).
569 - Several other minor bug-fixes, and code tidy-ups.
572 JamVM 1.3.0 released on 31st March 2005
573 =======================================
575 A summary of changes since 1.2.5:
577 - Ported to Mac OS X/Darwin.  JamVM has been built and tested on Mac OS X
578   10.3 (Panther), where it works "out-of-the-box".  It should also work
579   on 10.2 (Jaguar) but you will need to install Fink (for dlopen
580   compatibility).  Note only G3 and G4 machines have been tested.
582     - As part of this, the source layout/build has been changed to more
583       easily support different os/shared architectures
585 - The os.arch property now reports the machine architecture as follows:
586     - arm  : ARM architecture (e.g. it previously reported armv5tel)
587     - i386 : IA32 (i586, i686, etc.)
588     - ppc  : PowerPC
590 - The ldc bytecode now handles "constant class" as specified in JSR 202
591   (and introduced in Java 1.5)
593 - Command line options have been changed to be compatible with Sun Java.
594   This particularly affects bootclasspath, which must now be given using
595   the new syntax.  Two new options are implemented :
596     - verbose:jni
597     - showversion
599 - Default heap sizes have been increased (again) to better reflect desktop
600   application heap usage :
601     - minimum heap is now 2Mb
602     - maximum heap is now 128Mb
604 - A race condition in class-loading has been fixed.  This fixes a SEGV
605   with the latest postgreSQL JDBC driver.  It also fixes a SEGV when
606   starting Eclipse on a P4 with hyper-threading enabled
608 - A race condition on VM initialisation has been fixed (helper threads
609   starting when a GC cycle has already started in the main thread).
612 JamVM 1.2.5 released on 1st March 2005
613 ======================================
615 - Substantially modified the interpreter to implement direct-dispatching.
616   This considerably speeds-up dispatch, improving performance by 60% to
617   100% across all platforms.  However, the rewritten method code takes
618   up on average 4 times the memory.  Direct-dispatching is enabled
619   by default on all platforms.
621     - The direct-dispatched interpreter also supports stack-caching.
622       This is enabled by default on PowerPC and ARM.
624     - A further optimisation is prefetching.  This is enabled by
625       default only on PowerPC.
627     - In all 7 interpreter variants are possible, controlled by the
628       configure options --enable-int-threading, --enable-int-direct,
629       --enable-int-caching and --enable-int-prefetch.  For example,
630       
631       ./configure --disable-int-direct
633       will revert to the indirect-dispatched interpreter as in JamVM
634       1.2.4.
636 - Backwards compatibility with Classpath 0.13 removed (for example,
637   VMSecurityManager).
639 - Fixed a SEGV that occurs when an abstract class does not implement
640   all methods specified in the interfaces it implements, also implements
641   a finalize method which is inherited by a concrete class.  When the
642   VM creates the dummy "miranda" methods, the finalizer method pointer
643   is left pointing to rubbish.  This occurs with the latest postgreSQL
644   JDBC driver.
647 JamVM 1.2.4 released on 23rd January 2005
648 =========================================
650 A summary of changes since 1.2.3:
652 - Updated to be compatible with Classpath-0.13 and Classpath from
653   CVS (as of 22nd January).
655 - JNI enhancements introduced in JNI 1.4 implemented (NOT using
656   minimal implementation of simply returning NULL)
658 - Fix for setting locale when LANG is invalid (i.e. not locale-gen'ed)
660 - Fix for void method invocation using JNI (perform virtual method
661   lookup).  This only affected methods with void return type.
663 - Fix for JNIEnv.  JNIEnv pointer is now constant across calls from
664   the same thread.
666 - Implemented new VMStackWalker class, with optimised native methods.
667   This class is needed for the CVS version of Classpath.
669 - Default system properties can now be overridden via the command
670   line (using -D)
672 - BOOTCLASSPATH environment variable can now be used to specify
673   the classpath used by the bootstrap class loader.  This overrides
674   the default path.  BOOTCLASSPATH has lower priority than the command
675   line and is ignored if -bootclasspath, -bootclasspath/a or
676   -bootclasspath/p is used.
678 - NoClassDefFoundErrors thrown by the VM are now chained, and
679   show the exception that caused the error.
682 JamVM 1.2.3 released on 23rd December 2004
683 ==========================================
685 - Fix the mistake in JamVM 1.2.2 that broke Swing/AWT :)
687 - Sets the locale specified in the environment and defines
688   System properties user.language and user.region appropriately
690 - PowerPC platforms : bug fix for JNI methods with very large
691   numbers of arguments (e.g. 14 integer/reference arguments).
693 - Consistency checks for zip/jar files loaded by bootstrap class
694   loader.  A bad zip shouldn't crash the VM.
696 - Endian check for platforms without endian.h (e.g. cygwin)
698 - JamVM's VM classes are now installed and loaded from a zip file
699   (unless zip support is disabled in the bootstrap loader).  This
700   stops old classes being left around from a previous version.
703 JamVM 1.2.2 released on 14th December 2004
704 ==========================================
706 This release is primarily intended to align JamVM with recent changes
707 made to GNU Classpath's VM interface.  As of now, JamVM 1.2.2 again
708 works with Classpath from CVS, and Classpath-0.12.  A couple of
709 minor bug-fixes have also been made.
711 - Native methods for new VM integration class VMSystemProperties
712   implemented, and changes to VMRuntime.
714 - Bug fix for DCONST_1 on ARM machines using mixed-endian doubles
715   (bug was introduced in new interpreter).
717 - Added check for VFP soft-floating point on ARM (in addition to FPA).
719 - Bug fix for arraycopy and boolean arrays.
721 - Bug fix for JNI function GetStringUTFLength.
724 JamVM 1.2.1 released on 2nd December 2004
725 =========================================
727 - Standalone jar files can now be executed via the -jar command line option
729 - Updated to use Classpath-0.12 
730         - Merged changes to reference VMClassLoader, reflect/Method
731         - Now uses Classpath's system class loader
732         - VMAccessController implemented
734 - 5-10% interpreter speed improvement
736 - Improved ARM platform support
737         - Big Endian systems
738         - Soft floating point
740 - SMP memory barriers on Intel and PowerPC
742 - Fix for certain Unicode chars in JNI method names
744 - Intel FP bug fix (Debian bug no. 260410).  Use double (64-bit) rather
745   than extended (80-bit) precision
747 - Memory leak when two threads compete to load a class (rare race
748   condition)
750 - Handle SIGPIPE, stopping the VM aborting.
753 JamVM 1.2.0 released on 9th September 2004
754 ==========================================
756 - Substantially rewritten the interpreter to use "stack-caching".  This is
757   an optimisation to eliminate most of the intermediate loads and stores to
758   the operand stack.  On desktop PowerPC (e.g. PPC750fx, MPC7447 with large,
759   on-chip L2 cache at full processor speed) it achieves a speed increase of
760   between 15 and 30%.  On ARM (XScale PXA250) it achieves a speed-up of 
761   50%.  Unfortunately, due to the addressing modes of the IA32 (Pentium, etc.)
762   and the code produced by gcc, it is actually slower than the old interpreter!
763   Because of this, stack-caching is disabled by default on IA32.
765 - Zip/Jar support is implemented in the bootstrap class loader.  This means
766   glibj.zip no longer needs to be unzipped.  This includes resources.
768 - Fix for edge-conditions in floating-point to integer conversion (floating-
769   point value greater than int/long range).
771 - Fix for very large array allocation, where the required memory overflows a
772   32 bit int (fixes the SEGV with Mauve).
774 - Several other minor bug-fixes (e.g. ExceptionCheck was missed out of the JNI
775   i/f table).
778 JamVM 1.1.4 released on 21st May 2004
779 =====================================
781 - JNI enhancements introduced in Java 1.2 implemented.
783 - Updated to use GNU Classpath 0.09.
785 - Pre-compiled VM classes will now be rebuilt automatically if Java sources
786   change.  Fix to enable build directory to be different to source directory.
788 - Deprecated compiler warnings in gcc >= 3.3.3 fixed (use of cast expressions
789   as lvalues).  JamVM now also builds with gcc 3.5.0.
791 - Minor bug-fixes and speed optimisations.
793 - Eclipse now starts up.
796 JamVM 1.1.3 released on 12th April 2004
797 =======================================
799 JamVM 1.1.3 is primarily another bug-fix release.  New functionality will
800 be included in JamVM 1.1.4.
802 - Resolution fixes to make JamVM 100% compatible with code produced
803   by javac in JDK >= 1.4 and Jikes 1.19.
805 - New command line options -bootclasspath/a and -bootclasspath/p to prepend
806   or append entries to the default bootstrap class loader.
808 - Default initial heap size increased to 1Mb from 256K.  "Hello World" will
809   work with a heap of 75K, but this better reflects desktop application heap
810   usage.  In an embedded environment -ms can be used to specify a smaller
811   initial heap (e.g. -ms256k).
813 - Bug fix for private method invocation via JNI and reflection.
815 - Several other minor bug-fixes.
818 JamVM 1.1.2 released on 29th March 2004
819 =======================================
821 JamVM 1.1.2 is primarily a bug-fix release.  No new major functionality is
822 included, but many, many bugs have been fixed.  If JamVM didn't work for you
823 before, give this release a go!  Off the top of my head and in no
824 particular order:
826  - Arraycopy and instanceof fixed for arrays involving different dimensions
827    and Object element type
829  - Array/inner class/primitive class access flags correctly set (important
830    for serialization)
832  - Reflection API : method invoke on interface methods now works
834  - JNI : method invoke on interface methods now works
836  - getResource/getResources implemented for bootstrap class loader
838  - ClassLoader.findLoadedClass now handles classes initiated by a
839    class loader
841  - The thread contextClassLoader is now set
843  - The protection domain is now set for a class
845  - Many other minor bugs 
847 JamVM now uses VMRuntime and will now only work with Classpath 0.08.
850 JamVM 1.1.1 released on 25th January 2004
851 =========================================
853 - Now supports classes compiled for target >= 1.2.  In the past, javac inserted
854   synthetic methods for interface methods not implemented by abstract classes.
855   These are not produced if javac is used with -target 1.2, which is now the
856   default with JDK 1.4.  JamVM now inserts these methods if they are not
857   supplied by the compiler.
858   
859 - Class loader changes.  JamVM now records initiating loaders so user-defined
860   class loaders should be referred to less.
862 - Updated to use classpath 0.07.
864 - Java 2 style application class loader/bootstrap class loader split
865          - new command line options -bootclasspath and -classpath (or -cp)
866          - Jar and Zip archives can now be specified in the classpath.
868 - bug fixes (integration of Classpath 0.06 in JamVM 1.1.0 broke instanceOf)
870 - Re-worked stack overflow handling.  Previously, the first thread overflow
871   would be trapped, but further overflows would not.  A thread may now catch
872   StackOverflowException and repeatedly overflow.
875 JamVM 1.1.0 released on 17th November 2003
876 ==========================================
878 There's been quite a few changes, including performance improvements and more of
879 the specification is now implemented (should be everything now but Runtime.exec),
880 as well as the usual bug-fixes.
882 - Interface method tables are now implemented.  This means an interface method
883   invocation should now be almost as fast as a normal virtual method.
885 - The full Reflection API is implemented (Constructor, Field, Method, etc.)
886   with primitive widening and wrapping and inner class support.
888 - Updated to use Classpath-0.06 rather than 0.04 (note JamVM won't work with
889   0.04 anymore).
891 - Ported to the ARM architecture.
893 - Re-worked exception printing - now supports 1.4 style StackTraceElements.
895 - Interpreter optimisations (more "fast" bytecodes).
897 - Command line system properties can now be specified (-Dname=value).
900 JamVM 1.0.0 released on 12th March 2003
901 =======================================
903 - INITIAL RELEASE