Major changes between ISE Eiffel 5.2 and ISE Eiffel 5.3

What's new

  • Finalized executable with option `exception trace' enabled will now display the instruction number (usually equivalent to the line number in the routine) being executed when a failure occurred. It was already displaying this information in workbench/melted mode, we have just extended this feature to finalize mode.
  • Incremental compilation is now available for .NET code generation. Meaning that if you modify one class, only this class is being recompiled. It dramatically improves development time when targeting .NET.
  • In .NET code generation, assertions can be turned on or off on a class per class basis without having to recompile those classes.
  • Implemented recoverable storable to enable the retrieval of slightly different version of an object. It only applies for classic Eiffel.


  • Enabled support for Borland C compiler in .NET.
  • Removed too many warnings during C compilation on Tru64.
  • Improved formatting of exception traces so that class names, feature names, exception tags are not truncated. Display limit has been pushed at about 256 characters.


  • Made `\\' follow the balancing rules for various integer types.
  • Precompiled libraries now precompiles all classes reachable from clusters defined in project settings only if root class is ANY, otherwise it will only precompile classes reachable from the root class. In 5.1 and prior version it was precompiling all classes reachable from clusters.

Bug fixes

Language issues

  • Fixed semantic of object creations to strictly follow definition given in "Eiffel: The Language". Namely, if you have x of type X:

create x.make is equivalent to x := create {X}.makeIt implies some bug fixes which might break existing code. For example: x: X is once -- If make calls back to x then it used to return -- a non-Void value for x, where it should have been Void. create Result.make end x: X -- If make accesses back the x attribute then it used to return -- new value of x rather than the old value. create x.makeOr in melted code only the following code now works properly, i.e. make gets the old value of x, not the new one
create x.make (x)

  • Fixed undetected VDRD(3) errors: compiler was not strict enough and accepted ensure where only ensure then was valid.

Store/Retrieve issues

  • Fixed issue in storable mechanism when retrieving expanded objects.
  • Fixed issue with independent_store where storing arrays of objects whose count was greater than 65536 will cause a memory corruption.
  • Added correct_mismatch on HASH_TABLE to enable retrieval of the 5.1 and older version of HASH_TABLE.

Runtime/code generation issues

  • Fixed incorrect C code generation in final mode when creating an ARRAY of expanded type.
  • Fixed incorrect C code generation in final mode when creating a complex object which contains expanded objects that have expanded objects.
  • Fixed random crash issue in finalized applications due to incorrect memory management when you have code similar to:

f (g: STRING): ANY is do Result := create {STRING}.make_from_string (g) end

  • Fixed issue with deep_equal on ARRAY of expanded types which was returning False where it should have returned True .
  • Fixed code generation issue with double constants where code below was not producing the expected result of 1e+030:

value: DOUBLE is 1.0e15 print (value * value)

  • Fixed issue in melted code where computation such as INTEGER_X // INTEGER_Y will either crash or give an incorrect computation where X and Y represents integers that are either 8, 16, 32 or 64 bits long and X < Y.
  • Fixed incorrect C code generation of finalized code when your project configuration includes a precompiled library and that you cancel finalization process at degree -2, and then restart a finalization.
  • Fixed issue with incorrect C code generation of inspect instruction based on character values above 128.
  • Fixed compilation crash at degree 3 with following code:

local i: INTEGER do i := << 1 >> @ 2 end

  • Fixed a crash in finalized mode with invariant checking enabled with following code and when checking the invariant triggers a garbage collection cycle:

value: INTEGER is_value_required: BOOLEAN is do Result := value = 1 end

  • Fixed crash of compiler at degree 4 while trying to compile this incorrect class:

class CRASH inherit CHAIN -- Missing generic parameter create make feature -- Initialization make is do end index: INTEGER is do end duplicate (n: INTEGER): like Current is do end end

  • Fixed issue with pathological memory allocation scheme that could trigger an `out of memory' exception where enough memory is still available.
  • Fixed incorrect allocation of expanded arrays where creation routine of expanded class was not called on all items of the newly created array.
  • Fixed incorrect creation type of attribute where attribute's type has some generic parameter. In some cases, instead of creating an ARRAY [B2 [C]] it would create an ARRAY [B2 [STRING]].

.NET issues

  • Fixed issue in IL code generation where having a class that inherits from a non-Eiffel .NET class. And the class has the following features:

a: ARRAY [like f] f: STRING is do endThen you could neither load nor execute the generated code.

  • Fixed incorrect C file naming when generating a .NET system that uses a C++ external (it should be .cpp, not just .c).
  • Fixed incorrect .NET code generation with following assignment attempts whose source is expanded:

local a: ANY o: SYSTEM_OBJECT do a ?= 12 o ?= 12 end

  • Fixed incorrect code generation in .NET for assertions checking with following code where precondition of test will not be checked although it should:

make is do test_which_fail_and_rescued test end test is require should_be_checked: False do end test_which_fail_and_rescued is local retried: BOOLEAN do if not retried then failure end rescue retried := true; retry end failure is require should_be_checked: False do end

  • Fixed .NET verification issue where sometimes you could get the following message when checking an Eiffel assembly against peverify: [IL]: Error: Unverifiable PE Header/native stub.
  • Fixed incorrect code generation when creating and accessing a NATIVE_ARRAY of expanded type.
  • Fixed incorrect metadata heap generation to use standard CLI tables.
  • Fixed bug where content of NATIVE_ARRAY could not be looked up in .NET debuggers (cordbg, DbgClr or Visual Studio)