[[Property:title|Major changes between ISE Eiffel 5.4 and ISE Eiffel 5.5]]
[[Property:link_title|5.5]]
[[Property:weight|-12]]
[[Property:uuid|1d8b9ba7-0609-b664-a4cf-16be1132b071]]
==What's new==
* Full support for new convert
keyword.
* Made Void,
previously a feature of ANY, a keyword. This prevents the renaming of Void into not_void previously possible when it was a routine of ANY.
* Addition of the reference
keyword used in generic constraints (See next point).
* Added support for reference and expanded constraints on a formal generic parameter. In other word, one can now write:
class A [reference G] ... end
class B [expanded G] ... end
to say that the valid actual generic parameters for A are always reference types, and for B are always expanded types.
* Added support for Microsoft .NET 2.0 runtime.
* Allowed agent creation on infix or prefix routines.
==Improvements==
* Reduced, in classic mode, size of finalized executables by 10 to 50%.
* Improved speed of evaluation of global onces, in a multithreaded system, by having a lock-free mechanism after a once has been evaluated.
* Reduced memory usage of special of expanded which do not have any reference attributes. Before there was a 8 bytes (or 16 bytes depending on the platform) overhead per item in the special.
==Changes==
* Compiler is now checking that you cannot redeclare a formal generic parameter into a reference type unless the formal generic parameter is being constraint to be always a reference type (See the '''What's new''' section above).
* Removed obsolete eifcid, eif_expand and eifexpfrom the CECIL interface, one has to use eif_type_idinstead.
* In .NET, changed the naming conventions of resources included in an assembly. The extension `.resources` is appended for resources that are originally provided as `.resx` or `.txt` files. Other files are embedded as is in the assembly and the name of the resource is the name of the file.
* In .NET, now all classes inherit from ANY. Before all classes inherited from SYSTEM_OBJECT. The consequences are:
** You can write an Eiffel generic classes where the actual generic parameter is a .NET class.
** If you used to inherit from .NET classes and Eiffel classes you can replace the inheritance clause below:
class A
inherit
APPLICATION_EXCEPTION
undefine
finalize,
equals,
to_string,
get_hash_code
end
ANY
by the much simpler inheritance clause:
class A
inherit
APPLICATION_EXCEPTION
** If you were using a feature of SYSTEM_OBJECT directly on Eiffel classes, now you need to assign the value to a variable entity of type SYSTEM_OBJECT. In other word:
e: EIFFEL_CLASS
o: SYSTEM_OBJECT
...
o := e
o.feature_of_system_object
** The following assignment attempt will succeed whereas it failed before because SYSTEM_OBJECT did not inherit from ANY:
a: ANY
o: SYSTEM_OBJECT
...
check o /= Void and a = Void end
a ?= o
check o /= Void and a /= Void end
* New format of the independent storable files which takes into account internal changes made for a better generic conformance in classic mode.
* New validity rule for expanded types: It is valid to use an expanded type of base class C in the text of a class B if and only if it satisfies the following conditions:
** C is not a deferred class
** C's version of the procedure default_create (inherited from ANY) is one of the creation procedures of C available to B for creation.
* New validity rule for expanded class: An expanded class C needs to have the version of the procedure default_create (inherited from ANY) as one of its creation procedure.
==Bug fixes==
===Language issues===
* Fixed issue about conformance checking of type containing a formal generic parameter. We would always evaluate the formal to its constraint, thus allowing the code below to be accepted where it should not have been:
class A [G]
feature
bug is
local
l_any: LIST [ANY]
l_g: LIST [G]
do
l_any := l_g
l_g := l_any
end
The workaround is to use the reference
keyword to guarantee that the formal generic parameter will always be instantiated with a reference type. For example the code below is correct:
class A [reference G]
feature
bug is
local
l_any: LIST [ANY]
l_g: LIST [G]
do
l_any := l_g
l_g ?= l_any
end
===Compiler issues===
* Enabled creation of SPECIAL instances, no need to create an instance of TO_SPECIALor ARRAY to get a SPECIALinstance. Now you can simply do:
my_special: SPECIAL [INTEGER]
create my_special.make (10)
* Fixed incrementality issues with strip
and static calls on external routines which could fail after a class has been added to or removed from the system.
===Runtime/code generation issues===
* Fixed incorrect code generation which would result in a C compiler error in classic mode when assigning a Void entity to a formal generic parameter that will be instantiated as a basic type.
* In multithreaded mode, fixed dead lock on Unix platforms when evaluating global onces.
* In multithreaded mode, prevented dead lock when a thread is exiting.
* In multithreaded mode, prevented memory corruption which could occur if the first thing that a thread performs when launched is to trigger a GC collection.
* Fixed incorrect generic conformance data when manipulating expanded generic types. For example, the following code:
class A [G, H]
feature
item: H
end
class C [G]
end
class ROOT_CLASS
create
make
feature
make is
local
l_a: A [STRING, expanded C [ANY]]
do
create l_a
io.put_string (l_a.item.generating_type)
end
end
would print
expanded C [STRING]
instead of
expanded C [ANY]
* Fixed issue where you could get a bogus reference when trying to get a reference to the object associated to an ID (obtained through the IDENTIFIED class).
===.NET issues===
* Fixed incorrect code generation of native arrays which would cause the code to be rejected in newer version of the .NET Framework.
* Fixed incorrect computation of `max_stack` for a routine body which could make the generated code not verifiable.
===Store/Retrieve issues===
* Fix some issues related to the use of recoverable storable when manipulating generic types.