Major changes between ISE Eiffel 5.4 and ISE Eiffel 5.5
- Full support for new
Void,previously a feature of
ANY, a keyword. This prevents the renaming of Voidinto not_voidpreviously possible when it was a routine of ANY.
- Addition of the
referencekeyword 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] ... endto say that the valid actual generic parameters for
- Added support for Microsoft .NET 2.0 runtime.
- Allowed agent creation on infix or prefix routines.
- 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.
- 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_expandand 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
.resourcesis appended for resources that are originally provided as
.txtfiles. 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:
ANYby the much simpler inheritance clause:
- If you were using a feature of
SYSTEM_OBJECTdirectly on Eiffel classes, now you need to assign the value to a variable entity of type SYSTEM_OBJECT. In other word:
o := e
- The following assignment attempt will succeed whereas it failed before because
SYSTEM_OBJECTdid not inherit from ANY:
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
Cin the text of a class Bif and only if it satisfies the following conditions:
Cis not a deferred class
C's version of the procedure default_create(inherited from ANY) is one of the creation procedures of Cavailable to Bfor creation.
- New validity rule for expanded class: An expanded class
Cneeds to have the version of the procedure default_create(inherited from ANY) as one of its creation procedure.
- 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]
l_any: LIST [ANY]
l_g: LIST [G]
l_any := l_g
l_g := l_any
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]
l_any: LIST [ANY]
l_g: LIST [G]
l_any := l_g
l_g ?= l_any
- Enabled creation of
SPECIALinstances, no need to create an instance of TO_SPECIALor ARRAYto get a SPECIALinstance. Now you can simply do:
my_special: SPECIAL [INTEGER]
create my_special.make (10)
- Fixed incrementality issues with
stripand 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]
class C [G]
l_a: A [STRING, expanded C [ANY]]
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
- 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_stackfor a routine body which could make the generated code not verifiable.
- Fix some issues related to the use of recoverable storable when manipulating generic types.