[[Property:title|Major changes between ISE Eiffel 6.3 and ISE Eiffel 6.4]]
[[Property:link_title|6.4]]
[[Property:weight|-11]]
[[Property:uuid|08206c9f-42fc-d007-ca09-4cf6a42207c2]]
==What's new==
{{seealso|[[Differences between standard ECMA-367 and Eiffel Software implementation|Differences between standard ECMA-367 and Eiffel Software implementation]] }}
* Added new compiler command line options: '''-experiment''' and '''-compat'''. The '''-compat''' option has no effect in 6.4. The '''-experiment''' option changes the internal value of $ISE_LIBRARY to look for libraries under $ISE_EIFFEL/experimental/library. Those libraries are truly void-safe with respect to ARRAY/SPECIAL and because of that change, might break your existing code. In 6.5, the experimental libraries will become the default libraries. So, you are encouraged to take steps to ensure that your code will compile with the experimental libraries. We have made it possible to compile the same code under both sets of libraries. This should facilitate testing.
* Added support for iPhone platform.
* Added support for the new syntax for object test, i.e. "<eiffel>attached {T} expr as u</eiffel>" instead of "<code>{u: T} expr</code>".
* Added free syntax for '''stable''' attributes; the final syntax is being discussed by the ECMA committee. Stable attribute is an attribute of a detachable type that is never assigned void. This property makes it possible to apply to it most of the CAP rules suitable for read-only entities. The stable attributes can be declared using value '''stable''' of the <eiffel>note</eiffel> tag option, for example:<eiffel>
a: detachable MY_TYPE note option: stable attribute end
</eiffel>


==Improvements==
* Added support for multiple object tests using the same object test local name in a single feature, provided that their scopes do not intersect. 
* Made precompilations work on Mac OS X. 
* Improved inlining of deferred routines implemented as attributes or constants in INLINER by allowing their inlining.
* Added support for detecting Mac OS X and VxWorks target compilation. 
* Improved C compilation speed of E1/eskelet.c in workbench mode when using VS 2005 C++ for 64-bit. We went from a benchmark of 3 minutes down to 1 minute. This is definitely caused by a bug in VS, because the 32-bit version compiles the same code in just a matter of a few seconds. Microsoft reports having a fix for this in VS 2010.
* Fixed bug#15343 where backups were very large if you referenced many .NET assemblies even when not compiling for .NET. 
* Attached attribute initialization in creation procedures is now detected not only by inspecting the top-level instructions, but also the nested complex instructions with several possible execution paths, like conditional instruction, multi-branch, etc.
* Improved degree 6 performance by not examining the content of all .e files to determine the associated class name. We now assume on the first pass that the file name is the class name. On EiffelStudio, if none of the files were buffered, we went from about 1 minute spent to just less than 3 seconds. The improvement should be even more visible when classes are on a remote drive.
* Fixed eweasel test#runtime010 where certain allocation patterns could cause a major slow down during a garbage collection cycle.

