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.

Improvements

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.

Changes

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:

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)