| Online Eiffel Documentation

EiffelStudio

# 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}.make

  It 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.make

  Or 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 withdeep_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
      		end

  Then 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 oftest 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)