==Changes==
* Ensured that particular options specified in a library cannot be overridden in a project, because they apply to the source code (e.g., specify a variant of a syntax) rather than to the code generation (e.g., specify which assertions have to be monitored). 
* Removed usage of infix/prefix in most of the libraries. To ease transition, added a compatibility option that allows existing code using the infix/prefix notation to continue to compile.
* Attachment status of formal generic constraints are now taken into account when checking conformance and detecting VUTA errors when target type is a formal generic. '''Important''': default attachment status of the constraints follows the "attached-by-default" setting, so the code might need to be updated by adding a detachable mark in front of the formal generic constraints if the actual generic parameters can be detachable types. 
* The compiler does not produce the class progress output in batch mode. The old behavior is available by using the '''-verbose''' option. 
* Fixed incorrect display of NATURAL_32 attributes when calling `out' (fixes eweasel test#exec298 and bug#13862.) 

==Bug fixes==

===Language issues===
* Renamed VUPR errors to their ECMA name VDPR. 
* Better explanation for VDPR(3) errors when two or more precursors are available, by listing all the precursors.
* Non-void arguments are now detected not only when they are specified in the voidness tests in immediate preconditions, but also in inherited ones. 
* Fixed missing detection of VRFT errors in cases like "<eiffel>a: TUPLE [a: TUPLE [out: INTEGER]]</eiffel>".

===Compiler issues===
* Incremented ECF XML schema version to reflect the recent changes.
* Replaced ECF schema attribute syntax_level of an integer type with syntax of a string type that contains one of the three possible values.
* Replaced ECF schema attribute is_void_safe of a boolean type with void_safety of a string type that contains one of the three possible values ('''none''': no void safety checks; '''all''':all void safety checks; '''initialization''': on-demand void safety checks, i.e. only for entities that are attached).
* Fixed eweasel test#syntax042 and test#syntax047 as well as bug#15514 that allowed invalid characters in new C external specification. Removed generation of error when trying the old syntax, the syntax error will be based in the new syntax now.
* Fixed eweasel test#agent004 and test#agent010 by ensuring the result type of the agent is properly instantiated in the agent target type context.
* Fixed missing reporting of VEVI error for attributes initialized from a creation procedure by calling a once routine because the latter is not guaranteed to be executed on subsequent calls. 
* Fixed eweasel test#incr322 and test#final079 where compiler would crash when a routine was implemented as an attribute that can be access statically in final mode. 
* Fixed eweasel test#incr322 and test#final079 which caused a crash during finalization of a call to a deferred routine implemented as an attribute with a body or some assertions. 
* Fixed eweasel test#melt085 and test#melt086 where using Precursor in a manifest array, manifest tuple or expression of an object test would cause a crash at runtime. 
* Fixed multiple issues with validity checks involving multi-constraint formal generics and "like Current" types.
* Fixed system validity errors which were not previously detected or on the other hand rejected when it was correct. Fixes eweasel tests test#svalid019, test#svalid020 and test#multicon051. 
* Fixed eweasel test#exec310 and bug#14477 where if you have a class name that is longer than 512 bytes or an attribute name longer than 512 bytes and you call `out' it would cause a buffer overflow.

===Runtime/code generation issues===
* Fixed broken generation of single threaded DLL. 
* Fixed a bug on Windows where including some Eiffel multithreaded code in a DLL would cause a crash. This was due to the way we compiled our Thread Local Storage using a Microsoft optimization that only works for normal binaries, not DLLs. 
* Fixed some interpreter crashes when handling manifest strings or agent expressions.
* Fixed eweasel test#final077 where the arguments passed to a creation expression where not properly processed when analyzing expressions. This caused the following instruction: "l_x := x.y.z (create .make (l_x))" to override the value of `l_x' with the value of `x.y' which is wrong. 
* Fixed eweasel test#incr321 when if you finalize after removing a class from the system, then execution of workbench code fails. 
* Fixed eweasel test#attach047 where type of array of string passed as argument to the creation procedure of the root class should have an attached actual argument type. 
* Fixed eweasel test#expanded008 and bug#15693 where if you had an expanded with references attributes then the garbage collector would not update the internal references of the expanded and cause some memory corruption. 
* Fixed a non-detection of stack overflow in a multithreaded application on Linux. 
* Fixed test#thread002 where early termination of parent threads could corrupt memory if children thread are still alive. 
* Fixed eweasel test#thread003 and test#thread007 where you could have a memory corruption at runtime when calling {THREAD}.join and no children threads have been launched yet.
* Fixed test#thread008 where you could have a memory corruption at runtime when calling {MEMORY}.find_referers.
* Fixed eweasel test#thread010 where a child thread would crash if its parent has already terminated and that child thread never started a thread. 
* Improved signal handling to use more recent APIs when available. It especially fixes issue on Solaris where a signal handler was not reinstated after a SIGSEGV signal. It fixes eweasel test#except029.
* Fixed a bug with exception generated during the evaluation of a once in melted mode. This fixes eweasel test#except014 and test#except030.
* Worked around a bug in the Sun C compiler which caused the creation of SPECIAL in melted code to always fail when runtime is compiled with optimizations. It fixes eweasel test#melt070, test#melt081, test#term139, test#store014 and test#tuple006.
* Fixed a potential infinite loop when exiting a crash application when while quitting a signal is received which cause our last print statement to also fail (case of SIGPIPE), then it will infinitely repeat that sequence. This fixes the issue where eweasel test#vsrp208, although it was passing, ec was still using 100% CPU. 

===Store/Retrieve issues===
* When handling a mismatch instead of generating the _REF classes for basic types, we generate directly an instance of the basic type so that one can do an object test on the basic type directly.
* Improved compatibility of storables between void-safe and non-void-safe systems so that a non-void-safe system can retrieve a storable created by a void-safe system by ignoring all the attachment marks. 
* Fixed an unnoticeable performance issue with the C storable/retrieval mechanism (bug#14495).


