[[Property:title|Major changes between ISE Eiffel 5.3 and ISE Eiffel 5.4]]
[[Property:link_title|5..4]]
[[Property:weight|-11]]
[[Property:uuid|2fa36c0f-5b6a-f3f8-67a6-6bd73f63732d]]
==What's new==
* Support for assertion checking on external routines.
* Removed limitation about implementing or redefining a non-external routine by an external one and vice versa.
* Support for new C/C++ inline specification.
* For .NET, allow calling of overloaded features for a .NET classes to be called without using disambiguated names. Disambiguated names are still needed when redefining inherited features from .NET classes.
* Support for inclusion of .NET resources within Eiffel assemblies.
* Launch C compilation when needed if "-c_compile" option is specified on the "ec" command line. 
* Added ability to define custom attributes on assembly. One as to define custom attributes under the new `assembly_metadata` index clause of the root class.
* Limited support for new <code> convert </code> keyword (only on argument passing and assignments. Not supported when used with infix routines). 

==Improvements==
* Improved speed of compilation by about 20-30%
* Improved run-time memory allocation speed and footprint so that it has a 15%-20% faster allocation scheme and takes less memory than before.
* Reduced waiting time at the end of the degree 6 when performing a compilation from scratch (reduced to about 50% or more of the time it used to take)
* Improved speed of <eiffel>TUPLE</eiffel> creation and <eiffel>TUPLE</eiffel> access which generates more compact C code. 
* Improved speed of agent calls by a factor of 2 to 3.
* Improved speed of Eiffel calls from C (CECIL and use of $ operator on routines). It also makes generated executables smaller (about 1-5% smaller depending on number of routines used in this context)

==Changes==
* Changed the way we generate calls to C/C++ external routines. It is possible that because of this change, code that used to C compile, will not compile anymore. This happens mostly when mixing C and C++ code and the C call being made is incorrect but was not previously checked against the C header files if provided.
* In multithreaded mode, all C externals that could potentially block the execution of the system should be marked `blocking` as in: <br/>
<code>	sleep (m: INTEGER) is
		external
			"C blocking"          
		end</code>
Not doing it could generate dead-lock during the execution of a multithreaded system. 
* Static access on externals is now only authorized when external is a frozen external without assertions.
* Compiler will now report a warning for assignments like those: <br/>
<code>td: TUPLE [DOUBLE]
ti: TUPLE [INTEGER]

td := ti</code>
The warning will help you correct code using this pattern, because in the next release this will be rejected in order to conform to the Eiffel programming language specification. 
* Now we do not generate by default the .NET attribute <eiffel>ComVisibleAttribute</eiffel> with a False value. If needed it has to be done through the new compiler functionality to add custom attributes on assembly.
* Changed indexing clause tag for specifying custom attributes for .NET systems. Now `attribute` is replaced by `metadata`. Now you can have: 
** metadata: generated for both interface and implementation classes 
** assembly_metadata: generated for assembly only when specified in root class of system 
** class_metadata: generated only for implementation class 
** interface_metadata: generated only for interface class


==Bug fixes==

===Language issues===
* Now checks for valid export status in agent creation. Meaning that in class <eiffel>MY_CLASS</eiffel>, the following agent creation <code> agent </code> <eiffel>target</eiffel>. <eiffel>call</eiffel> is valid if and only if <eiffel>call</eiffel> is exported to <eiffel>MY_CLASS</eiffel>. 
* Allowed type specification for open operands in agent creation, i.e. one can now write: <code> agent </code> <eiffel>f</eiffel> ({ <eiffel>A</eiffel>}). 
* Fixed bug which allowed compiler to accept the following incorrect code: <eiffel>char</eiffel>: <eiffel>CHARACTER</eiffel> <code> is </code> <code> "rdsf" </code> 
* Fixed bug in error reporting for incompatible <eiffel>BIT</eiffel> types involving bit manifest constants. It would always report <eiffel>BIT 0</eiffel>, instead of the actual number of bits in the bit manifest constant. 

===Compiler issues===
* Fixed non-detection of changes when changing code from <code> agent </code> <eiffel>call </eiffel>to <code> agent </code> <code> Current </code>. <eiffel>call</eiffel>. Which should check for the validity of export of <eiffel>call </eiffel> to current class. 
* Fixed creation and assignment attempts on generic types that have anchored types in their generic parameter, and the anchor is itself generic.

===Runtime/code generation issues===
* Fixed issue when shared library definition file did not exist or was invalid. Now it will not produce any C compilation errors.
* Fixed bug in recoverable storable when there is a mismatch. The first assignment attempt in <eiffel>internal_correct_mismatch</eiffel> from <eiffel>ANY</eiffel> would crash. 
* Fixed issue when retrieving storable files that contain TUPLE instances.
* Fixed issues when using agents in a multithreaded application, they will sometimes disable the garbage collector and the application might quickly run out of memory.
* Fixed random crashes when EIF_MEMORY_CHUNK, EIF_MEMORY_SCAVENGE and EIF_STACK_CHUNK environment variables had an incorrect value. Instead the runtime will now fix the value to an appropriate one.

===.NET issues===
* Fixed bug in code generation with following statement: <br/>
<code>l_time: TIME_SPAN
print (l_time.total_milliseconds.out)</code>

* Fixed incorrect code generation with code accessing attributes of .NET expanded types.
* Fixed incorrect computation of equal when used with basic types, e.g. equal (1, 1) would return False instead of True. 

===Store/Retrieve issues===
* Fixed memory corruption bug with recoverable storable when a mismatch was detected
* Fixed issue where mismatch was not detected if attributes were dropped
* Fixed issue with independent store when storing <eiffel>TUPLE</eiffel> objects where it would crash if storable did not include a reference to <eiffel>ANY</eiffel>. 




