<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://dev.eiffel.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Manus</id>
		<title>EiffelStudio: an EiffelSoftware project - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://dev.eiffel.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Manus"/>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/Special:Contributions/Manus"/>
		<updated>2026-05-02T01:25:41Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_18.11_Releases&amp;diff=15647</id>
		<title>EiffelStudio 18.11 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_18.11_Releases&amp;diff=15647"/>
				<updated>2018-07-25T14:16:10Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Created page with &amp;quot;Category:Releases__NOTOC__{{ReleaseHistoryHeader}}  = EiffelStudio 18.11.x Releases=  Beta download: https://ftp.eiffel.com/pub/beta/18.11/  ==18.11.xx.yyyy ()==  ===New f...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 18.11.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/18.11/&lt;br /&gt;
&lt;br /&gt;
==18.11.xx.yyyy ()==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===User changes===&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.05_Releases&amp;diff=15507</id>
		<title>EiffelStudio 17.05 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.05_Releases&amp;diff=15507"/>
				<updated>2017-05-23T14:29:09Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Bug fixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 17.05.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/17.05/&lt;br /&gt;
&lt;br /&gt;
==17.05.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* studio: Add Visual Studio 2017 support for C compilation.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*library (docking): Docking library is now completely void-safe. Breaking changes: some creation features now require a docking manager object as an argument.&lt;br /&gt;
*compiler: Obsolete calls are detected and reported for features used as binary and unary operators and in conversions.&lt;br /&gt;
*compiler: Messages about obsolete calls provide information about source code location.&lt;br /&gt;
*EiffelStudio (inspector): Obsolete messages are checked for presence of a date in format [&amp;lt;code&amp;gt;yyyy-mm-dd&amp;lt;/code&amp;gt;] that tells when the feature is considered obsolete and call to it should be removed. If the date is not specified, a warning is reported and a default value [&amp;lt;code&amp;gt;2017-05-31&amp;lt;/code&amp;gt;] is used.&lt;br /&gt;
*EiffelStudio (inspector): Obsolete calls are detected and reported with different severity levels depending on the message date:&lt;br /&gt;
*: suggestion - in the future&lt;br /&gt;
*: warning - less than 1 year old&lt;br /&gt;
*: error - more than 1 year old&lt;br /&gt;
*EiffelStudio (inspector): Obsolete features reported with different severity levels depending on the message date:&lt;br /&gt;
*: nothing - less than 1.5 year old&lt;br /&gt;
*: warning - more than 1.5 year old&lt;br /&gt;
*compiler: Improved performance of object initialization checks in complete void safe mode when a class has hundreds of attributes and features (including inherited ones).&lt;br /&gt;
*library: Updated libraries and examples included with EiffelStudio installation to avoid obsolete feature calls.&lt;br /&gt;
*EiffelStudio (IDE): arguments and local variables are pickable (P&amp;amp;D: you can pick the associated stone, and drop it in editor). Note: for now only normal feature locals are supported.&lt;br /&gt;
*library (cms): Improved the CMS library with&lt;br /&gt;
*library (EiffelWeb/wsf): Fixed computation of path info, in extreme condition.&lt;br /&gt;
*library (uri): improved path and query url encoding, supported various exceptions.&lt;br /&gt;
*library (http_client): fixed query and url encoded form-data generation, to follow RFC.&lt;br /&gt;
*: fixed port number support for EiffelNet implementation.&lt;br /&gt;
*: fixed redirection behavior, should follow only for 3** status code.&lt;br /&gt;
*: Allow forcing multipart/form-data or application/x-www-form-urlencoded to choose how the form data should be sent.&lt;br /&gt;
*library (json): Added JSON_VALUE.is_string, is_number, ..., is_null boolean queries for convenience.&lt;br /&gt;
*library (crypto): Fixed and improved BASE32 and BASE64 implementation.&lt;br /&gt;
*library (wikitext): Improved support for wiki table and wiki images.&lt;br /&gt;
*library (cms): many improvements and additions&lt;br /&gt;
*: splitted administration pages from main site page.&lt;br /&gt;
*: improved editing workflow, with better control on (un)published entries.&lt;br /&gt;
*: added sitemap generation&lt;br /&gt;
*: added notion of author vs editor (WARNING: requires database update)&lt;br /&gt;
*: added support for Google Custom Search 2.0&lt;br /&gt;
*: format can be customized with available filters.&lt;br /&gt;
*: feed aggregation: added possibility to embed view, added possibility to order by date.&lt;br /&gt;
*: new messaging module to send message to web site users.&lt;br /&gt;
*: added support for profile name, in addition to standard user name (so now, for security, username can be hidden from posts)&lt;br /&gt;
*library (base): Added new creation procedure `{*_STRING_8}.make_from_c_substring (...)`&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: bug#19333 (test#melt110) - Fixed a bug that caused melted code to fail when it had a call to &amp;lt;e&amp;gt;{CHARACTER_32}.is_character_8&amp;lt;/e&amp;gt;.&lt;br /&gt;
*library (base): test#reflection010 - Fixed a postcondition &amp;lt;code&amp;gt;dynamic_type_set&amp;lt;/code&amp;gt; of the feature &amp;lt;e&amp;gt;{REFLECTOR}.new_instance_of&amp;lt;/e&amp;gt; that did not take into account a possibility that the supplied type ID may have an attachment mark.&lt;br /&gt;
*library (vision): - Fixed a precondition violation that may be triggered by dropping selected file names on Windows into a Vision widget.&lt;br /&gt;
*library (base): bug#19277 (test#lib044) - Fixed bugs in traversal of &amp;lt;e&amp;gt;HASH_TABLE&amp;lt;/e&amp;gt; using &amp;lt;e&amp;gt;ITERABLE&amp;lt;/e&amp;gt; cursors when some elements are removed: incorrect evaluation of &amp;lt;e&amp;gt;cursor_index&amp;lt;/e&amp;gt; that may cause a postcondition violation when advancing to the next item, incorrect backward traversal that may produce spurious items.&lt;br /&gt;
*compiler: test#attach124, test#attach125, test#attach126 - Fixed a bug that might lead to a call on void target in a completely void-safe program if newly created objects are created, passed to once functions and are returned as their result but then fail to finish their initialization because of an exception.&lt;br /&gt;
*EiffelStudio: bug#19336 - Fixed a bug that might cause a crash when Windows drag and drop mechanism is used to a drop a file name to the IDE when no project is open.&lt;br /&gt;
*compiler: test#attach127 - Fixed a bug that might cause access on void target in a completely void-safe application that passes an incompletely initialized object inside an expanded argument to a creation procedure that makes a qualified call on the incompletely initialized object.&lt;br /&gt;
*compiler: test#attach045 - Fixed a bug that might lead to undetected void safety issue when compiling in complete void safety mode and there is a test that an argument or a stable attribute is not void in an inherited precondition. Now attachment status of these variables does not depend on preconditions.&lt;br /&gt;
*library: test#lib045 - Fixed a bug in &amp;lt;e&amp;gt;HEXADECIMAL_STRING_TO_INTEGER_CONVERTER&amp;lt;/e&amp;gt; that caused incorrect processing of negative numbers when requested type was (a sized variant of) &amp;lt;e&amp;gt;NATURAL&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: test#codeanalysis025 - Fixed a bug that might cause code analyzer to finish with an error when checks involve inline agents or built-in features.&lt;br /&gt;
*run-time: test#scoop080 - Fixed a bug that might cause evaluation of a class invariant on a separate object before executing its creation procedure body.&lt;br /&gt;
*run-time: test#store045 - Allowed retrieval of old storables containing agent objects (PROCEDURE/FUNCTION or PREDICATE) when they still had an extra first generic parameter in version 15.08 and older, or before the change of internal representation in version 14.05.&lt;br /&gt;
*compiler: test#scoop081 - Fixed a bug that might cause infinite recursion when evaluating preconditions with agents in SCOOP mode when the system is frozen or finalized.&lt;br /&gt;
*library: scoop_patterns - Fixed inline C code that used a run-time macro that was renamed earlier.&lt;br /&gt;
*library: pcre - Fixed postconditions that used reference comparison instead of string value comparison to compare arguments with attributes initialized with the argument values.&lt;br /&gt;
*library (thread)/run-time: bug#19356 (test#thread025) - Fixed a bug that might cause incorrect behavior during thread termination if attribute &amp;lt;e&amp;gt;terminated&amp;lt;/e&amp;gt; of class &amp;lt;e&amp;gt;THREAD&amp;lt;/e&amp;gt; is renamed in a descendant.&lt;br /&gt;
*EiffelStudio (editor): fixed completion when inline agent or inline separate are before the cursor.&lt;br /&gt;
*EiffelStudio (IDE): fixed issue when importing EiffelStudio layout (also concerns previous settings importation).&lt;br /&gt;
*EiffelStudio (compiler): fixed tracing support, now the tracing starts from the beginning of the execution (as expected).&lt;br /&gt;
*library (json): Fixed parsing of integer 64 value (when it is not an integer 32).&lt;br /&gt;
*c_compilation: Enabled C compilation on Windows of code using winsock2 (See message to user's list for more detail).&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library (docking): Some creation procedures in the Docking library now require a docking manager object as an argument.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.05_Releases&amp;diff=15506</id>
		<title>EiffelStudio 17.05 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.05_Releases&amp;diff=15506"/>
				<updated>2017-05-23T14:27:13Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* New features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 17.05.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/17.05/&lt;br /&gt;
&lt;br /&gt;
==17.05.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
* studio: Add Visual Studio 2017 support for C compilation.&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*library (docking): Docking library is now completely void-safe. Breaking changes: some creation features now require a docking manager object as an argument.&lt;br /&gt;
*compiler: Obsolete calls are detected and reported for features used as binary and unary operators and in conversions.&lt;br /&gt;
*compiler: Messages about obsolete calls provide information about source code location.&lt;br /&gt;
*EiffelStudio (inspector): Obsolete messages are checked for presence of a date in format [&amp;lt;code&amp;gt;yyyy-mm-dd&amp;lt;/code&amp;gt;] that tells when the feature is considered obsolete and call to it should be removed. If the date is not specified, a warning is reported and a default value [&amp;lt;code&amp;gt;2017-05-31&amp;lt;/code&amp;gt;] is used.&lt;br /&gt;
*EiffelStudio (inspector): Obsolete calls are detected and reported with different severity levels depending on the message date:&lt;br /&gt;
*: suggestion - in the future&lt;br /&gt;
*: warning - less than 1 year old&lt;br /&gt;
*: error - more than 1 year old&lt;br /&gt;
*EiffelStudio (inspector): Obsolete features reported with different severity levels depending on the message date:&lt;br /&gt;
*: nothing - less than 1.5 year old&lt;br /&gt;
*: warning - more than 1.5 year old&lt;br /&gt;
*compiler: Improved performance of object initialization checks in complete void safe mode when a class has hundreds of attributes and features (including inherited ones).&lt;br /&gt;
*library: Updated libraries and examples included with EiffelStudio installation to avoid obsolete feature calls.&lt;br /&gt;
*EiffelStudio (IDE): arguments and local variables are pickable (P&amp;amp;D: you can pick the associated stone, and drop it in editor). Note: for now only normal feature locals are supported.&lt;br /&gt;
*library (cms): Improved the CMS library with&lt;br /&gt;
*library (EiffelWeb/wsf): Fixed computation of path info, in extreme condition.&lt;br /&gt;
*library (uri): improved path and query url encoding, supported various exceptions.&lt;br /&gt;
*library (http_client): fixed query and url encoded form-data generation, to follow RFC.&lt;br /&gt;
*: fixed port number support for EiffelNet implementation.&lt;br /&gt;
*: fixed redirection behavior, should follow only for 3** status code.&lt;br /&gt;
*: Allow forcing multipart/form-data or application/x-www-form-urlencoded to choose how the form data should be sent.&lt;br /&gt;
*library (json): Added JSON_VALUE.is_string, is_number, ..., is_null boolean queries for convenience.&lt;br /&gt;
*library (crypto): Fixed and improved BASE32 and BASE64 implementation.&lt;br /&gt;
*library (wikitext): Improved support for wiki table and wiki images.&lt;br /&gt;
*library (cms): many improvements and additions&lt;br /&gt;
*: splitted administration pages from main site page.&lt;br /&gt;
*: improved editing workflow, with better control on (un)published entries.&lt;br /&gt;
*: added sitemap generation&lt;br /&gt;
*: added notion of author vs editor (WARNING: requires database update)&lt;br /&gt;
*: added support for Google Custom Search 2.0&lt;br /&gt;
*: format can be customized with available filters.&lt;br /&gt;
*: feed aggregation: added possibility to embed view, added possibility to order by date.&lt;br /&gt;
*: new messaging module to send message to web site users.&lt;br /&gt;
*: added support for profile name, in addition to standard user name (so now, for security, username can be hidden from posts)&lt;br /&gt;
*library (base): Added new creation procedure `{*_STRING_8}.make_from_c_substring (...)`&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: bug#19333 (test#melt110) - Fixed a bug that caused melted code to fail when it had a call to &amp;lt;e&amp;gt;{CHARACTER_32}.is_character_8&amp;lt;/e&amp;gt;.&lt;br /&gt;
*library (base): test#reflection010 - Fixed a postcondition &amp;lt;code&amp;gt;dynamic_type_set&amp;lt;/code&amp;gt; of the feature &amp;lt;e&amp;gt;{REFLECTOR}.new_instance_of&amp;lt;/e&amp;gt; that did not take into account a possibility that the supplied type ID may have an attachment mark.&lt;br /&gt;
*library (vision): - Fixed a precondition violation that may be triggered by dropping selected file names on Windows into a Vision widget.&lt;br /&gt;
*library (base): bug#19277 (test#lib044) - Fixed bugs in traversal of &amp;lt;e&amp;gt;HASH_TABLE&amp;lt;/e&amp;gt; using &amp;lt;e&amp;gt;ITERABLE&amp;lt;/e&amp;gt; cursors when some elements are removed: incorrect evaluation of &amp;lt;e&amp;gt;cursor_index&amp;lt;/e&amp;gt; that may cause a postcondition violation when advancing to the next item, incorrect backward traversal that may produce spurious items.&lt;br /&gt;
*compiler: test#attach124, test#attach125, test#attach126 - Fixed a bug that might lead to a call on void target in a completely void-safe program if newly created objects are created, passed to once functions and are returned as their result but then fail to finish their initialization because of an exception.&lt;br /&gt;
*EiffelStudio: bug#19336 - Fixed a bug that might cause a crash when Windows drag and drop mechanism is used to a drop a file name to the IDE when no project is open.&lt;br /&gt;
*compiler: test#attach127 - Fixed a bug that might cause access on void target in a completely void-safe application that passes an incompletely initialized object inside an expanded argument to a creation procedure that makes a qualified call on the incompletely initialized object.&lt;br /&gt;
*compiler: test#attach045 - Fixed a bug that might lead to undetected void safety issue when compiling in complete void safety mode and there is a test that an argument or a stable attribute is not void in an inherited precondition. Now attachment status of these variables does not depend on preconditions.&lt;br /&gt;
*library: test#lib045 - Fixed a bug in &amp;lt;e&amp;gt;HEXADECIMAL_STRING_TO_INTEGER_CONVERTER&amp;lt;/e&amp;gt; that caused incorrect processing of negative numbers when requested type was (a sized variant of) &amp;lt;e&amp;gt;NATURAL&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: test#codeanalysis025 - Fixed a bug that might cause code analyzer to finish with an error when checks involve inline agents or built-in features.&lt;br /&gt;
*run-time: test#scoop080 - Fixed a bug that might cause evaluation of a class invariant on a separate object before executing its creation procedure body.&lt;br /&gt;
*run-time: test#store045 - Allowed retrieval of old storables containing agent objects (PROCEDURE/FUNCTION or PREDICATE) when they still had an extra first generic parameter in version 15.08 and older, or before the change of internal representation in version 14.05.&lt;br /&gt;
*compiler: test#scoop081 - Fixed a bug that might cause infinite recursion when evaluating preconditions with agents in SCOOP mode when the system is frozen or finalized.&lt;br /&gt;
*library: scoop_patterns - Fixed inline C code that used a run-time macro that was renamed earlier.&lt;br /&gt;
*library: pcre - Fixed postconditions that used reference comparison instead of string value comparison to compare arguments with attributes initialized with the argument values.&lt;br /&gt;
*library (thread)/run-time: bug#19356 (test#thread025) - Fixed a bug that might cause incorrect behavior during thread termination if attribute &amp;lt;e&amp;gt;terminated&amp;lt;/e&amp;gt; of class &amp;lt;e&amp;gt;THREAD&amp;lt;/e&amp;gt; is renamed in a descendant.&lt;br /&gt;
*EiffelStudio (editor): fixed completion when inline agent or inline separate are before the cursor.&lt;br /&gt;
*EiffelStudio (IDE): fixed issue when importing EiffelStudio layout (also concerns previous settings importation).&lt;br /&gt;
*EiffelStudio (compiler): fixed tracing support, now the tracing starts from the beginning of the execution (as expected).&lt;br /&gt;
*library (json): Fixed parsing of integer 64 value (when it is not an integer 32).&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library (docking): Some creation procedures in the Docking library now require a docking manager object as an argument.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.05_Releases&amp;diff=15505</id>
		<title>EiffelStudio 17.05 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.05_Releases&amp;diff=15505"/>
				<updated>2017-05-23T14:26:37Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Bug fixes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 17.05.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/17.05/&lt;br /&gt;
&lt;br /&gt;
==17.05.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*library (docking): Docking library is now completely void-safe. Breaking changes: some creation features now require a docking manager object as an argument.&lt;br /&gt;
*compiler: Obsolete calls are detected and reported for features used as binary and unary operators and in conversions.&lt;br /&gt;
*compiler: Messages about obsolete calls provide information about source code location.&lt;br /&gt;
*EiffelStudio (inspector): Obsolete messages are checked for presence of a date in format [&amp;lt;code&amp;gt;yyyy-mm-dd&amp;lt;/code&amp;gt;] that tells when the feature is considered obsolete and call to it should be removed. If the date is not specified, a warning is reported and a default value [&amp;lt;code&amp;gt;2017-05-31&amp;lt;/code&amp;gt;] is used.&lt;br /&gt;
*EiffelStudio (inspector): Obsolete calls are detected and reported with different severity levels depending on the message date:&lt;br /&gt;
*: suggestion - in the future&lt;br /&gt;
*: warning - less than 1 year old&lt;br /&gt;
*: error - more than 1 year old&lt;br /&gt;
*EiffelStudio (inspector): Obsolete features reported with different severity levels depending on the message date:&lt;br /&gt;
*: nothing - less than 1.5 year old&lt;br /&gt;
*: warning - more than 1.5 year old&lt;br /&gt;
*compiler: Improved performance of object initialization checks in complete void safe mode when a class has hundreds of attributes and features (including inherited ones).&lt;br /&gt;
*library: Updated libraries and examples included with EiffelStudio installation to avoid obsolete feature calls.&lt;br /&gt;
*EiffelStudio (IDE): arguments and local variables are pickable (P&amp;amp;D: you can pick the associated stone, and drop it in editor). Note: for now only normal feature locals are supported.&lt;br /&gt;
*library (cms): Improved the CMS library with&lt;br /&gt;
*library (EiffelWeb/wsf): Fixed computation of path info, in extreme condition.&lt;br /&gt;
*library (uri): improved path and query url encoding, supported various exceptions.&lt;br /&gt;
*library (http_client): fixed query and url encoded form-data generation, to follow RFC.&lt;br /&gt;
*: fixed port number support for EiffelNet implementation.&lt;br /&gt;
*: fixed redirection behavior, should follow only for 3** status code.&lt;br /&gt;
*: Allow forcing multipart/form-data or application/x-www-form-urlencoded to choose how the form data should be sent.&lt;br /&gt;
*library (json): Added JSON_VALUE.is_string, is_number, ..., is_null boolean queries for convenience.&lt;br /&gt;
*library (crypto): Fixed and improved BASE32 and BASE64 implementation.&lt;br /&gt;
*library (wikitext): Improved support for wiki table and wiki images.&lt;br /&gt;
*library (cms): many improvements and additions&lt;br /&gt;
*: splitted administration pages from main site page.&lt;br /&gt;
*: improved editing workflow, with better control on (un)published entries.&lt;br /&gt;
*: added sitemap generation&lt;br /&gt;
*: added notion of author vs editor (WARNING: requires database update)&lt;br /&gt;
*: added support for Google Custom Search 2.0&lt;br /&gt;
*: format can be customized with available filters.&lt;br /&gt;
*: feed aggregation: added possibility to embed view, added possibility to order by date.&lt;br /&gt;
*: new messaging module to send message to web site users.&lt;br /&gt;
*: added support for profile name, in addition to standard user name (so now, for security, username can be hidden from posts)&lt;br /&gt;
*library (base): Added new creation procedure `{*_STRING_8}.make_from_c_substring (...)`&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: bug#19333 (test#melt110) - Fixed a bug that caused melted code to fail when it had a call to &amp;lt;e&amp;gt;{CHARACTER_32}.is_character_8&amp;lt;/e&amp;gt;.&lt;br /&gt;
*library (base): test#reflection010 - Fixed a postcondition &amp;lt;code&amp;gt;dynamic_type_set&amp;lt;/code&amp;gt; of the feature &amp;lt;e&amp;gt;{REFLECTOR}.new_instance_of&amp;lt;/e&amp;gt; that did not take into account a possibility that the supplied type ID may have an attachment mark.&lt;br /&gt;
*library (vision): - Fixed a precondition violation that may be triggered by dropping selected file names on Windows into a Vision widget.&lt;br /&gt;
*library (base): bug#19277 (test#lib044) - Fixed bugs in traversal of &amp;lt;e&amp;gt;HASH_TABLE&amp;lt;/e&amp;gt; using &amp;lt;e&amp;gt;ITERABLE&amp;lt;/e&amp;gt; cursors when some elements are removed: incorrect evaluation of &amp;lt;e&amp;gt;cursor_index&amp;lt;/e&amp;gt; that may cause a postcondition violation when advancing to the next item, incorrect backward traversal that may produce spurious items.&lt;br /&gt;
*compiler: test#attach124, test#attach125, test#attach126 - Fixed a bug that might lead to a call on void target in a completely void-safe program if newly created objects are created, passed to once functions and are returned as their result but then fail to finish their initialization because of an exception.&lt;br /&gt;
*EiffelStudio: bug#19336 - Fixed a bug that might cause a crash when Windows drag and drop mechanism is used to a drop a file name to the IDE when no project is open.&lt;br /&gt;
*compiler: test#attach127 - Fixed a bug that might cause access on void target in a completely void-safe application that passes an incompletely initialized object inside an expanded argument to a creation procedure that makes a qualified call on the incompletely initialized object.&lt;br /&gt;
*compiler: test#attach045 - Fixed a bug that might lead to undetected void safety issue when compiling in complete void safety mode and there is a test that an argument or a stable attribute is not void in an inherited precondition. Now attachment status of these variables does not depend on preconditions.&lt;br /&gt;
*library: test#lib045 - Fixed a bug in &amp;lt;e&amp;gt;HEXADECIMAL_STRING_TO_INTEGER_CONVERTER&amp;lt;/e&amp;gt; that caused incorrect processing of negative numbers when requested type was (a sized variant of) &amp;lt;e&amp;gt;NATURAL&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: test#codeanalysis025 - Fixed a bug that might cause code analyzer to finish with an error when checks involve inline agents or built-in features.&lt;br /&gt;
*run-time: test#scoop080 - Fixed a bug that might cause evaluation of a class invariant on a separate object before executing its creation procedure body.&lt;br /&gt;
*run-time: test#store045 - Allowed retrieval of old storables containing agent objects (PROCEDURE/FUNCTION or PREDICATE) when they still had an extra first generic parameter in version 15.08 and older, or before the change of internal representation in version 14.05.&lt;br /&gt;
*compiler: test#scoop081 - Fixed a bug that might cause infinite recursion when evaluating preconditions with agents in SCOOP mode when the system is frozen or finalized.&lt;br /&gt;
*library: scoop_patterns - Fixed inline C code that used a run-time macro that was renamed earlier.&lt;br /&gt;
*library: pcre - Fixed postconditions that used reference comparison instead of string value comparison to compare arguments with attributes initialized with the argument values.&lt;br /&gt;
*library (thread)/run-time: bug#19356 (test#thread025) - Fixed a bug that might cause incorrect behavior during thread termination if attribute &amp;lt;e&amp;gt;terminated&amp;lt;/e&amp;gt; of class &amp;lt;e&amp;gt;THREAD&amp;lt;/e&amp;gt; is renamed in a descendant.&lt;br /&gt;
*EiffelStudio (editor): fixed completion when inline agent or inline separate are before the cursor.&lt;br /&gt;
*EiffelStudio (IDE): fixed issue when importing EiffelStudio layout (also concerns previous settings importation).&lt;br /&gt;
*EiffelStudio (compiler): fixed tracing support, now the tracing starts from the beginning of the execution (as expected).&lt;br /&gt;
*library (json): Fixed parsing of integer 64 value (when it is not an integer 32).&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library (docking): Some creation procedures in the Docking library now require a docking manager object as an argument.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15445</id>
		<title>EiffelStudio 17.01 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15445"/>
				<updated>2016-07-09T07:42:21Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.11.x.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.11.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.11/&lt;br /&gt;
&lt;br /&gt;
==16.11.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*EiffelStudio: Configuration option ''&amp;quot;Are types attached by default?&amp;quot;'' defaults to ''True'' when reading non-void-safe projects so that if the project is changed to be void-safe, the recommended default for attachment status of class types without marks is used.&lt;br /&gt;
*compiler: Supported nested inlining of a selected set of features from &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt; in finalized mode: &amp;lt;e&amp;gt;base_address&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;clear_all&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;copy_data&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;count&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;non_overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: Fix crash in melted code when calling &amp;lt;e&amp;gt;{TYPE}.is_attached&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{TYPE}.is_expanded&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add ability to change the start position when storing/retrieving using a &amp;lt;e&amp;gt;SED_MEMORY_READER_WRITER&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add &amp;lt;e&amp;gt;{TYPE}.is_deferred&amp;lt;/e&amp;gt; and use this in &amp;lt;e&amp;gt;{REFLECTOR}.new_instance_of&amp;lt;/e&amp;gt; to avoid creating abstract type at runtime.&lt;br /&gt;
*Library (Base}: Refactored &amp;lt;e&amp;gt;RT_DEBUGGER&amp;lt;/e&amp;gt; with breaking changes: &amp;lt;e&amp;gt;rt_worbench_for_for_debugger&amp;lt;/e&amp;gt; renamed into &amp;lt;e&amp;gt;wait_for_debugger&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;discard_debug&amp;lt;/e&amp;gt; into &amp;lt;e&amp;gt;disable_debug&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
*EiffelStudio: Removed option ''&amp;quot;Are types attached by default?&amp;quot;'' from project settings dialog. Potential incompatibility: old Eiffel configuration files (ECF) that rely on &amp;quot;class types are detachable by default&amp;quot; policy and migrate to &amp;quot;attached by default&amp;quot; policy will need to be changed directly by editing the file, not from EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed a bug in the CECIL macro &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;eif_attribute_type&amp;lt;/code&amp;gt; that always returned &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;EIF_POINTER_TYPE&amp;lt;/code&amp;gt; instead of the type code corresponding to the actual attribute type.&lt;br /&gt;
*Library (Net): Properly handle `BCC` recipients by really hiding them.&lt;br /&gt;
*compiler: Fix C compilation errors when using the profiler in final mode on strict C compilers (fix bug#19193 and eweasel test#final16, test#ccomp070)&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library: Marked &amp;lt;e&amp;gt;{ANY}.as_attached&amp;lt;/e&amp;gt; as obsolete to simplify removal of calls to it when transition to void-safe code is finished.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15444</id>
		<title>EiffelStudio 17.01 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15444"/>
				<updated>2016-07-09T07:38:14Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.11.x.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.11.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.11/&lt;br /&gt;
&lt;br /&gt;
==16.11.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*EiffelStudio: Configuration option ''&amp;quot;Are types attached by default?&amp;quot;'' defaults to ''True'' when reading non-void-safe projects so that if the project is changed to be void-safe, the recommended default for attachment status of class types without marks is used.&lt;br /&gt;
*compiler: Supported nested inlining of a selected set of features from &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt; in finalized mode: &amp;lt;e&amp;gt;base_address&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;clear_all&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;copy_data&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;count&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;non_overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: Fix crash in melted code when calling &amp;lt;e&amp;gt;{TYPE}.is_attached&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{TYPE}.is_expanded&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add ability to change the start position when storing/retrieving using a &amp;lt;e&amp;gt;SED_MEMORY_READER_WRITER&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add &amp;lt;e&amp;gt;{TYPE}.is_deferred&amp;lt;/e&amp;gt; and use this in &amp;lt;e&amp;gt;{REFLECTOR}.new_instance_of&amp;lt;/e&amp;gt; to avoid creating abstract type at runtime.&lt;br /&gt;
*Library (Base}: Refactored RT_DEBUGGER with breaking changes: &amp;lt;e&amp;gt;rt_worbench_for_for_debugger&amp;lt;/e&amp;gt; renamed into &amp;lt;e&amp;gt;wait_for_debugger&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;discard_debug&amp;lt;/e&amp;gt; into &amp;lt;e&amp;gt;disable_debug&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
*EiffelStudio: Removed option ''&amp;quot;Are types attached by default?&amp;quot;'' from project settings dialog. Potential incompatibility: old Eiffel configuration files (ECF) that rely on &amp;quot;class types are detachable by default&amp;quot; policy and migrate to &amp;quot;attached by default&amp;quot; policy will need to be changed directly by editing the file, not from EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed a bug in the CECIL macro &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;eif_attribute_type&amp;lt;/code&amp;gt; that always returned &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;EIF_POINTER_TYPE&amp;lt;/code&amp;gt; instead of the type code corresponding to the actual attribute type.&lt;br /&gt;
*Library (Net): Properly handle `BCC` recipients by really hiding them.&lt;br /&gt;
*compiler: Fix C compilation errors when using the profiler in final mode on strict C compilers (fix bug#19193 and eweasel test#final16, test#ccomp070)&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library: Marked &amp;lt;e&amp;gt;{ANY}.as_attached&amp;lt;/e&amp;gt; as obsolete to simplify removal of calls to it when transition to void-safe code is finished.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15443</id>
		<title>EiffelStudio 17.01 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15443"/>
				<updated>2016-07-09T07:36:38Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.11.x.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.11.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.11/&lt;br /&gt;
&lt;br /&gt;
==16.11.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*EiffelStudio: Configuration option ''&amp;quot;Are types attached by default?&amp;quot;'' defaults to ''True'' when reading non-void-safe projects so that if the project is changed to be void-safe, the recommended default for attachment status of class types without marks is used.&lt;br /&gt;
*compiler: Supported nested inlining of a selected set of features from &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt; in finalized mode: &amp;lt;e&amp;gt;base_address&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;clear_all&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;copy_data&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;count&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;non_overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: Fix crash in melted code when calling &amp;lt;e&amp;gt;{TYPE}.is_attached&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{TYPE}.is_expanded&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add ability to change the start position when storing/retrieving using a &amp;lt;e&amp;gt;SED_MEMORY_READER_WRITER&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add &amp;lt;e&amp;gt;{TYPE}.is_deferred&amp;lt;/e&amp;gt; and use this in &amp;lt;e&amp;gt;{REFLECTOR}.new_instance_of&amp;lt;/e&amp;gt; to avoid creating abstract type at runtime.&lt;br /&gt;
*Library (Base}: Refactored RT_DEBUGGER with breaking changes: &amp;lt;e&amp;gt;rt_worbench_for_for_debugger&amp;lt;/e&amp;gt; renamed into &amp;lt;e&amp;gt;wait_for_debugger&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;discard_debug&amp;lt;/e&amp;gt; into &amp;lt;e&amp;gt;disable_debug&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Net): Properly handle `BCC` recipients by really hiding them.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
*EiffelStudio: Removed option ''&amp;quot;Are types attached by default?&amp;quot;'' from project settings dialog. Potential incompatibility: old Eiffel configuration files (ECF) that rely on &amp;quot;class types are detachable by default&amp;quot; policy and migrate to &amp;quot;attached by default&amp;quot; policy will need to be changed directly by editing the file, not from EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed a bug in the CECIL macro &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;eif_attribute_type&amp;lt;/code&amp;gt; that always returned &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;EIF_POINTER_TYPE&amp;lt;/code&amp;gt; instead of the type code corresponding to the actual attribute type.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library: Marked &amp;lt;e&amp;gt;{ANY}.as_attached&amp;lt;/e&amp;gt; as obsolete to simplify removal of calls to it when transition to void-safe code is finished.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15442</id>
		<title>EiffelStudio 17.01 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15442"/>
				<updated>2016-07-09T07:32:09Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.11.x.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.11.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.11/&lt;br /&gt;
&lt;br /&gt;
==16.11.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*EiffelStudio: Configuration option ''&amp;quot;Are types attached by default?&amp;quot;'' defaults to ''True'' when reading non-void-safe projects so that if the project is changed to be void-safe, the recommended default for attachment status of class types without marks is used.&lt;br /&gt;
*compiler: Supported nested inlining of a selected set of features from &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt; in finalized mode: &amp;lt;e&amp;gt;base_address&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;clear_all&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;copy_data&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;count&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;non_overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt;.&lt;br /&gt;
*compiler: Fix crash in melted code when calling &amp;lt;e&amp;gt;{TYPE}.is_attached&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{TYPE}.is_expanded&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add ability to change the start position when storing/retrieving using a &amp;lt;e&amp;gt;SED_MEMORY_READER_WRITER&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add &amp;lt;e&amp;gt;{TYPE}.is_deferred&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
*EiffelStudio: Removed option ''&amp;quot;Are types attached by default?&amp;quot;'' from project settings dialog. Potential incompatibility: old Eiffel configuration files (ECF) that rely on &amp;quot;class types are detachable by default&amp;quot; policy and migrate to &amp;quot;attached by default&amp;quot; policy will need to be changed directly by editing the file, not from EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed a bug in the CECIL macro &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;eif_attribute_type&amp;lt;/code&amp;gt; that always returned &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;EIF_POINTER_TYPE&amp;lt;/code&amp;gt; instead of the type code corresponding to the actual attribute type.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library: Marked &amp;lt;e&amp;gt;{ANY}.as_attached&amp;lt;/e&amp;gt; as obsolete to simplify removal of calls to it when transition to void-safe code is finished.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15441</id>
		<title>EiffelStudio 17.01 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_17.01_Releases&amp;diff=15441"/>
				<updated>2016-07-09T07:29:44Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.11.x.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.11.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.11/&lt;br /&gt;
&lt;br /&gt;
==16.11.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
*EiffelStudio: Configuration option ''&amp;quot;Are types attached by default?&amp;quot;'' defaults to ''True'' when reading non-void-safe projects so that if the project is changed to be void-safe, the recommended default for attachment status of class types without marks is used.&lt;br /&gt;
*compiler: Supported nested inlining of a selected set of features from &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt; in finalized mode: &amp;lt;e&amp;gt;base_address&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;clear_all&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;copy_data&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;count&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;non_overlapping_move&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;put&amp;lt;/e&amp;gt;.&lt;br /&gt;
*Library (Base): Add ability to change the start position when storing/retrieving using a &amp;lt;e&amp;gt;SED_MEMORY_READER_WRITER&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
*EiffelStudio: Removed option ''&amp;quot;Are types attached by default?&amp;quot;'' from project settings dialog. Potential incompatibility: old Eiffel configuration files (ECF) that rely on &amp;quot;class types are detachable by default&amp;quot; policy and migrate to &amp;quot;attached by default&amp;quot; policy will need to be changed directly by editing the file, not from EiffelStudio.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*runtime: Fixed a bug in the CECIL macro &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;eif_attribute_type&amp;lt;/code&amp;gt; that always returned &amp;lt;code lang=&amp;quot;c&amp;quot;&amp;gt;EIF_POINTER_TYPE&amp;lt;/code&amp;gt; instead of the type code corresponding to the actual attribute type.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library: Marked &amp;lt;e&amp;gt;{ANY}.as_attached&amp;lt;/e&amp;gt; as obsolete to simplify removal of calls to it when transition to void-safe code is finished.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_16.05_Releases&amp;diff=15440</id>
		<title>EiffelStudio 16.05 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_16.05_Releases&amp;diff=15440"/>
				<updated>2016-07-09T07:28:50Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.05.9.8969 (July 8th 2016) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.05 Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.05/&lt;br /&gt;
&lt;br /&gt;
==16.05.9.8969 (July 8th 2016)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*EiffelStudio: Add VS 15 in addition of VS 2015 as backend C compiler.&lt;br /&gt;
===Improvements===&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*EiffelStudio: Fix EiffelWeb wizards&lt;br /&gt;
*EiffelStudio: Fix inability in project settings to add .NET assemblies.&lt;br /&gt;
*EiffelBuild: Fixed a bug causing incompletely initialized application and environment objects to be used when showing a window in a project generated by EiffelBuild.&lt;br /&gt;
*library (Vision): bug#19241 - Fixed a non-critical bug in the feature &amp;lt;e&amp;gt;{EV_DIALOG_IMP_COMMON}.show&amp;lt;/e&amp;gt; that might lead to infinite recursion on Windows, though the feature is never called because it is always redefined except in classes for modal dialogs where a different feature is used for display.&lt;br /&gt;
*library (Base): test#agent015 - Fixed a regression bug in .NET version of &amp;lt;e&amp;gt;ROUTINE&amp;lt;/e&amp;gt; that may cause an incorrect result or an exception when calling &amp;lt;e&amp;gt;{ROUTINE}.valid_operands&amp;lt;/e&amp;gt; on an agent with reference arguments or when invoking such an agent with preconditions turned on.&lt;br /&gt;
*library (Base): bug#19245 (test#directory002) - Fixed a bug preventing directory contents with non-ASCII entry names to be recursively deleted when using &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{DIRECTORY}.delete_content&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete_with_action&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;{DIRECTORY}.delete_contents_with_action&amp;lt;/e&amp;gt;.&lt;br /&gt;
*library (Base): Fixed a bug when &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt; could call an action agent even when the argument &amp;lt;e&amp;gt;file_number&amp;lt;/e&amp;gt; was not positive that should have prevented any agent calls.&lt;br /&gt;
*runtime: test#runtime020 - Fixed a bug that may cause a Windows application to crash when it attempts to use standard input/output.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library (Base): test#directory002 - Avoided calls to an action agent from &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt; with the same arguments twice when processing nested directories.&lt;br /&gt;
*library (Base): test#directory002 - Changed &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete_with_action&amp;lt;/e&amp;gt; to avoid calling an action agent when the argument &amp;lt;e&amp;gt;file_number&amp;lt;/e&amp;gt; is not positive so that the behavior is similar to &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==16.05.9.8814 (May 31st 2016)==&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: Provided more details  (such as option name, rule name, kind of syntax error) for errors in code analysis command-line options.&lt;br /&gt;
*compiler: Supported position-independent code analysis options (temporary retaining old code analysis options) that act like regular EiffelStudio command-line options:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-ca_class (-all | &amp;lt;class_name&amp;gt;)&lt;br /&gt;
-ca_default&lt;br /&gt;
-ca_rule &amp;lt;rule_name_with_optional_setting&amp;gt;&lt;br /&gt;
-ca_setting &amp;lt;preference_file_name&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
*compiler: Relaxed void safety rules for local variables and &amp;lt;e&amp;gt;Result&amp;lt;/e&amp;gt; by allowing assigning of detachable values to them even when their type is attached. The change allows dropping explicit detachable marks in local declarations and simplifying code that uses Result, e.g.,&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 local&lt;br /&gt;
                         r: detachable X&lt;br /&gt;
                 do&lt;br /&gt;
                         r := something&lt;br /&gt;
                         if not attached r then&lt;br /&gt;
                                 r := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                         Result := r&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 do&lt;br /&gt;
                         if attached something as r then&lt;br /&gt;
                                 Result := r&lt;br /&gt;
                         else&lt;br /&gt;
                                 Result := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
can now be rewritten as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 do&lt;br /&gt;
                         Result := something&lt;br /&gt;
                         if not attached Result then&lt;br /&gt;
                                 Result := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The change does not allow previously void-unsafe code to be treated as void-safe, but may affect errors reported by the compiler, in particular:&lt;br /&gt;
# VEVI errors may be now reported as VUTA(2) when a local of an attached type is used as a target of call before it is attached.&lt;br /&gt;
# VEVI errors may be now reported as VJAR or VUAR when a local of an attached type is used as a source expression before it is attached.&lt;br /&gt;
# VJAR errors may now be reported as VUTA(2) when a local of an attached type is assigned a detachable value and is later used as a target of a call.&lt;br /&gt;
# VJAR errors may now be reported as VEVI when &amp;lt;e&amp;gt;Result&amp;lt;/e&amp;gt; of an attached type is assigned a detachable value.&lt;br /&gt;
*compiler: Improved code generation for iterative form of loops in finalized mode by taking into account cursor types provided by iterable classes.&lt;br /&gt;
*compiler: Avoided object creation when accessing an attribute (usually &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;) on an expression of a basic type.&lt;br /&gt;
*compiler: Slightly improved performance of feature call on void target checks in finalized mode.&lt;br /&gt;
*compiler: Supported nested inlining of &amp;lt;e&amp;gt;{SPECIAL}.item&amp;lt;/e&amp;gt; in finalized mode.&lt;br /&gt;
*library: Improved performance of iteration forms of loops for targets of the following classes: &amp;lt;e&amp;gt;ARRAY&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;ARRAYED_LIST&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;READABLE_STRING_32&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;READABLE_STRING_8&amp;lt;/e&amp;gt;.&lt;br /&gt;
*EiffelStudio: Improved reporting for errors in regular expressions used in include and exclude file rules in ECF by adding position information and providing error description all the time.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*EiffelStudio: bug#19173 - Fixed a bug that caused an exception when requesting to generate documentation or XMI for a target with a library disabled by a condition.&lt;br /&gt;
*compiler: test#codeanalysis019 - Fixed a bug that caused duplicate reports for CA020 rule (unused assigned variable) inside one class or spurious reports for this rule on several classes.&lt;br /&gt;
*compiler: bug#18028 (test#final114), test#final123 - Fixed a bug that caused incorrect code generation when inlining &amp;lt;e&amp;gt;across&amp;lt;/e&amp;gt; loops or &amp;lt;e&amp;gt;separate&amp;lt;/e&amp;gt; instructions.&lt;br /&gt;
*compiler: test#scoop077 - Fixed a bug in applying SCOOP semantics rules and checking SCOOP validity rules for iteration forms of loops with a target of a separate type.&lt;br /&gt;
*EiffelStudio: bug#19212 - Fixed a bug that caused an exception when using metrics tool and affected [[EiffelStudio 15.12 Releases]].&lt;br /&gt;
*library: bug#19213 - Fixed a bug in an external signature of one of WEL features that might cause a crash when compiled with Gobo compiler.&lt;br /&gt;
*compiler: test#attach118 - Fixed a bug that might cause incorrect error reports for inherited code when target of reattachment involving conversion is of a detachable type.&lt;br /&gt;
*EiffelStudio: Added checks for validity of regular expressions used in include and exclude file rules specified in the project settings dialog with rejection of invalid regular expression using the corresponding error dialog to avoid a possibility to store ECF that cannot be retrieved.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*EiffelStudio: Changed order of processing of arguments taken from the command line and from the environment variable &amp;lt;code&amp;gt;ISE_EC_FLAGS&amp;lt;/code&amp;gt;. Now arguments are first read from the environment variable and then from the command line.&lt;br /&gt;
*compiler: Marked old code analysis command-line options as obsolete.&lt;br /&gt;
*library: Changed interface and implementation of cursor classes used to implement &amp;lt;e&amp;gt;across&amp;lt;/e&amp;gt; loops to get better performance.&lt;br /&gt;
*library: Added protection of window objects (of type &amp;lt;e&amp;gt;EV_WINDOW&amp;lt;/e&amp;gt; and descendants) from garbage collection when there are no references to them or to objects holding such references and the associated windows become visible by using a feature &amp;lt;e&amp;gt;show&amp;lt;/e&amp;gt; or its modifications (&amp;lt;e&amp;gt;show_modal_to_window&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;show_relative_to_window&amp;lt;/e&amp;gt;) until the windows become hidden using &amp;lt;e&amp;gt;hide&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;destroy&amp;lt;/e&amp;gt;. The protection should not affect any existing applications, but allows for easier window management in user's code especially in SCOOP mode.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_16.05_Releases&amp;diff=15439</id>
		<title>EiffelStudio 16.05 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_16.05_Releases&amp;diff=15439"/>
				<updated>2016-07-09T07:17:21Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.05.9.8814 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.05 Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.05/&lt;br /&gt;
&lt;br /&gt;
==16.05.9.8969 (July 8th 2016)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*EiffelBuild: Fixed a bug causing incompletely initialized application and environment objects to be used when showing a window in a project generated by EiffelBuild.&lt;br /&gt;
*library (Vision): bug#19241 - Fixed a non-critical bug in the feature &amp;lt;e&amp;gt;{EV_DIALOG_IMP_COMMON}.show&amp;lt;/e&amp;gt; that might lead to infinite recursion on Windows, though the feature is never called because it is always redefined except in classes for modal dialogs where a different feature is used for display.&lt;br /&gt;
*library (Base): test#agent015 - Fixed a regression bug in .NET version of &amp;lt;e&amp;gt;ROUTINE&amp;lt;/e&amp;gt; that may cause an incorrect result or an exception when calling &amp;lt;e&amp;gt;{ROUTINE}.valid_operands&amp;lt;/e&amp;gt; on an agent with reference arguments or when invoking such an agent with preconditions turned on.&lt;br /&gt;
*library (Base): bug#19245 (test#directory002) - Fixed a bug preventing directory contents with non-ASCII entry names to be recursively deleted when using &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{DIRECTORY}.delete_content&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete_with_action&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;{DIRECTORY}.delete_contents_with_action&amp;lt;/e&amp;gt;.&lt;br /&gt;
*library (Base): Fixed a bug when &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt; could call an action agent even when the argument &amp;lt;e&amp;gt;file_number&amp;lt;/e&amp;gt; was not positive that should have prevented any agent calls.&lt;br /&gt;
*runtime: test#runtime020 - Fixed a bug that may cause a Windows application to crash when it attempts to use standard input/output.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library (Base): test#directory002 - Avoided calls to an action agent from &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt; with the same arguments twice when processing nested directories.&lt;br /&gt;
*library (Base): test#directory002 - Changed &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete_with_action&amp;lt;/e&amp;gt; to avoid calling an action agent when the argument &amp;lt;e&amp;gt;file_number&amp;lt;/e&amp;gt; is not positive so that the behavior is similar to &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==16.05.9.8814 (May 31st 2016)==&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: Provided more details  (such as option name, rule name, kind of syntax error) for errors in code analysis command-line options.&lt;br /&gt;
*compiler: Supported position-independent code analysis options (temporary retaining old code analysis options) that act like regular EiffelStudio command-line options:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-ca_class (-all | &amp;lt;class_name&amp;gt;)&lt;br /&gt;
-ca_default&lt;br /&gt;
-ca_rule &amp;lt;rule_name_with_optional_setting&amp;gt;&lt;br /&gt;
-ca_setting &amp;lt;preference_file_name&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
*compiler: Relaxed void safety rules for local variables and &amp;lt;e&amp;gt;Result&amp;lt;/e&amp;gt; by allowing assigning of detachable values to them even when their type is attached. The change allows dropping explicit detachable marks in local declarations and simplifying code that uses Result, e.g.,&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 local&lt;br /&gt;
                         r: detachable X&lt;br /&gt;
                 do&lt;br /&gt;
                         r := something&lt;br /&gt;
                         if not attached r then&lt;br /&gt;
                                 r := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                         Result := r&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 do&lt;br /&gt;
                         if attached something as r then&lt;br /&gt;
                                 Result := r&lt;br /&gt;
                         else&lt;br /&gt;
                                 Result := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
can now be rewritten as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 do&lt;br /&gt;
                         Result := something&lt;br /&gt;
                         if not attached Result then&lt;br /&gt;
                                 Result := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The change does not allow previously void-unsafe code to be treated as void-safe, but may affect errors reported by the compiler, in particular:&lt;br /&gt;
# VEVI errors may be now reported as VUTA(2) when a local of an attached type is used as a target of call before it is attached.&lt;br /&gt;
# VEVI errors may be now reported as VJAR or VUAR when a local of an attached type is used as a source expression before it is attached.&lt;br /&gt;
# VJAR errors may now be reported as VUTA(2) when a local of an attached type is assigned a detachable value and is later used as a target of a call.&lt;br /&gt;
# VJAR errors may now be reported as VEVI when &amp;lt;e&amp;gt;Result&amp;lt;/e&amp;gt; of an attached type is assigned a detachable value.&lt;br /&gt;
*compiler: Improved code generation for iterative form of loops in finalized mode by taking into account cursor types provided by iterable classes.&lt;br /&gt;
*compiler: Avoided object creation when accessing an attribute (usually &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;) on an expression of a basic type.&lt;br /&gt;
*compiler: Slightly improved performance of feature call on void target checks in finalized mode.&lt;br /&gt;
*compiler: Supported nested inlining of &amp;lt;e&amp;gt;{SPECIAL}.item&amp;lt;/e&amp;gt; in finalized mode.&lt;br /&gt;
*library: Improved performance of iteration forms of loops for targets of the following classes: &amp;lt;e&amp;gt;ARRAY&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;ARRAYED_LIST&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;READABLE_STRING_32&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;READABLE_STRING_8&amp;lt;/e&amp;gt;.&lt;br /&gt;
*EiffelStudio: Improved reporting for errors in regular expressions used in include and exclude file rules in ECF by adding position information and providing error description all the time.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*EiffelStudio: bug#19173 - Fixed a bug that caused an exception when requesting to generate documentation or XMI for a target with a library disabled by a condition.&lt;br /&gt;
*compiler: test#codeanalysis019 - Fixed a bug that caused duplicate reports for CA020 rule (unused assigned variable) inside one class or spurious reports for this rule on several classes.&lt;br /&gt;
*compiler: bug#18028 (test#final114), test#final123 - Fixed a bug that caused incorrect code generation when inlining &amp;lt;e&amp;gt;across&amp;lt;/e&amp;gt; loops or &amp;lt;e&amp;gt;separate&amp;lt;/e&amp;gt; instructions.&lt;br /&gt;
*compiler: test#scoop077 - Fixed a bug in applying SCOOP semantics rules and checking SCOOP validity rules for iteration forms of loops with a target of a separate type.&lt;br /&gt;
*EiffelStudio: bug#19212 - Fixed a bug that caused an exception when using metrics tool and affected [[EiffelStudio 15.12 Releases]].&lt;br /&gt;
*library: bug#19213 - Fixed a bug in an external signature of one of WEL features that might cause a crash when compiled with Gobo compiler.&lt;br /&gt;
*compiler: test#attach118 - Fixed a bug that might cause incorrect error reports for inherited code when target of reattachment involving conversion is of a detachable type.&lt;br /&gt;
*EiffelStudio: Added checks for validity of regular expressions used in include and exclude file rules specified in the project settings dialog with rejection of invalid regular expression using the corresponding error dialog to avoid a possibility to store ECF that cannot be retrieved.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*EiffelStudio: Changed order of processing of arguments taken from the command line and from the environment variable &amp;lt;code&amp;gt;ISE_EC_FLAGS&amp;lt;/code&amp;gt;. Now arguments are first read from the environment variable and then from the command line.&lt;br /&gt;
*compiler: Marked old code analysis command-line options as obsolete.&lt;br /&gt;
*library: Changed interface and implementation of cursor classes used to implement &amp;lt;e&amp;gt;across&amp;lt;/e&amp;gt; loops to get better performance.&lt;br /&gt;
*library: Added protection of window objects (of type &amp;lt;e&amp;gt;EV_WINDOW&amp;lt;/e&amp;gt; and descendants) from garbage collection when there are no references to them or to objects holding such references and the associated windows become visible by using a feature &amp;lt;e&amp;gt;show&amp;lt;/e&amp;gt; or its modifications (&amp;lt;e&amp;gt;show_modal_to_window&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;show_relative_to_window&amp;lt;/e&amp;gt;) until the windows become hidden using &amp;lt;e&amp;gt;hide&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;destroy&amp;lt;/e&amp;gt;. The protection should not affect any existing applications, but allows for easier window management in user's code especially in SCOOP mode.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_16.05_Releases&amp;diff=15438</id>
		<title>EiffelStudio 16.05 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_16.05_Releases&amp;diff=15438"/>
				<updated>2016-07-09T07:16:50Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* 16.05.x.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 16.05 Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/16.05/&lt;br /&gt;
&lt;br /&gt;
==16.05.9.8969 (July 8th 2016)==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
===Improvements===&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*EiffelBuild: Fixed a bug causing incompletely initialized application and environment objects to be used when showing a window in a project generated by EiffelBuild.&lt;br /&gt;
*library (Vision): bug#19241 - Fixed a non-critical bug in the feature &amp;lt;e&amp;gt;{EV_DIALOG_IMP_COMMON}.show&amp;lt;/e&amp;gt; that might lead to infinite recursion on Windows, though the feature is never called because it is always redefined except in classes for modal dialogs where a different feature is used for display.&lt;br /&gt;
*library (Base): test#agent015 - Fixed a regression bug in .NET version of &amp;lt;e&amp;gt;ROUTINE&amp;lt;/e&amp;gt; that may cause an incorrect result or an exception when calling &amp;lt;e&amp;gt;{ROUTINE}.valid_operands&amp;lt;/e&amp;gt; on an agent with reference arguments or when invoking such an agent with preconditions turned on.&lt;br /&gt;
*library (Base): bug#19245 (test#directory002) - Fixed a bug preventing directory contents with non-ASCII entry names to be recursively deleted when using &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{DIRECTORY}.delete_content&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete_with_action&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;{DIRECTORY}.delete_contents_with_action&amp;lt;/e&amp;gt;.&lt;br /&gt;
*library (Base): Fixed a bug when &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt; could call an action agent even when the argument &amp;lt;e&amp;gt;file_number&amp;lt;/e&amp;gt; was not positive that should have prevented any agent calls.&lt;br /&gt;
*runtime: test#runtime020 - Fixed a bug that may cause a Windows application to crash when it attempts to use standard input/output.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*library (Base): test#directory002 - Avoided calls to an action agent from &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt; with the same arguments twice when processing nested directories.&lt;br /&gt;
*library (Base): test#directory002 - Changed &amp;lt;e&amp;gt;{DIRECTORY}.recursive_delete_with_action&amp;lt;/e&amp;gt; to avoid calling an action agent when the argument &amp;lt;e&amp;gt;file_number&amp;lt;/e&amp;gt; is not positive so that the behavior is similar to &amp;lt;e&amp;gt;{DIRECTORY}.delete_content_with_action&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;br /&gt;
&lt;br /&gt;
==16.05.9.8814==&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
*compiler: Provided more details  (such as option name, rule name, kind of syntax error) for errors in code analysis command-line options.&lt;br /&gt;
*compiler: Supported position-independent code analysis options (temporary retaining old code analysis options) that act like regular EiffelStudio command-line options:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-ca_class (-all | &amp;lt;class_name&amp;gt;)&lt;br /&gt;
-ca_default&lt;br /&gt;
-ca_rule &amp;lt;rule_name_with_optional_setting&amp;gt;&lt;br /&gt;
-ca_setting &amp;lt;preference_file_name&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
*compiler: Relaxed void safety rules for local variables and &amp;lt;e&amp;gt;Result&amp;lt;/e&amp;gt; by allowing assigning of detachable values to them even when their type is attached. The change allows dropping explicit detachable marks in local declarations and simplifying code that uses Result, e.g.,&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 local&lt;br /&gt;
                         r: detachable X&lt;br /&gt;
                 do&lt;br /&gt;
                         r := something&lt;br /&gt;
                         if not attached r then&lt;br /&gt;
                                 r := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                         Result := r&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 do&lt;br /&gt;
                         if attached something as r then&lt;br /&gt;
                                 Result := r&lt;br /&gt;
                         else&lt;br /&gt;
                                 Result := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
can now be rewritten as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
         foo: X&lt;br /&gt;
                 do&lt;br /&gt;
                         Result := something&lt;br /&gt;
                         if not attached Result then&lt;br /&gt;
                                 Result := something_else_attached&lt;br /&gt;
                         end&lt;br /&gt;
                 end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
The change does not allow previously void-unsafe code to be treated as void-safe, but may affect errors reported by the compiler, in particular:&lt;br /&gt;
# VEVI errors may be now reported as VUTA(2) when a local of an attached type is used as a target of call before it is attached.&lt;br /&gt;
# VEVI errors may be now reported as VJAR or VUAR when a local of an attached type is used as a source expression before it is attached.&lt;br /&gt;
# VJAR errors may now be reported as VUTA(2) when a local of an attached type is assigned a detachable value and is later used as a target of a call.&lt;br /&gt;
# VJAR errors may now be reported as VEVI when &amp;lt;e&amp;gt;Result&amp;lt;/e&amp;gt; of an attached type is assigned a detachable value.&lt;br /&gt;
*compiler: Improved code generation for iterative form of loops in finalized mode by taking into account cursor types provided by iterable classes.&lt;br /&gt;
*compiler: Avoided object creation when accessing an attribute (usually &amp;lt;e&amp;gt;item&amp;lt;/e&amp;gt;) on an expression of a basic type.&lt;br /&gt;
*compiler: Slightly improved performance of feature call on void target checks in finalized mode.&lt;br /&gt;
*compiler: Supported nested inlining of &amp;lt;e&amp;gt;{SPECIAL}.item&amp;lt;/e&amp;gt; in finalized mode.&lt;br /&gt;
*library: Improved performance of iteration forms of loops for targets of the following classes: &amp;lt;e&amp;gt;ARRAY&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;ARRAYED_LIST&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;SPECIAL&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;READABLE_STRING_32&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;READABLE_STRING_8&amp;lt;/e&amp;gt;.&lt;br /&gt;
*EiffelStudio: Improved reporting for errors in regular expressions used in include and exclude file rules in ECF by adding position information and providing error description all the time.&lt;br /&gt;
&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*EiffelStudio: bug#19173 - Fixed a bug that caused an exception when requesting to generate documentation or XMI for a target with a library disabled by a condition.&lt;br /&gt;
*compiler: test#codeanalysis019 - Fixed a bug that caused duplicate reports for CA020 rule (unused assigned variable) inside one class or spurious reports for this rule on several classes.&lt;br /&gt;
*compiler: bug#18028 (test#final114), test#final123 - Fixed a bug that caused incorrect code generation when inlining &amp;lt;e&amp;gt;across&amp;lt;/e&amp;gt; loops or &amp;lt;e&amp;gt;separate&amp;lt;/e&amp;gt; instructions.&lt;br /&gt;
*compiler: test#scoop077 - Fixed a bug in applying SCOOP semantics rules and checking SCOOP validity rules for iteration forms of loops with a target of a separate type.&lt;br /&gt;
*EiffelStudio: bug#19212 - Fixed a bug that caused an exception when using metrics tool and affected [[EiffelStudio 15.12 Releases]].&lt;br /&gt;
*library: bug#19213 - Fixed a bug in an external signature of one of WEL features that might cause a crash when compiled with Gobo compiler.&lt;br /&gt;
*compiler: test#attach118 - Fixed a bug that might cause incorrect error reports for inherited code when target of reattachment involving conversion is of a detachable type.&lt;br /&gt;
*EiffelStudio: Added checks for validity of regular expressions used in include and exclude file rules specified in the project settings dialog with rejection of invalid regular expression using the corresponding error dialog to avoid a possibility to store ECF that cannot be retrieved.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*EiffelStudio: Changed order of processing of arguments taken from the command line and from the environment variable &amp;lt;code&amp;gt;ISE_EC_FLAGS&amp;lt;/code&amp;gt;. Now arguments are first read from the environment variable and then from the command line.&lt;br /&gt;
*compiler: Marked old code analysis command-line options as obsolete.&lt;br /&gt;
*library: Changed interface and implementation of cursor classes used to implement &amp;lt;e&amp;gt;across&amp;lt;/e&amp;gt; loops to get better performance.&lt;br /&gt;
*library: Added protection of window objects (of type &amp;lt;e&amp;gt;EV_WINDOW&amp;lt;/e&amp;gt; and descendants) from garbage collection when there are no references to them or to objects holding such references and the associated windows become visible by using a feature &amp;lt;e&amp;gt;show&amp;lt;/e&amp;gt; or its modifications (&amp;lt;e&amp;gt;show_modal_to_window&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;show_relative_to_window&amp;lt;/e&amp;gt;) until the windows become hidden using &amp;lt;e&amp;gt;hide&amp;lt;/e&amp;gt; or &amp;lt;e&amp;gt;destroy&amp;lt;/e&amp;gt;. The protection should not affect any existing applications, but allows for easier window management in user's code especially in SCOOP mode.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Releases&amp;diff=15437</id>
		<title>EiffelStudio Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_Releases&amp;diff=15437"/>
				<updated>2016-07-09T07:16:10Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Redirected page to EiffelStudio 16.05 Releases&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[EiffelStudio 16.05 Releases]]&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=MediaWiki:Sidebar&amp;diff=15436</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=MediaWiki:Sidebar&amp;diff=15436"/>
				<updated>2016-07-09T07:15:30Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Navigation&lt;br /&gt;
** home-url|home&lt;br /&gt;
** Mission|Mission&lt;br /&gt;
** Spread_the_word|Spread the word&lt;br /&gt;
** categories-url|categories&lt;br /&gt;
** downloads-url|downloads&lt;br /&gt;
** Frequently_Asked_Questions|FAQ&lt;br /&gt;
** mailing-lists-url|mailing-lists&lt;br /&gt;
* Development&lt;br /&gt;
** Source_Code|Source Code&lt;br /&gt;
** Compiling_EiffelStudio|Compiling EiffelStudio&lt;br /&gt;
** Category:Projects|Contributing&lt;br /&gt;
** EiffelStudio_16.11_Releases|Change Log 16.x&lt;br /&gt;
** Environment_Roadmap|Road map&lt;br /&gt;
** URLs|Useful URLs&lt;br /&gt;
*Wiki&lt;br /&gt;
** allpages-url|allpages&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** users-url|users&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=15435</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=15435"/>
				<updated>2016-07-09T07:14:30Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]__NOTOC__&lt;br /&gt;
&amp;lt;h1 class=&amp;quot;firstHeading&amp;quot;&amp;gt;EiffelStudio Integrated Development Environment&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:EiffelStudioScreenshot.png|thumb|250px|right|EiffelStudio IDE ([http://eiffel.com/products/studio/screenshots.html more screenshots]) ]]&lt;br /&gt;
&lt;br /&gt;
Welcome to the central resource for EiffelStudio developers and contributors.&lt;br /&gt;
==News==&lt;br /&gt;
*''31st May 2016'': EiffelStudio [[EiffelStudio 16.05 Releases|16.05]] is available for download at https://www.eiffel.org/downloads&lt;br /&gt;
*''21st Dec 2015'': EiffelStudio [[EiffelStudio 15.12 Releases|15.12]] is available for download at https://www.eiffel.org/downloads&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is an open-source IDE for the [http://en.wikipedia.org/wiki/Eiffel_programming_language Eiffel programming language]. [http://www.eiffel.com Eiffel Software] is the principal contributor and hosts the subversion repository. EiffelStudio is maintained and developed by Eiffel Software as well many contributors, including ETH Zurich.&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is a full-featured IDE offering the following features, many of them unique:&lt;br /&gt;
&lt;br /&gt;
* Complete compiler for the Eiffel programming language, with Design By Contract (DBC) support and both high compile-time speed and high-performance executables, based on the Melting Ice Technology.&lt;br /&gt;
* Full portability (including graphics) across Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Smart code editor&lt;br /&gt;
* Sophisticated multi-view browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modeling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool (EiffelBuild) and fully portable GUI library (EiffelVision)&lt;br /&gt;
* Many other libraries of reusable component.&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, Eiffel programs have a run-time performance comparable to those directly written in C or C++, but with the benefits of an advanced object-oriented model and strong typing. EiffelStudio uses a highly efficient compacting garbage collector to free the developer from the burden of memory management.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;If you want to know more about the unique features of Eiffel and EiffelStudio, check out our [[Reasons for using Eiffel]] page.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;font-size:80%;&amp;quot; bgcolor=white|&lt;br /&gt;
{| cellspacing=8 width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [[Downloads]]&lt;br /&gt;
* [[EiffelStudio Releases|Changelog of current release (release branch)]]&lt;br /&gt;
* [http://docs.eiffel.com/book/eiffelstudio/software-installation-eiffelstudio Installing EiffelStudio]&lt;br /&gt;
* [[Compiling Hello World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Working with EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[Eiffel Glossary]]&lt;br /&gt;
* [[Eiffel Compilation Explained]]&lt;br /&gt;
* [[EiffelStudio Wish List]]&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
== Contributing! ==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Projects|How to contribute: the Projects page]]&lt;br /&gt;
* [[:Category:Testing|EiffelStudio testing process: you can participate!]]&lt;br /&gt;
* [[EiffelStudio 16.11 Releases|Changelog of latest development version, currently 16.11 (development trunk)]]&lt;br /&gt;
* [[Repository|Getting the source: Subversion repository]]&lt;br /&gt;
* [[Compiling EiffelStudio]]&lt;br /&gt;
* [[:Category:Tools|Developer's tools]]&lt;br /&gt;
* [[Language_Roadmap|Language roadmap]]&lt;br /&gt;
* [[Environment_Roadmap|Environment roadmap]]&lt;br /&gt;
* [[Design_and_coding_rules|Design and coding rules]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.eiffel.org Eiffel.org]&lt;br /&gt;
* [[Spread_the_word|Spread the word]]&lt;br /&gt;
* [[Eiffel Sites and Links]]&lt;br /&gt;
* [[Mailing Lists]]&lt;br /&gt;
* [[:Category:News|News]]&lt;br /&gt;
* Join us on gitter https://gitter.im/EiffelSoftware/EiffelStudio or through https://groups.eiffel.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Environment_Variables&amp;diff=15434</id>
		<title>Environment Variables</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Environment_Variables&amp;diff=15434"/>
				<updated>2016-07-09T01:20:31Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:EiffelStudio|EiffelStudio]]/Eiffel compiler utilizes a number of environment and other localized variables. This page is dedicated to those variables, how they are defined and what they mean.&lt;br /&gt;
&lt;br /&gt;
{{Note|There is a special notion called &amp;quot;[[LinuxUnixLayout|Unix Layout]]&amp;quot; in regards to special builds of [[:Category:EiffelStudio|EiffelStudio]]. When using a [[LinuxUnixLayout|Unix layout]] '''no environment variables''' are used because of the fragmented distribution of installed files. For such layouts this page provides no contribution to understanding [[:Category:EiffelStudio|EiffelStudio]].&lt;br /&gt;
&lt;br /&gt;
Unix layouts are used by package managers. See [[Linux Packages|here]] for supported package managers.}}&lt;br /&gt;
&lt;br /&gt;
Unless otherwise stated, all the following environment variables are known by the Eiffel environment at run time.&lt;br /&gt;
&lt;br /&gt;
== Core Variables ==&lt;br /&gt;
The core variables are the Eiffel compiler variables that absolutely must be defined for the [[:Category:EiffelStudio|EiffelStudio]]/Eiffel compiler to function. Without them the Eiffel environment has no idea where it is or what platform binaries to load.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_EIFFEL''': The holy grail of everything Eiffel, the only difference being is that this variable can be found! The value should point to the root of the [[:Category:EiffelStudio|EiffelStudio]]/Eiffel compiler installation.&lt;br /&gt;
* '''ISE_PLATFORM''': Represents the named platform on which the Eiffel environment is running. Below is a list of compatible platform names:&lt;br /&gt;
** freebsd-x86-64&lt;br /&gt;
** freebsd-x86&lt;br /&gt;
** irix-mips-64&lt;br /&gt;
** irix-mips&lt;br /&gt;
** linux-ppc&lt;br /&gt;
** linux-sparc&lt;br /&gt;
** linux-x86-64&lt;br /&gt;
** linux-x86&lt;br /&gt;
** macosx-x86&lt;br /&gt;
** macosx-x86-64&lt;br /&gt;
** openbsd-x86&lt;br /&gt;
** solaris-sparc-64&lt;br /&gt;
** solaris-sparc&lt;br /&gt;
** solaris-x86-64&lt;br /&gt;
** solaris-x86&lt;br /&gt;
** win64&lt;br /&gt;
** windows&lt;br /&gt;
&lt;br /&gt;
=== Windows Variables ===&lt;br /&gt;
Under Microsoft's Windows an extra variable is required, dictating the external C compiler used by the Eiffel environment. Like the core variables, this variable must be defined in order for an Eiffel environment to run.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_C_COMPILER''': The noted and installed C compiler used by the Eiffel compiler to perform C/C++ compilation and to locate the compatible external libraries. Below is a list of compatible C compiler names:&lt;br /&gt;
** ''msc'': Any supported [[Installing Microsoft C compiler|Microsoft Visual C/C++]] compiler prior to Visual Studio C++ 2015.&lt;br /&gt;
** ''msc_vc140'': Visual Studio C++ 2015 or later.&lt;br /&gt;
** ''mingw'': The open source [http://www.mingw.org MinGW] C/C++ compiler, which at the time of writing is only available as a stable release for x86.&lt;br /&gt;
** ''bcb'': The Free Borland 5.5 C++ compiler which is now deprecated and should not be used.&lt;br /&gt;
&lt;br /&gt;
== Optional Variables ==&lt;br /&gt;
&lt;br /&gt;
In addition to the core variables, there are a number of optional variables that can be defined to replace predefined values set by the Eiffel environments.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_LIBRARY''': Points to an alternative location for library source files. By default this is automatically set by EiffelStudio to the same location as [[#Core Variables|ISE_EIFFEL]]. This is usually set explicitly when you are checking out the source code directly.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_PRECOMP''': The location of the Eiffel environment precompiled libraries. By default, this is automatically set by EiffelStudio to a user specific location which vary depending on the platform.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_CFLAGS''': C compilation flags that are passed to the C compiler. We recommend not using it but instead set the C compilation flags as part of your Eiffel Configuration File.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_SHAREDLIBS''': Some additional C/C++ libraries that are passed to the C/C++ linker. It can also be used to pass linker flags. Like '''ISE_CFLAGS''', we recommend not using it but instead set the C compilation flags as part of your Eiffel Configuration File.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_APP_DATA''': Location of the Eiffel environment configuration data, such as project settings data and session configuration data. This configuration data is hidden, managed by [[:Category:EiffelStudio|EiffelStudio]] and should not be manipulated manually.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_USER_FILES''': Points to the location of Eiffel environment user files like the default projects location, user [[Code Templates|code templates]] and Eiffel environment [[Replaceable_User_Files|Replaceable User Files]].&lt;br /&gt;
&lt;br /&gt;
=== Auxiliary Variables ===&lt;br /&gt;
The following environment variables are defined when working with Eiffel environment sources. There is no internal knowledge of the following environment variables; they are used for configuration and compilation only.&lt;br /&gt;
&lt;br /&gt;
* '''EIFFEL_SRC''': When working with the live Eiffel sources, EIFFEL_SRC points to the checked out /trunk/Src location.&lt;br /&gt;
&lt;br /&gt;
* '''ISE_SRC''': This environment variable is used to point to the ISE internal repository containing non-GPL code. The variable points to /trunk/Src of the internal repository.&lt;br /&gt;
&lt;br /&gt;
== Windows Localization ==&lt;br /&gt;
If you are running [[:Category:EiffelStudio|EiffelStudio]]/Eiffel compiler on a Microsoft Windows-based platform, environment variables may be localized to a specific version of the Eiffel compiler used to build the Eiffel application. This is extremely useful when using the Eiffel compiler with multiple source repositories, or when working on multiple branches or research versions. It is also used to allow the x86 and x64 versions of EiffelStudio to be installed side-by-side and even under the same location without bit-compatibility issues with the Eiffel compiler binaries or external C libraries.&lt;br /&gt;
&lt;br /&gt;
{{Note|Environment variables defined for the user or system will override any localized variables.}}&lt;br /&gt;
&lt;br /&gt;
[[:Category:EiffelStudio|EiffelStudio]] and the Eiffel compiler make use of localized variables to define information specific to each version of [[:Category:EiffelStudio|EiffelStudio]] installed. Those of you who have created environment variables used by the Eiffel environment, such as [[#Code Variables|ISE_EIFFEL]] or [[#Code Variables|ISE_PLATFORM]], will have seen an installer warning indicating the danger in defining those variables at that level.&lt;br /&gt;
&lt;br /&gt;
So, on to localization and how it works.&lt;br /&gt;
&lt;br /&gt;
=== The Windows Registry ===&lt;br /&gt;
People hate it, people love it, the Windows registry. It's nice to have uniform access to a collection of hives containing varying degrees of access. It's also where localized Eiffel variables can be manipulated, added or removed.&lt;br /&gt;
&lt;br /&gt;
There are four places where local variables can be defined, each with their own degree of prioritization.&lt;br /&gt;
&lt;br /&gt;
User variables, available only to the currently logged on user, are found under the key:&lt;br /&gt;
&lt;br /&gt;
 HKCU\Software\ISE\Eiffel_''YY.MM''\''app_name''&lt;br /&gt;
&lt;br /&gt;
This is the very first place any Eiffel system will look for a local variable. For instance, [[:Category:EiffelStudio|EiffelStudio]] and the Eiffel compiler are bundled in the executable ''ec.exe''. For release YY.MM built with a YY.MM Eiffel compiler, ec.exe will first look for variables under:&lt;br /&gt;
&lt;br /&gt;
 HKCU\Software\ISE\Eiffel_YY.MM\ec&lt;br /&gt;
&lt;br /&gt;
Failing to find any variable under this key, the system will default to looking at the compiled version key (the version of the Eiffel compiler the system was compiled with.) Using the same example, the following key will be examined:&lt;br /&gt;
&lt;br /&gt;
 HKCU\Software\ISE\Eiffel_YY.MM&lt;br /&gt;
&lt;br /&gt;
Again failing to locate a matching variable name, the system will proceed to check the local machine hive, using the same rules as used by the current user hive.&lt;br /&gt;
&lt;br /&gt;
 HKLM\Software\ISE\Eiffel_''YY.MM''\''app_name''&lt;br /&gt;
&lt;br /&gt;
Using the same example. the application specific key at will be searched next:&lt;br /&gt;
&lt;br /&gt;
 HKLM\Software\ISE\Eiffel_YY.MM\ec&lt;br /&gt;
&lt;br /&gt;
And failing to find any matching variable the compiled version key will be the last place looked under:&lt;br /&gt;
&lt;br /&gt;
 HKLM\Software\ISE\Eiffel_YY.MM&lt;br /&gt;
&lt;br /&gt;
To sum up, here is the list of searched locations. ordered by priority for retrieving, a variable; environment, local or otherwise:&lt;br /&gt;
&lt;br /&gt;
# User environment variable table&lt;br /&gt;
# Machine environment variable table&lt;br /&gt;
# Current user registry hive under the Eiffel application specific key&lt;br /&gt;
# Current user registry hive under the Eiffel compiled version key&lt;br /&gt;
# Local machine registry hive under the Eiffel application specific key&lt;br /&gt;
# Local machine registry hive under the Eiffel compiled version key&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelOnMac&amp;diff=15411</id>
		<title>EiffelOnMac</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelOnMac&amp;diff=15411"/>
				<updated>2016-05-14T05:03:44Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Using Homebrew */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:EiffelStudio]]&lt;br /&gt;
[[Category:Macintosh]]&lt;br /&gt;
&lt;br /&gt;
This page gives you an overview about how to get EiffelStudio running on your Mac (Mavericks or above).&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
*'''X11 (XQuartz)''': install version 2.7.5 minimum from http://xquartz.macosforge.org.&lt;br /&gt;
*You will need to install '''Xcode''' from the App Store. After installing Xcode, make sure to install the command line tools by typing:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xcode-select --install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will popup a dialog asking if you want to install the command line developer tools. &lt;br /&gt;
&lt;br /&gt;
{{Note|If you have an OS older than 10.10 (e.g. 10.9.5) you might have a problem installing Xcode from the App Store. You can then go to https://developer.apple.com/downloads/ (Apple ID needed). Remember to install the command line tools.}}&lt;br /&gt;
&lt;br /&gt;
{{Note| Advanced users may not need to install Xcode as long as you install the '''development tools'''. Even though you save in download time, you might waste  a lot of time trying to fix missing dependencies. In other words, unless you are feeling adventurous, do install Xcode.}}&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Using MacPorts ===&lt;br /&gt;
MacPorts is a tool that allows you to use many Unix applications on the Mac. We have created a package in the MacPorts repository that allows you to to install Eiffel Studio with all dependencies in a convenient way. First, install [http://guide.macports.org/#installing MacPorts].&lt;br /&gt;
&lt;br /&gt;
Now simply type (from a bash [http://guides.macrumors.com/Terminal terminal]):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo port install eiffelstudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will actually compile and install the whole EiffelStudio delivery. This takes about 15 minutes on a 2013 Mac.&lt;br /&gt;
&lt;br /&gt;
When a new release of EiffelStudio becomes available, it may take some weeks before it's available from MacPorts. You can check by running this command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port info eiffelstudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the new release is available, you can upgrade like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo port selfupdate&lt;br /&gt;
sudo port upgrade outdated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using Homebrew ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|As of 2015, the graphical version of EiffelStudio won't work in Homebrew due to a bug in the GTK package included in Homebrew. However all the command line tools will work.}}&lt;br /&gt;
&lt;br /&gt;
A light-weight alternative to installing MacPorts is [https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#installation Homebrew].&lt;br /&gt;
Once Homebrew is installed type the following commands to install EiffelStudio (from a bash [http://guides.macrumors.com/Terminal terminal]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew install eiffelstudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using binary packages ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|This method still requires an initial installation via MacPorts or Homebrew.}}&lt;br /&gt;
&lt;br /&gt;
Download the latest .tar.bz2 package from the Eiffel Software site that matches MacPorts or Homebrew. Then follow the same [https://docs.eiffel.com/book/eiffelstudio/eiffelstudio-linux instructions as the Linux version] to setup the environment variables needed to run EiffelStudio. Keep the ISE_PLATFORM value to macosx-x86-64.&lt;br /&gt;
&lt;br /&gt;
== Starting EiffelStudio installed via MacPorts ==&lt;br /&gt;
&lt;br /&gt;
Simply navigate to /Applications/MacPorts/Eiffel''XX'' and double click the EiffelStudio icon.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can also start EiffelStudio from the command line by entering the command 'estudio' or use the command-line eiffel compiler 'ec'.&lt;br /&gt;
&lt;br /&gt;
==Hints==&lt;br /&gt;
* Pick and Drop works with Apple-key + mouse click.&lt;br /&gt;
* To set up the correct (default) browsers use &amp;quot;open&amp;quot; as your command-line browser in Tools&amp;gt;Preferences...&lt;br /&gt;
* The F10 and F11 debugging shortcuts conflict with the standard Exposé keys. Here are some workarounds:&lt;br /&gt;
** Use the toolbar instead.&lt;br /&gt;
** Reassign these shortcuts in EiffelStudio (Tools&amp;gt;Preferences).&lt;br /&gt;
** Reassign the Exposé keys in System Preferences.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== How can I make EiffelStudio on the Mac look nicer? ===&lt;br /&gt;
* From macports, install the gtk2 (if not already installed) and gtk-chtheme packets. Then run gtk-chtheme and you get a nice GUI to choose your theme. Additional GTK themes can be put in  /opt/local/share/themes/ (There a thousands of them on the web, for example here : [http://art.gnome.org/themes/gtk2 http://art.gnome.org/themes/gtk2])&lt;br /&gt;
&lt;br /&gt;
=== Typing ec or estudio on the command line doesn't work ===&lt;br /&gt;
To run the '''ec''' compiler from your shell, set up variables similar to these (e.g. in ~/.profile):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Setting variables for EiffelStudio.&lt;br /&gt;
export ISE_EIFFEL=/Applications/MacPorts/Eiffel66&lt;br /&gt;
export ISE_PLATFORM=macosx-ppc (or macosx-x86)&lt;br /&gt;
export ISE_PROJECTS=$HOME&lt;br /&gt;
export ES_PATH=$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin&lt;br /&gt;
export PATH=$ES_PATH:$PATH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===The latest release of EiffelStudio isn't available yet via MacPorts===&lt;br /&gt;
&lt;br /&gt;
If you want to upgrade to the latest release of EiffelStudio, but it isn't available yet via MacPorts, the easiest and quickest thing is to install from binary packages as noted above. Nonetheless, if you really want to install it via MacPorts, here's how.&lt;br /&gt;
&lt;br /&gt;
MacPorts installs a particular version of EiffelStudio by following the rules defined in a '''Portfile'''. For example, http://trac.macports.org/browser/trunk/dports/lang/eiffelstudio71/Portfile is the Portfile for EiffelStudio 7.1. The person who maintains EiffelStudio for MacPorts has to write this file and upload it, but they might not have done so yet. You could make enquiries about when it will be available, but if you want to get the latest urgently it isn't hard to write your own Portfile and run it locally. Here's how.&lt;br /&gt;
&lt;br /&gt;
http://guide.macports.org/#development.local-repositories explains how to do it.&lt;br /&gt;
# Go to https://sourceforge.net/projects/eiffelstudio/files and download the relevant PorterPackage file.&lt;br /&gt;
# Run '''openssl''' to find out the '''checksum''' of the PorterPackage file. E.g., for EiffelStudio 7.2 the command is '''openssl rmd160 ~/Downloads/PorterPackage_72_91284_gpl.tar'''.&lt;br /&gt;
# Open /opt/local/etc/macports/sources.conf in a text editor (with super user privileges). Insert a line as explained on http://guide.macports.org, e.g., file:///Applications/MacPorts/ports&lt;br /&gt;
# Create the Portfile in a text editor, e.g., file:///Applications/MacPorts/ports/lang/eiffelstudio72/Portfile&lt;br /&gt;
#* Copy the contents of the most recently available EiffelStudio Portfile (e.g., from http://trac.macports.org/browser/trunk/dports/lang/eiffelstudio71/Portfile) into your Portfile.&lt;br /&gt;
#* Correct the '''name''', '''minor_version''' and '''version'''.&lt;br /&gt;
#* Make sure that the '''distname''' will resolve to the current PorterPackage file name that you see on https://sourceforge.net/projects/eiffelstudio/files&lt;br /&gt;
#* Set the first '''checksums''' to the value that you got earlier from running openssl.&lt;br /&gt;
#* You've finished writing your Portfile. Save it!&lt;br /&gt;
# Go to the ports directory, e.g., cd /Applications/MacPorts/ports&lt;br /&gt;
# sudo portindex&lt;br /&gt;
# You should now be able to install in the usual way, e.g., sudo port install eiffelstudio72&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelOnMac&amp;diff=15410</id>
		<title>EiffelOnMac</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelOnMac&amp;diff=15410"/>
				<updated>2016-05-14T05:02:38Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Using Homebrew */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:EiffelStudio]]&lt;br /&gt;
[[Category:Macintosh]]&lt;br /&gt;
&lt;br /&gt;
This page gives you an overview about how to get EiffelStudio running on your Mac (Mavericks or above).&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
*'''X11 (XQuartz)''': install version 2.7.5 minimum from http://xquartz.macosforge.org.&lt;br /&gt;
*You will need to install '''Xcode''' from the App Store. After installing Xcode, make sure to install the command line tools by typing:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xcode-select --install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will popup a dialog asking if you want to install the command line developer tools. &lt;br /&gt;
&lt;br /&gt;
{{Note|If you have an OS older than 10.10 (e.g. 10.9.5) you might have a problem installing Xcode from the App Store. You can then go to https://developer.apple.com/downloads/ (Apple ID needed). Remember to install the command line tools.}}&lt;br /&gt;
&lt;br /&gt;
{{Note| Advanced users may not need to install Xcode as long as you install the '''development tools'''. Even though you save in download time, you might waste  a lot of time trying to fix missing dependencies. In other words, unless you are feeling adventurous, do install Xcode.}}&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Using MacPorts ===&lt;br /&gt;
MacPorts is a tool that allows you to use many Unix applications on the Mac. We have created a package in the MacPorts repository that allows you to to install Eiffel Studio with all dependencies in a convenient way. First, install [http://guide.macports.org/#installing MacPorts].&lt;br /&gt;
&lt;br /&gt;
Now simply type (from a bash [http://guides.macrumors.com/Terminal terminal]):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo port install eiffelstudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This will actually compile and install the whole EiffelStudio delivery. This takes about 15 minutes on a 2013 Mac.&lt;br /&gt;
&lt;br /&gt;
When a new release of EiffelStudio becomes available, it may take some weeks before it's available from MacPorts. You can check by running this command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port info eiffelstudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the new release is available, you can upgrade like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo port selfupdate&lt;br /&gt;
sudo port upgrade outdated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using Homebrew ===&lt;br /&gt;
A light-weight alternative to installing MacPorts is [https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#installation Homebrew].&lt;br /&gt;
Once Homebrew is installed type the following commands to install EiffelStudio (from a bash [http://guides.macrumors.com/Terminal terminal]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew update&lt;br /&gt;
brew install eiffelstudio&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using binary packages ===&lt;br /&gt;
&lt;br /&gt;
{{Warning|This method still requires an initial installation via MacPorts or Homebrew.}}&lt;br /&gt;
&lt;br /&gt;
Download the latest .tar.bz2 package from the Eiffel Software site that matches MacPorts or Homebrew. Then follow the same [https://docs.eiffel.com/book/eiffelstudio/eiffelstudio-linux instructions as the Linux version] to setup the environment variables needed to run EiffelStudio. Keep the ISE_PLATFORM value to macosx-x86-64.&lt;br /&gt;
&lt;br /&gt;
== Starting EiffelStudio installed via MacPorts ==&lt;br /&gt;
&lt;br /&gt;
Simply navigate to /Applications/MacPorts/Eiffel''XX'' and double click the EiffelStudio icon.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can also start EiffelStudio from the command line by entering the command 'estudio' or use the command-line eiffel compiler 'ec'.&lt;br /&gt;
&lt;br /&gt;
==Hints==&lt;br /&gt;
* Pick and Drop works with Apple-key + mouse click.&lt;br /&gt;
* To set up the correct (default) browsers use &amp;quot;open&amp;quot; as your command-line browser in Tools&amp;gt;Preferences...&lt;br /&gt;
* The F10 and F11 debugging shortcuts conflict with the standard Exposé keys. Here are some workarounds:&lt;br /&gt;
** Use the toolbar instead.&lt;br /&gt;
** Reassign these shortcuts in EiffelStudio (Tools&amp;gt;Preferences).&lt;br /&gt;
** Reassign the Exposé keys in System Preferences.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
=== How can I make EiffelStudio on the Mac look nicer? ===&lt;br /&gt;
* From macports, install the gtk2 (if not already installed) and gtk-chtheme packets. Then run gtk-chtheme and you get a nice GUI to choose your theme. Additional GTK themes can be put in  /opt/local/share/themes/ (There a thousands of them on the web, for example here : [http://art.gnome.org/themes/gtk2 http://art.gnome.org/themes/gtk2])&lt;br /&gt;
&lt;br /&gt;
=== Typing ec or estudio on the command line doesn't work ===&lt;br /&gt;
To run the '''ec''' compiler from your shell, set up variables similar to these (e.g. in ~/.profile):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Setting variables for EiffelStudio.&lt;br /&gt;
export ISE_EIFFEL=/Applications/MacPorts/Eiffel66&lt;br /&gt;
export ISE_PLATFORM=macosx-ppc (or macosx-x86)&lt;br /&gt;
export ISE_PROJECTS=$HOME&lt;br /&gt;
export ES_PATH=$ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin&lt;br /&gt;
export PATH=$ES_PATH:$PATH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===The latest release of EiffelStudio isn't available yet via MacPorts===&lt;br /&gt;
&lt;br /&gt;
If you want to upgrade to the latest release of EiffelStudio, but it isn't available yet via MacPorts, the easiest and quickest thing is to install from binary packages as noted above. Nonetheless, if you really want to install it via MacPorts, here's how.&lt;br /&gt;
&lt;br /&gt;
MacPorts installs a particular version of EiffelStudio by following the rules defined in a '''Portfile'''. For example, http://trac.macports.org/browser/trunk/dports/lang/eiffelstudio71/Portfile is the Portfile for EiffelStudio 7.1. The person who maintains EiffelStudio for MacPorts has to write this file and upload it, but they might not have done so yet. You could make enquiries about when it will be available, but if you want to get the latest urgently it isn't hard to write your own Portfile and run it locally. Here's how.&lt;br /&gt;
&lt;br /&gt;
http://guide.macports.org/#development.local-repositories explains how to do it.&lt;br /&gt;
# Go to https://sourceforge.net/projects/eiffelstudio/files and download the relevant PorterPackage file.&lt;br /&gt;
# Run '''openssl''' to find out the '''checksum''' of the PorterPackage file. E.g., for EiffelStudio 7.2 the command is '''openssl rmd160 ~/Downloads/PorterPackage_72_91284_gpl.tar'''.&lt;br /&gt;
# Open /opt/local/etc/macports/sources.conf in a text editor (with super user privileges). Insert a line as explained on http://guide.macports.org, e.g., file:///Applications/MacPorts/ports&lt;br /&gt;
# Create the Portfile in a text editor, e.g., file:///Applications/MacPorts/ports/lang/eiffelstudio72/Portfile&lt;br /&gt;
#* Copy the contents of the most recently available EiffelStudio Portfile (e.g., from http://trac.macports.org/browser/trunk/dports/lang/eiffelstudio71/Portfile) into your Portfile.&lt;br /&gt;
#* Correct the '''name''', '''minor_version''' and '''version'''.&lt;br /&gt;
#* Make sure that the '''distname''' will resolve to the current PorterPackage file name that you see on https://sourceforge.net/projects/eiffelstudio/files&lt;br /&gt;
#* Set the first '''checksums''' to the value that you got earlier from running openssl.&lt;br /&gt;
#* You've finished writing your Portfile. Save it!&lt;br /&gt;
# Go to the ports directory, e.g., cd /Applications/MacPorts/ports&lt;br /&gt;
# sudo portindex&lt;br /&gt;
# You should now be able to install in the usual way, e.g., sudo port install eiffelstudio72&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15390</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15390"/>
				<updated>2016-01-29T12:31:09Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Strings: remove implicit conversion STRING_32.as_string_8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Strings: remove implicit conversion from XXX_STRING_32 to XXX_STRING_8==&lt;br /&gt;
===Before===&lt;br /&gt;
XXX_STRING_32 implicitly converts to XXX_STRING_8.&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
No more XXX_STRING_32 to SSS_STRING_8 implicit conversion.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This implicit conversion was great when the STRING_32 type was introduced in Eiffel and heavily used in EiffelVision2. It enabled existing code that was purely ASCII at the time to compile unchanged. The goal was always to remove that conversion as early as possible as it is a truncation which was ok as long as your were ASCII based.&lt;br /&gt;
&lt;br /&gt;
Now this is a recipe for trouble to allow such an implicit conversion.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change if they use Unicode enabled libraries such as EiffelVision2 and still use STRING_8 in their code.&lt;br /&gt;
&lt;br /&gt;
==Void-safe and invariant-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to the fields of the original object which is either the object on which we call '''twin''' or the source being copied from.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This makes the code fully void-safe as we will never try to access fields that are declared attached but actually Void.&lt;br /&gt;
&lt;br /&gt;
This removes the need to disable invariant checking in the implementation of '''twin'''.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
Because '''copy''' can be called directly or indirectly, we used to perform the following test on a field that was supposedly attached at runtime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if field = Void then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This kind of code won't work anymore. Instead one has to do&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if Current = other then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but this is not ideal since we cannot distinguish between &amp;lt;e&amp;gt;a.twin&amp;lt;/e&amp;gt; from &amp;lt;e&amp;gt;a.copy (a)&amp;lt;/e&amp;gt;. Since calling the later is very rare, the above solution is a good one overall.&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
===Before===&lt;br /&gt;
You could duplicate objects as you wish.&lt;br /&gt;
===After===&lt;br /&gt;
You can only duplicate objects if they are marked as `copiable' or `duplicable'. So far there is no definite answer to allow this. What is being proposed is either one of the following:&lt;br /&gt;
# Define '''twin''', '''copy''', ... in ANY like today, but exported to NONE.&lt;br /&gt;
# Remove '''twin''', '''copy''', ... from ANY and add them to a new abstract class COPIABLE&lt;br /&gt;
The second solution is simple as at runtime we simply have to check for conformance to COPIABLE.&lt;br /&gt;
===Rationale===&lt;br /&gt;
If you duplicate an object graph that has some external memory reference, causing a duplication of the object holding that reference could cause a double-free of that external memory reference when Eiffel objects are disposed by the GC.&lt;br /&gt;
&lt;br /&gt;
In addition, some objects are complicated to duplicate such as: Files, Windows, Widgets, databases connections,...&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
For client code, it should still compile as before. For user defined code that is known to allow copy/duplication, the code will have to be rewritten to allow copy/duplication.&lt;br /&gt;
&lt;br /&gt;
==Change the type describing the dynamic type of objects==&lt;br /&gt;
===Before===&lt;br /&gt;
In non-void-safe mode and in void-safe mode, the dynamic type of an object was '''detachable X'''.&lt;br /&gt;
===After===&lt;br /&gt;
The dynamic type of an object would always be '''attached X'''.&lt;br /&gt;
===Rationale===&lt;br /&gt;
It is common sense that an object presence indicates implicitly that it is attached and it will simplify code that test for the type of an object. Currently one had to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [detachable X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
when really it makes more sense to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
===Issues===&lt;br /&gt;
It was initially '''detachable X''' for reasons that are too complex and vague as of this writing (mostly related to backward compatibility, storable, reflection). Changing the type to '''attached''' has some consequences:&lt;br /&gt;
* IDs won't be contiguous as they used to be&lt;br /&gt;
* Storables won't be retrievable by old systems&lt;br /&gt;
&lt;br /&gt;
==I/O and external operations==&lt;br /&gt;
===Before===&lt;br /&gt;
Any I/O operations could raise an exception upon failure.&lt;br /&gt;
===After===&lt;br /&gt;
No I/O operations will raise an exception upon failure.&lt;br /&gt;
===Rationale===&lt;br /&gt;
Writing exception free code for manipulating external resources is difficult at the moment, forcing you to use rescue clauses too many times in code that may have a very complex flow. Performing a check after the operation to  see if it was successful is exception free but allows for a better and more accurate error reporting.&lt;br /&gt;
===Issues===&lt;br /&gt;
Changing the code would break too much code. The idea is to keep the existing as is, but add a new set of classes from a new I/O library outside of EiffelBase which will be exception free. It has mostly an impact on IO_MEDIUM descendants.&lt;br /&gt;
&lt;br /&gt;
==Remove explicit creation procedure from &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt;==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
====After====&lt;br /&gt;
====Rationale====&lt;br /&gt;
Explicit creation of a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; with attached reference fields introduces objects that break void-safety rules and make a system void-unsafe.&lt;br /&gt;
====Issues====&lt;br /&gt;
Some code needs to be redesigned to remove explicit &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; creation.&lt;br /&gt;
====Impact====&lt;br /&gt;
Low: explicit tuple creation can be flagged as obsolete by using regular Eiffel mechanism. After 1-2 releases the feature can be removed.&lt;br /&gt;
&lt;br /&gt;
==Make &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt; argument of features &amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; attached==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;detachable TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====After====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====Rationale====&lt;br /&gt;
It is possible that an agent object expects some arguments, but if it is passed &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, the compiler does not warn user about the issue.&lt;br /&gt;
====Issues====&lt;br /&gt;
All calls &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;.item (Void)&amp;lt;/e&amp;gt; need to be updated.&lt;br /&gt;
====Impact====&lt;br /&gt;
Very low: code can be updated by replacing &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; with &amp;lt;e&amp;gt;.call&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15389</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15389"/>
				<updated>2016-01-29T12:30:26Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Strings: remove implicit conversion STRING_32.as_string_8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Strings: remove implicit conversion STRING_32.as_string_8 ==&lt;br /&gt;
===Before===&lt;br /&gt;
XXX_STRING_32 implicitly converts to XXX_STRING_8.&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
No more XXX_STRING_32 to SSS_STRING_8 implicit conversion.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This implicit conversion was great when the STRING_32 type was introduced in Eiffel and heavily used in EiffelVision2. It enabled existing code that was purely ASCII at the time to compile unchanged. The goal was always to remove that conversion as early as possible as it is a truncation which was ok as long as your were ASCII based.&lt;br /&gt;
&lt;br /&gt;
Now this is a recipe for trouble to allow such an implicit conversion.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change if they use Unicode enabled libraries such as EiffelVision2 and still use STRING_8 in their code.&lt;br /&gt;
&lt;br /&gt;
==Void-safe and invariant-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to the fields of the original object which is either the object on which we call '''twin''' or the source being copied from.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This makes the code fully void-safe as we will never try to access fields that are declared attached but actually Void.&lt;br /&gt;
&lt;br /&gt;
This removes the need to disable invariant checking in the implementation of '''twin'''.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
Because '''copy''' can be called directly or indirectly, we used to perform the following test on a field that was supposedly attached at runtime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if field = Void then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This kind of code won't work anymore. Instead one has to do&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if Current = other then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but this is not ideal since we cannot distinguish between &amp;lt;e&amp;gt;a.twin&amp;lt;/e&amp;gt; from &amp;lt;e&amp;gt;a.copy (a)&amp;lt;/e&amp;gt;. Since calling the later is very rare, the above solution is a good one overall.&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
===Before===&lt;br /&gt;
You could duplicate objects as you wish.&lt;br /&gt;
===After===&lt;br /&gt;
You can only duplicate objects if they are marked as `copiable' or `duplicable'. So far there is no definite answer to allow this. What is being proposed is either one of the following:&lt;br /&gt;
# Define '''twin''', '''copy''', ... in ANY like today, but exported to NONE.&lt;br /&gt;
# Remove '''twin''', '''copy''', ... from ANY and add them to a new abstract class COPIABLE&lt;br /&gt;
The second solution is simple as at runtime we simply have to check for conformance to COPIABLE.&lt;br /&gt;
===Rationale===&lt;br /&gt;
If you duplicate an object graph that has some external memory reference, causing a duplication of the object holding that reference could cause a double-free of that external memory reference when Eiffel objects are disposed by the GC.&lt;br /&gt;
&lt;br /&gt;
In addition, some objects are complicated to duplicate such as: Files, Windows, Widgets, databases connections,...&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
For client code, it should still compile as before. For user defined code that is known to allow copy/duplication, the code will have to be rewritten to allow copy/duplication.&lt;br /&gt;
&lt;br /&gt;
==Change the type describing the dynamic type of objects==&lt;br /&gt;
===Before===&lt;br /&gt;
In non-void-safe mode and in void-safe mode, the dynamic type of an object was '''detachable X'''.&lt;br /&gt;
===After===&lt;br /&gt;
The dynamic type of an object would always be '''attached X'''.&lt;br /&gt;
===Rationale===&lt;br /&gt;
It is common sense that an object presence indicates implicitly that it is attached and it will simplify code that test for the type of an object. Currently one had to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [detachable X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
when really it makes more sense to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
===Issues===&lt;br /&gt;
It was initially '''detachable X''' for reasons that are too complex and vague as of this writing (mostly related to backward compatibility, storable, reflection). Changing the type to '''attached''' has some consequences:&lt;br /&gt;
* IDs won't be contiguous as they used to be&lt;br /&gt;
* Storables won't be retrievable by old systems&lt;br /&gt;
&lt;br /&gt;
==I/O and external operations==&lt;br /&gt;
===Before===&lt;br /&gt;
Any I/O operations could raise an exception upon failure.&lt;br /&gt;
===After===&lt;br /&gt;
No I/O operations will raise an exception upon failure.&lt;br /&gt;
===Rationale===&lt;br /&gt;
Writing exception free code for manipulating external resources is difficult at the moment, forcing you to use rescue clauses too many times in code that may have a very complex flow. Performing a check after the operation to  see if it was successful is exception free but allows for a better and more accurate error reporting.&lt;br /&gt;
===Issues===&lt;br /&gt;
Changing the code would break too much code. The idea is to keep the existing as is, but add a new set of classes from a new I/O library outside of EiffelBase which will be exception free. It has mostly an impact on IO_MEDIUM descendants.&lt;br /&gt;
&lt;br /&gt;
==Remove explicit creation procedure from &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt;==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
====After====&lt;br /&gt;
====Rationale====&lt;br /&gt;
Explicit creation of a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; with attached reference fields introduces objects that break void-safety rules and make a system void-unsafe.&lt;br /&gt;
====Issues====&lt;br /&gt;
Some code needs to be redesigned to remove explicit &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; creation.&lt;br /&gt;
====Impact====&lt;br /&gt;
Low: explicit tuple creation can be flagged as obsolete by using regular Eiffel mechanism. After 1-2 releases the feature can be removed.&lt;br /&gt;
&lt;br /&gt;
==Make &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt; argument of features &amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; attached==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;detachable TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====After====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====Rationale====&lt;br /&gt;
It is possible that an agent object expects some arguments, but if it is passed &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, the compiler does not warn user about the issue.&lt;br /&gt;
====Issues====&lt;br /&gt;
All calls &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;.item (Void)&amp;lt;/e&amp;gt; need to be updated.&lt;br /&gt;
====Impact====&lt;br /&gt;
Very low: code can be updated by replacing &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; with &amp;lt;e&amp;gt;.call&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_Releases&amp;diff=15387</id>
		<title>EiffelStudio Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_Releases&amp;diff=15387"/>
				<updated>2016-01-26T12:11:13Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Redirected page to EiffelStudio 15.12 Releases&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[EiffelStudio 15.12 Releases]]&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=15386</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Main_Page&amp;diff=15386"/>
				<updated>2016-01-26T12:10:54Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:General]]__NOTOC__&lt;br /&gt;
&amp;lt;h1 class=&amp;quot;firstHeading&amp;quot;&amp;gt;EiffelStudio Integrated Development Environment&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Image:EiffelStudioScreenshot.png|thumb|250px|right|EiffelStudio IDE ([http://eiffel.com/products/studio/screenshots.html more screenshots]) ]]&lt;br /&gt;
&lt;br /&gt;
Welcome to the central resource for EiffelStudio developers and contributors.&lt;br /&gt;
==News==&lt;br /&gt;
*''21st Dec 2015'': EiffelStudio 15.12 is available for download at http://www.eiffel.com/downloads&lt;br /&gt;
*''26th Aug 2015'': EiffelStudio 15.08 is available for download at http://www.eiffel.com/downloads&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is an open-source IDE for the [http://en.wikipedia.org/wiki/Eiffel_programming_language Eiffel programming language]. [http://www.eiffel.com Eiffel Software] is the principal contributor and hosts the subversion repository. EiffelStudio is maintained and developed by Eiffel Software as well many contributors, including ETH Zurich.&lt;br /&gt;
&lt;br /&gt;
EiffelStudio is a full-featured IDE offering the following features, many of them unique:&lt;br /&gt;
&lt;br /&gt;
* Complete compiler for the Eiffel programming language, with Design By Contract (DBC) support and both high compile-time speed and high-performance executables, based on the Melting Ice Technology.&lt;br /&gt;
* Full portability (including graphics) across Windows, MacOS X, Linux, *BSD, Solaris and other operating systems&lt;br /&gt;
* Smart code editor&lt;br /&gt;
* Sophisticated multi-view browsing and viewing facilities&lt;br /&gt;
* Interactive debugger&lt;br /&gt;
* Graphical modeling tool for UML and BON with full roundtrip&lt;br /&gt;
* Refactoring support&lt;br /&gt;
* GUI development tool (EiffelBuild) and fully portable GUI library (EiffelVision)&lt;br /&gt;
* Many other libraries of reusable component.&lt;br /&gt;
&lt;br /&gt;
The Eiffel compiler creates C code that is then handed to a standard C compiler. As a result, Eiffel programs have a run-time performance comparable to those directly written in C or C++, but with the benefits of an advanced object-oriented model and strong typing. EiffelStudio uses a highly efficient compacting garbage collector to free the developer from the burden of memory management.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;If you want to know more about the unique features of Eiffel and EiffelStudio, check out our [[Reasons for using Eiffel]] page.&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;font-size:80%;&amp;quot; bgcolor=white|&lt;br /&gt;
{| cellspacing=8 width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
&lt;br /&gt;
* [[Downloads]]&lt;br /&gt;
* [[EiffelStudio Releases|Changelog of current release (release branch)]]&lt;br /&gt;
* [http://docs.eiffel.com/book/eiffelstudio/software-installation-eiffelstudio Installing EiffelStudio]&lt;br /&gt;
* [[Compiling Hello World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Working with EiffelStudio ==&lt;br /&gt;
&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[Eiffel Glossary]]&lt;br /&gt;
* [[Eiffel Compilation Explained]]&lt;br /&gt;
* [[EiffelStudio Wish List]]&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
== Contributing! ==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Projects|How to contribute: the Projects page]]&lt;br /&gt;
* [[:Category:Testing|EiffelStudio testing process: you can participate!]]&lt;br /&gt;
* [[EiffelStudio 16.05 Releases|Changelog of latest development version, currently 16.05 (development trunk)]]&lt;br /&gt;
* [[Repository|Getting the source: Subversion repository]]&lt;br /&gt;
* [[Compiling EiffelStudio]]&lt;br /&gt;
* [[:Category:Tools|Developer's tools]]&lt;br /&gt;
* [[Language_Roadmap|Language roadmap]]&lt;br /&gt;
* [[Environment_Roadmap|Environment roadmap]]&lt;br /&gt;
* [[Design_and_coding_rules|Design and coding rules]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#f6f9fb&amp;quot; style=&amp;quot;border:1px solid #8f8f8f;padding:0 .5em .5em .5em;&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.eiffelroom.org EiffelRoom]&lt;br /&gt;
* [[Spread_the_word|Spread the word]]&lt;br /&gt;
* [[Eiffel Sites and Links]]&lt;br /&gt;
* [[Mailing Lists]]&lt;br /&gt;
* [[:Category:News|News]]&lt;br /&gt;
* Join us on IRC at chat.freenode.net #eiffelstudio or through http://community.eiffel.com/irc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=MediaWiki:Sidebar&amp;diff=15385</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=MediaWiki:Sidebar&amp;diff=15385"/>
				<updated>2016-01-26T12:08:25Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Navigation&lt;br /&gt;
** home-url|home&lt;br /&gt;
** Mission|Mission&lt;br /&gt;
** Spread_the_word|Spread the word&lt;br /&gt;
** categories-url|categories&lt;br /&gt;
** downloads-url|downloads&lt;br /&gt;
** Frequently_Asked_Questions|FAQ&lt;br /&gt;
** mailing-lists-url|mailing-lists&lt;br /&gt;
* Development&lt;br /&gt;
** Source_Code|Source Code&lt;br /&gt;
** Compiling_EiffelStudio|Compiling EiffelStudio&lt;br /&gt;
** Category:Projects|Contributing&lt;br /&gt;
** EiffelStudio_16.05_Releases|Change Log 16.x&lt;br /&gt;
** Environment_Roadmap|Road map&lt;br /&gt;
** URLs|Useful URLs&lt;br /&gt;
*Wiki&lt;br /&gt;
** allpages-url|allpages&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** users-url|users&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_15.12_Releases&amp;diff=15383</id>
		<title>EiffelStudio 15.12 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_15.12_Releases&amp;diff=15383"/>
				<updated>2016-01-26T12:07:28Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Manus moved page EiffelStudio 15.11 Releases to EiffelStudio 15.12 Releases&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 15.12.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/15.12/&lt;br /&gt;
&lt;br /&gt;
==15.12.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*compiler - Supported tuple type unfolding that allows to avoid explicit nested tuple type declarations when there is only one formal generic type that is constrained to a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; type. For example, for the class&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
FOO [X, T -&amp;gt; TUPLE, Y]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
the type declarations&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
FOO [A, TUPLE [B, C], D]&lt;br /&gt;
FOO [A, TUPLE [B, C, E], D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
can be written as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
FOO [A, B, C, D]&lt;br /&gt;
FOO [A, B, C, E, D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
* compiler: test#scoop074 - Propagated controlled status of an object test expression to an associated object test local to avoid unnecessary wrapping for this local.&lt;br /&gt;
* compiler: bug#19147 - Provided new configuration options are &amp;quot;workbench_c_basket_limit&amp;quot; and &amp;quot;finalized_c_basket_limit&amp;quot; that can be used in &amp;quot;.../studio/eifinit/general.cfg&amp;quot; to specify maximum limits of C files that can be generated in one directory in workbench and finalized modes respectively for the cases when C compilation fails because of too large C files.&lt;br /&gt;
* compiler, library, runtime - Removed the first parameter in &amp;lt;e&amp;gt;ROUTINE&amp;lt;/e&amp;gt; family classes (&amp;lt;e&amp;gt;PROCEDURE&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;PREDICATE&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;FUNCTION&amp;lt;/e&amp;gt;). Combined with tuple unfolding, the following type declarations:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
PROCEDURE [A, TUPLE [B, C]]&lt;br /&gt;
FUNCTION [A, TUPLE [B, C], D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
are written now as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
PROCEDURE [B, C]&lt;br /&gt;
FUNCTION [B, C, D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
* EiffelStudio: Added a configuration file &amp;lt;code&amp;gt;code_analysis.xml&amp;lt;/code&amp;gt; for default settings of Eiffel Inspector.&lt;br /&gt;
* EiffelStudio: Changed order of inclusion and exclusion patterns saved in configuration files (ECF) to be lexicographically sorted.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: test#scoop075 - Fixed a code generation bug in finalized mode for separate feature calls that involve values of a pointer type.&lt;br /&gt;
*compiler: bug#19120 (test#tuple019) - Fixed a bug that caused a compiler exception when a non-conforming value was assigned to a tuple field.&lt;br /&gt;
*compiler: Made code analysis preference names and associated command-line options locale-independent.&lt;br /&gt;
*compiler: Fixed generation of debugger breakpoint positions for tuple field assignment that was broken by the previous release.&lt;br /&gt;
*compiler: test#attach049 - Fixed a bug that caused incorrect identification of certified attachment patterns (CAP) when target of Boolean operators like &amp;lt;e&amp;gt;and&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;or&amp;lt;/e&amp;gt; is not of a Boolean type and therefore should not be taken into account when detecting CAPs.&lt;br /&gt;
*compiler: test#attach114 - Fixed a bug that could lead to a feature call on void target if parenthesis alias calls were used in a creation procedure.&lt;br /&gt;
*compiler: bug#17907 (test#incr417), bug#17913 (test#incr418), bug#17942 (test#incr419), test#incr432 - Fixed a bug in incremental recompilation that might cause wrong errors to be reported or a crash if there are source code errors involving qualified anchored types during recompilation.&lt;br /&gt;
*compiler: test#attach115 - Fixed a bug that could lead to a feature call on void target if an empty loop of iteration form on an argument was used in a creation procedure.&lt;br /&gt;
*EiffelStudio: bug#18713 (test#config039) - Significantly increased a limit on patterns specified in file rules of ECF (and project settings dialog) and improved error reporting when it is reached.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*compiler: Changed option names of code analysis rules.&lt;br /&gt;
*compiler: Used the same convention for threshold values of all code analysis rules: now the threshold value is included in the range of allowed values.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_15.11_Releases&amp;diff=15384</id>
		<title>EiffelStudio 15.11 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_15.11_Releases&amp;diff=15384"/>
				<updated>2016-01-26T12:07:28Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Manus moved page EiffelStudio 15.11 Releases to EiffelStudio 15.12 Releases&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[EiffelStudio 15.12 Releases]]&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=EiffelStudio_15.12_Releases&amp;diff=15382</id>
		<title>EiffelStudio 15.12 Releases</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=EiffelStudio_15.12_Releases&amp;diff=15382"/>
				<updated>2016-01-26T12:07:17Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Releases]]__NOTOC__{{ReleaseHistoryHeader}}&lt;br /&gt;
&lt;br /&gt;
= EiffelStudio 15.12.x Releases=&lt;br /&gt;
&lt;br /&gt;
Beta download: https://ftp.eiffel.com/pub/beta/15.12/&lt;br /&gt;
&lt;br /&gt;
==15.12.x.x==&lt;br /&gt;
&lt;br /&gt;
===New features===&lt;br /&gt;
*compiler - Supported tuple type unfolding that allows to avoid explicit nested tuple type declarations when there is only one formal generic type that is constrained to a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; type. For example, for the class&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
FOO [X, T -&amp;gt; TUPLE, Y]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
the type declarations&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
FOO [A, TUPLE [B, C], D]&lt;br /&gt;
FOO [A, TUPLE [B, C, E], D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
can be written as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
FOO [A, B, C, D]&lt;br /&gt;
FOO [A, B, C, E, D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Improvements===&lt;br /&gt;
* compiler: test#scoop074 - Propagated controlled status of an object test expression to an associated object test local to avoid unnecessary wrapping for this local.&lt;br /&gt;
* compiler: bug#19147 - Provided new configuration options are &amp;quot;workbench_c_basket_limit&amp;quot; and &amp;quot;finalized_c_basket_limit&amp;quot; that can be used in &amp;quot;.../studio/eifinit/general.cfg&amp;quot; to specify maximum limits of C files that can be generated in one directory in workbench and finalized modes respectively for the cases when C compilation fails because of too large C files.&lt;br /&gt;
* compiler, library, runtime - Removed the first parameter in &amp;lt;e&amp;gt;ROUTINE&amp;lt;/e&amp;gt; family classes (&amp;lt;e&amp;gt;PROCEDURE&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;PREDICATE&amp;lt;/e&amp;gt;, &amp;lt;e&amp;gt;FUNCTION&amp;lt;/e&amp;gt;). Combined with tuple unfolding, the following type declarations:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
PROCEDURE [A, TUPLE [B, C]]&lt;br /&gt;
FUNCTION [A, TUPLE [B, C], D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
are written now as&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
PROCEDURE [B, C]&lt;br /&gt;
FUNCTION [B, C, D]&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
* EiffelStudio: Added a configuration file &amp;lt;code&amp;gt;code_analysis.xml&amp;lt;/code&amp;gt; for default settings of Eiffel Inspector.&lt;br /&gt;
* EiffelStudio: Changed order of inclusion and exclusion patterns saved in configuration files (ECF) to be lexicographically sorted.&lt;br /&gt;
&lt;br /&gt;
===Feature removed===&lt;br /&gt;
===Bug fixes===&lt;br /&gt;
*compiler: test#scoop075 - Fixed a code generation bug in finalized mode for separate feature calls that involve values of a pointer type.&lt;br /&gt;
*compiler: bug#19120 (test#tuple019) - Fixed a bug that caused a compiler exception when a non-conforming value was assigned to a tuple field.&lt;br /&gt;
*compiler: Made code analysis preference names and associated command-line options locale-independent.&lt;br /&gt;
*compiler: Fixed generation of debugger breakpoint positions for tuple field assignment that was broken by the previous release.&lt;br /&gt;
*compiler: test#attach049 - Fixed a bug that caused incorrect identification of certified attachment patterns (CAP) when target of Boolean operators like &amp;lt;e&amp;gt;and&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;or&amp;lt;/e&amp;gt; is not of a Boolean type and therefore should not be taken into account when detecting CAPs.&lt;br /&gt;
*compiler: test#attach114 - Fixed a bug that could lead to a feature call on void target if parenthesis alias calls were used in a creation procedure.&lt;br /&gt;
*compiler: bug#17907 (test#incr417), bug#17913 (test#incr418), bug#17942 (test#incr419), test#incr432 - Fixed a bug in incremental recompilation that might cause wrong errors to be reported or a crash if there are source code errors involving qualified anchored types during recompilation.&lt;br /&gt;
*compiler: test#attach115 - Fixed a bug that could lead to a feature call on void target if an empty loop of iteration form on an argument was used in a creation procedure.&lt;br /&gt;
*EiffelStudio: bug#18713 (test#config039) - Significantly increased a limit on patterns specified in file rules of ECF (and project settings dialog) and improved error reporting when it is reached.&lt;br /&gt;
&lt;br /&gt;
===User changes===&lt;br /&gt;
*compiler: Changed option names of code analysis rules.&lt;br /&gt;
*compiler: Used the same convention for threshold values of all code analysis rules: now the threshold value is included in the range of allowed values.&lt;br /&gt;
&lt;br /&gt;
===Developer changes===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15381</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15381"/>
				<updated>2016-01-23T13:34:05Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* File operations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe and invariant-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to the fields of the original object which is either the object on which we call '''twin''' or the source being copied from.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This makes the code fully void-safe as we will never try to access fields that are declared attached but actually Void.&lt;br /&gt;
&lt;br /&gt;
This removes the need to disable invariant checking in the implementation of '''twin'''.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
Because '''copy''' can be called directly or indirectly, we used to perform the following test on a field that was supposedly attached at runtime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if field = Void then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This kind of code won't work anymore. Instead one has to do&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if Current = other then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but this is not ideal since we cannot distinguish between &amp;lt;e&amp;gt;a.twin&amp;lt;/e&amp;gt; from &amp;lt;e&amp;gt;a.copy (a)&amp;lt;/e&amp;gt;. Since calling the later is very rare, the above solution is a good one overall.&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
===Before===&lt;br /&gt;
You could duplicate objects as you wish.&lt;br /&gt;
===After===&lt;br /&gt;
You can only duplicate objects if they are marked as `copiable' or `duplicable'. So far there is no definite answer to allow this. What is being proposed is either one of the following:&lt;br /&gt;
# Define '''twin''', '''copy''', ... in ANY like today, but exported to NONE.&lt;br /&gt;
# Remove '''twin''', '''copy''', ... from ANY and add them to a new abstract class COPIABLE&lt;br /&gt;
The second solution is simple as at runtime we simply have to check for conformance to COPIABLE.&lt;br /&gt;
===Rationale===&lt;br /&gt;
If you duplicate an object graph that has some external memory reference, causing a duplication of the object holding that reference could cause a double-free of that external memory reference when Eiffel objects are disposed by the GC.&lt;br /&gt;
&lt;br /&gt;
In addition, some objects are complicated to duplicate such as: Files, Windows, Widgets, databases connections,...&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
For client code, it should still compile as before. For user defined code that is known to allow copy/duplication, the code will have to be rewritten to allow copy/duplication.&lt;br /&gt;
&lt;br /&gt;
==Change the type describing the dynamic type of objects==&lt;br /&gt;
===Before===&lt;br /&gt;
In non-void-safe mode and in void-safe mode, the dynamic type of an object was '''detachable X'''.&lt;br /&gt;
===After===&lt;br /&gt;
The dynamic type of an object would always be '''attached X'''.&lt;br /&gt;
===Rationale===&lt;br /&gt;
It is common sense that an object presence indicates implicitly that it is attached and it will simplify code that test for the type of an object. Currently one had to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [detachable X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
when really it makes more sense to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
===Issues===&lt;br /&gt;
It was initially '''detachable X''' for reasons that are too complex and vague as of this writing (mostly related to backward compatibility, storable, reflection). Changing the type to '''attached''' has some consequences:&lt;br /&gt;
* IDs won't be contiguous as they used to be&lt;br /&gt;
* Storables won't be retrievable by old systems&lt;br /&gt;
&lt;br /&gt;
==I/O and external operations==&lt;br /&gt;
===Before===&lt;br /&gt;
Any I/O operations could raise an exception upon failure.&lt;br /&gt;
===After===&lt;br /&gt;
No I/O operations will raise an exception upon failure.&lt;br /&gt;
===Rationale===&lt;br /&gt;
Writing exception free code for manipulating external resources is difficult at the moment, forcing you to use rescue clauses too many times in code that may have a very complex flow. Performing a check after the operation to  see if it was successful is exception free but allows for a better and more accurate error reporting.&lt;br /&gt;
===Issues===&lt;br /&gt;
Changing the code would break too much code. The idea is to keep the existing as is, but add a new set of classes from a new I/O library outside of EiffelBase which will be exception free. It has mostly an impact on IO_MEDIUM descendants.&lt;br /&gt;
&lt;br /&gt;
==Remove explicit creation procedure from &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt;==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
====After====&lt;br /&gt;
====Rationale====&lt;br /&gt;
Explicit creation of a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; with attached reference fields introduces objects that break void-safety rules and make a system void-unsafe.&lt;br /&gt;
====Issues====&lt;br /&gt;
Some code needs to be redesigned to remove explicit &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; creation.&lt;br /&gt;
====Impact====&lt;br /&gt;
Low: explicit tuple creation can be flagged as obsolete by using regular Eiffel mechanism. After 1-2 releases the feature can be removed.&lt;br /&gt;
&lt;br /&gt;
==Make &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt; argument of features &amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; attached==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;detachable TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====After====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====Rationale====&lt;br /&gt;
It is possible that an agent object expects some arguments, but if it is passed &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, the compiler does not warn user about the issue.&lt;br /&gt;
====Issues====&lt;br /&gt;
All calls &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;.item (Void)&amp;lt;/e&amp;gt; need to be updated.&lt;br /&gt;
====Impact====&lt;br /&gt;
Very low: code can be updated by replacing &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; with &amp;lt;e&amp;gt;.call&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15380</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15380"/>
				<updated>2016-01-23T13:30:00Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Change dynamic type of objects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe and invariant-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to the fields of the original object which is either the object on which we call '''twin''' or the source being copied from.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This makes the code fully void-safe as we will never try to access fields that are declared attached but actually Void.&lt;br /&gt;
&lt;br /&gt;
This removes the need to disable invariant checking in the implementation of '''twin'''.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
Because '''copy''' can be called directly or indirectly, we used to perform the following test on a field that was supposedly attached at runtime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if field = Void then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This kind of code won't work anymore. Instead one has to do&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if Current = other then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but this is not ideal since we cannot distinguish between &amp;lt;e&amp;gt;a.twin&amp;lt;/e&amp;gt; from &amp;lt;e&amp;gt;a.copy (a)&amp;lt;/e&amp;gt;. Since calling the later is very rare, the above solution is a good one overall.&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
===Before===&lt;br /&gt;
You could duplicate objects as you wish.&lt;br /&gt;
===After===&lt;br /&gt;
You can only duplicate objects if they are marked as `copiable' or `duplicable'. So far there is no definite answer to allow this. What is being proposed is either one of the following:&lt;br /&gt;
# Define '''twin''', '''copy''', ... in ANY like today, but exported to NONE.&lt;br /&gt;
# Remove '''twin''', '''copy''', ... from ANY and add them to a new abstract class COPIABLE&lt;br /&gt;
The second solution is simple as at runtime we simply have to check for conformance to COPIABLE.&lt;br /&gt;
===Rationale===&lt;br /&gt;
If you duplicate an object graph that has some external memory reference, causing a duplication of the object holding that reference could cause a double-free of that external memory reference when Eiffel objects are disposed by the GC.&lt;br /&gt;
&lt;br /&gt;
In addition, some objects are complicated to duplicate such as: Files, Windows, Widgets, databases connections,...&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
For client code, it should still compile as before. For user defined code that is known to allow copy/duplication, the code will have to be rewritten to allow copy/duplication.&lt;br /&gt;
&lt;br /&gt;
==Change the type describing the dynamic type of objects==&lt;br /&gt;
===Before===&lt;br /&gt;
In non-void-safe mode and in void-safe mode, the dynamic type of an object was '''detachable X'''.&lt;br /&gt;
===After===&lt;br /&gt;
The dynamic type of an object would always be '''attached X'''.&lt;br /&gt;
===Rationale===&lt;br /&gt;
It is common sense that an object presence indicates implicitly that it is attached and it will simplify code that test for the type of an object. Currently one had to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [detachable X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
when really it makes more sense to write:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if attached {TYPE [X]} obj.generating_type then&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
===Issues===&lt;br /&gt;
It was initially '''detachable X''' for reasons that are too complex and vague as of this writing (mostly related to backward compatibility, storable, reflection). Changing the type to '''attached''' has some consequences:&lt;br /&gt;
* IDs won't be contiguous as they used to be&lt;br /&gt;
* Storables won't be retrievable by old systems&lt;br /&gt;
&lt;br /&gt;
==File operations==&lt;br /&gt;
&lt;br /&gt;
==Remove explicit creation procedure from &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt;==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
====After====&lt;br /&gt;
====Rationale====&lt;br /&gt;
Explicit creation of a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; with attached reference fields introduces objects that break void-safety rules and make a system void-unsafe.&lt;br /&gt;
====Issues====&lt;br /&gt;
Some code needs to be redesigned to remove explicit &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; creation.&lt;br /&gt;
====Impact====&lt;br /&gt;
Low: explicit tuple creation can be flagged as obsolete by using regular Eiffel mechanism. After 1-2 releases the feature can be removed.&lt;br /&gt;
&lt;br /&gt;
==Make &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt; argument of features &amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; attached==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;detachable TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====After====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====Rationale====&lt;br /&gt;
It is possible that an agent object expects some arguments, but if it is passed &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, the compiler does not warn user about the issue.&lt;br /&gt;
====Issues====&lt;br /&gt;
All calls &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;.item (Void)&amp;lt;/e&amp;gt; need to be updated.&lt;br /&gt;
====Impact====&lt;br /&gt;
Very low: code can be updated by replacing &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; with &amp;lt;e&amp;gt;.call&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15379</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15379"/>
				<updated>2016-01-23T13:16:07Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Restrict export to copy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe and invariant-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to the fields of the original object which is either the object on which we call '''twin''' or the source being copied from.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This makes the code fully void-safe as we will never try to access fields that are declared attached but actually Void.&lt;br /&gt;
&lt;br /&gt;
This removes the need to disable invariant checking in the implementation of '''twin'''.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
Because '''copy''' can be called directly or indirectly, we used to perform the following test on a field that was supposedly attached at runtime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if field = Void then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This kind of code won't work anymore. Instead one has to do&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if Current = other then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but this is not ideal since we cannot distinguish between &amp;lt;e&amp;gt;a.twin&amp;lt;/e&amp;gt; from &amp;lt;e&amp;gt;a.copy (a)&amp;lt;/e&amp;gt;. Since calling the later is very rare, the above solution is a good one overall.&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
===Before===&lt;br /&gt;
You could duplicate objects as you wish.&lt;br /&gt;
===After===&lt;br /&gt;
You can only duplicate objects if they are marked as `copiable' or `duplicable'. So far there is no definite answer to allow this. What is being proposed is either one of the following:&lt;br /&gt;
# Define '''twin''', '''copy''', ... in ANY like today, but exported to NONE.&lt;br /&gt;
# Remove '''twin''', '''copy''', ... from ANY and add them to a new abstract class COPIABLE&lt;br /&gt;
The second solution is simple as at runtime we simply have to check for conformance to COPIABLE.&lt;br /&gt;
===Rationale===&lt;br /&gt;
If you duplicate an object graph that has some external memory reference, causing a duplication of the object holding that reference could cause a double-free of that external memory reference when Eiffel objects are disposed by the GC.&lt;br /&gt;
&lt;br /&gt;
In addition, some objects are complicated to duplicate such as: Files, Windows, Widgets, databases connections,...&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
For client code, it should still compile as before. For user defined code that is known to allow copy/duplication, the code will have to be rewritten to allow copy/duplication.&lt;br /&gt;
&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
==File operations==&lt;br /&gt;
&lt;br /&gt;
==Remove explicit creation procedure from &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt;==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
====After====&lt;br /&gt;
====Rationale====&lt;br /&gt;
Explicit creation of a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; with attached reference fields introduces objects that break void-safety rules and make a system void-unsafe.&lt;br /&gt;
====Issues====&lt;br /&gt;
Some code needs to be redesigned to remove explicit &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; creation.&lt;br /&gt;
====Impact====&lt;br /&gt;
Low: explicit tuple creation can be flagged as obsolete by using regular Eiffel mechanism. After 1-2 releases the feature can be removed.&lt;br /&gt;
&lt;br /&gt;
==Make &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt; argument of features &amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; attached==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;detachable TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====After====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====Rationale====&lt;br /&gt;
It is possible that an agent object expects some arguments, but if it is passed &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, the compiler does not warn user about the issue.&lt;br /&gt;
====Issues====&lt;br /&gt;
All calls &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;.item (Void)&amp;lt;/e&amp;gt; need to be updated.&lt;br /&gt;
====Impact====&lt;br /&gt;
Very low: code can be updated by replacing &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; with &amp;lt;e&amp;gt;.call&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15378</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15378"/>
				<updated>2016-01-23T13:08:46Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Void-safe copy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe and invariant-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to the fields of the original object which is either the object on which we call '''twin''' or the source being copied from.&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
This makes the code fully void-safe as we will never try to access fields that are declared attached but actually Void.&lt;br /&gt;
&lt;br /&gt;
This removes the need to disable invariant checking in the implementation of '''twin'''.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
Because '''copy''' can be called directly or indirectly, we used to perform the following test on a field that was supposedly attached at runtime:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if field = Void then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This kind of code won't work anymore. Instead one has to do&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
if Current = other then&lt;br /&gt;
        -- Called from `twin`&lt;br /&gt;
    ...&lt;br /&gt;
else&lt;br /&gt;
        -- Direct call to `copy'&lt;br /&gt;
    ...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
but this is not ideal since we cannot distinguish between &amp;lt;e&amp;gt;a.twin&amp;lt;/e&amp;gt; from &amp;lt;e&amp;gt;a.copy (a)&amp;lt;/e&amp;gt;. Since calling the later is very rare, the above solution is a good one overall.&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
==File operations==&lt;br /&gt;
&lt;br /&gt;
==Remove explicit creation procedure from &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt;==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
====After====&lt;br /&gt;
====Rationale====&lt;br /&gt;
Explicit creation of a &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; with attached reference fields introduces objects that break void-safety rules and make a system void-unsafe.&lt;br /&gt;
====Issues====&lt;br /&gt;
Some code needs to be redesigned to remove explicit &amp;lt;e&amp;gt;TUPLE&amp;lt;/e&amp;gt; creation.&lt;br /&gt;
====Impact====&lt;br /&gt;
Low: explicit tuple creation can be flagged as obsolete by using regular Eiffel mechanism. After 1-2 releases the feature can be removed.&lt;br /&gt;
&lt;br /&gt;
==Make &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt; argument of features &amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; attached==&lt;br /&gt;
'''Scope:''' void-safety&lt;br /&gt;
====Before====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;detachable TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====After====&lt;br /&gt;
&amp;lt;code&amp;gt;{ROUTINE}.call&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;{FUNCTION}.item&amp;lt;/code&amp;gt; take argument of a type &amp;lt;code&amp;gt;TUPLE&amp;lt;/code&amp;gt;.&lt;br /&gt;
====Rationale====&lt;br /&gt;
It is possible that an agent object expects some arguments, but if it is passed &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt;, the compiler does not warn user about the issue.&lt;br /&gt;
====Issues====&lt;br /&gt;
All calls &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;.item (Void)&amp;lt;/e&amp;gt; need to be updated.&lt;br /&gt;
====Impact====&lt;br /&gt;
Very low: code can be updated by replacing &amp;lt;e&amp;gt;.call (Void)&amp;lt;/e&amp;gt; with &amp;lt;e&amp;gt;.call&amp;lt;/e&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15373</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15373"/>
				<updated>2016-01-21T13:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes. In addition, since the standardization was completed, Eiffel Software kept adding new language features too.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to either the fields of the original object&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
==File operations==&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15372</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15372"/>
				<updated>2016-01-21T13:04:53Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Library changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to either the fields of the original object&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
==File operations==&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15371</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15371"/>
				<updated>2016-01-21T13:04:15Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Language Change */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to either the fields of the original object&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;br /&gt;
&lt;br /&gt;
==Frozen/variant annotations==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15370</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15370"/>
				<updated>2016-01-21T12:55:05Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Void-safe copy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe copy==&lt;br /&gt;
===Before===&lt;br /&gt;
Whenever a user redefined copy, it was the assumption that argument's fields would be all set to their default value (case of '''copy''' called indirectly via '''twin''') or to some tangible value (normal case of doing '''x.copy (y)''').&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
Whenever a user redefines copy, all the fields are properly set to either the fields of the original object&lt;br /&gt;
&lt;br /&gt;
===Rationale===&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15369</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15369"/>
				<updated>2016-01-21T12:51:27Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Library changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe copy==&lt;br /&gt;
==Restrict export to copy==&lt;br /&gt;
==Change dynamic type of objects==&lt;br /&gt;
&lt;br /&gt;
=Language Change=&lt;br /&gt;
==Reverse order of inheritance clauses==&lt;br /&gt;
&lt;br /&gt;
==Dynamic dispatch==&lt;br /&gt;
&lt;br /&gt;
==Non-conforming inheritance==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15368</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15368"/>
				<updated>2016-01-21T12:44:12Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Library changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;br /&gt;
&lt;br /&gt;
==Void-safe copy==&lt;br /&gt;
==Restrict export to copy==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15367</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15367"/>
				<updated>2016-01-21T12:43:31Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
And we have STRING_32, IMMUTABLE_STRING_8 and IMMUTABLE_STRING_32&lt;br /&gt;
&lt;br /&gt;
===After===&lt;br /&gt;
STRING should be the equivalent of what IMMUTABLE_STRING_32 was before. &lt;br /&gt;
STRING_8 should be the equivalent of what IMMUTABLE_STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_8 should be the equivalent of what STRING_8 was before.&lt;br /&gt;
MUTABLE_STRING_32 should be the equivalent of what STRING_32 was before.&lt;br /&gt;
&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
The end benefit is that we would have cleaner string manipulations and more importantly much more efficient string operations (search, string sharing, traversals, ...)&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore by this change. Pretty much all libraries would have to be rewritten.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15366</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15366"/>
				<updated>2016-01-21T12:39:48Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
===After===&lt;br /&gt;
STRING should map to IMMUTABLE_STRING_32&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;br /&gt;
A lot of code would not compile anymore&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15365</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15365"/>
				<updated>2016-01-21T12:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Strings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;br /&gt;
===Before===&lt;br /&gt;
STRING maps to STRING_8&lt;br /&gt;
===After===&lt;br /&gt;
STRING should map to IMMUTABLE_STRING_32&lt;br /&gt;
===Rational===&lt;br /&gt;
When STRING_32 was added, we did not want to break existing code if it became the default. For example, many Eiffel libraries having a binding with C, could directly use an Eiffel STRING object as argument to a C routines. Of course this is very dangerous and we have changed this over the year to introduce safer mechanism (such as C_STRING).&lt;br /&gt;
&lt;br /&gt;
Now the world is Unicode, not using a Unicode string by default does not make sense. On top of that, string instances are rarely modified and we have seen over the year many bugs because users have a tendency to forget this important fact. Which caused a lot of code to duplicate strings just to be sure, making the code less efficient. This is why we want to map STRING to IMMUTABLE_STRING_32.&lt;br /&gt;
&lt;br /&gt;
===Issues===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15364</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15364"/>
				<updated>2016-01-21T12:33:57Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
=Library changes=&lt;br /&gt;
==Strings==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15363</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15363"/>
				<updated>2016-01-21T12:33:39Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
As of this writing, January 21st 2016, the Eiffel language has slowly evolved over the years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard in 2005 ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard in 2006 ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
==Library changes==&lt;br /&gt;
===Strings===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15362</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15362"/>
				<updated>2016-01-21T12:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The Eiffel language slowly evolved the past 20 years and added numerous new facilities. Initially, the changes were done by Eiffel Software while maintaining backward compatibility. Then, a major work was done between 2001 and 2005 to standardize the language which became an ECMA standard ([http://www.ecma-international.org/publications/standards/Ecma-367.htm ECMA-367]) and an ISO standard ([http://www.iso.org/iso/catalogue_detail.htm?csnumber=42924 ISO/IEC 25436:2006]). That work established some constructs initially implemented in EiffelStudio and also introduced some new ones. Most of the changes introduced by the standardization have been implemented but there are quite a few remaining. In some cases, it is due to the ration cost/benefit of the implementation, in some others it is a breaking changes.&lt;br /&gt;
&lt;br /&gt;
This page is going to list all the changes that needs to be done by Eiffel Software to conform to the standard which cover both the language but also the library facilities required to support the language specification.&lt;br /&gt;
&lt;br /&gt;
==Library changes==&lt;br /&gt;
===Strings===&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Unicode/Encoding_Utility_Wish_List&amp;diff=15361</id>
		<title>Unicode/Encoding Utility Wish List</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Unicode/Encoding_Utility_Wish_List&amp;diff=15361"/>
				<updated>2016-01-21T12:20:32Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Unicode]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
This page collects libraries/utilities that are missing or under improvement concerning to Unicode or encoding supports in Eiffel.&lt;br /&gt;
&lt;br /&gt;
== List ==&lt;br /&gt;
* Regular Expression&lt;br /&gt;
* Wildcard matcher&lt;br /&gt;
* Unicode Normalization (Comparison)&lt;br /&gt;
* Capitalization&lt;br /&gt;
* Input Method Activation (GTK)&lt;br /&gt;
* Encoding name Unification (Encoding library)&lt;br /&gt;
* XML library&lt;br /&gt;
* Time library&lt;br /&gt;
* Diff library&lt;br /&gt;
* Localization library: make context of translation available in API; make component selection available in API.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Add_Library_Configuration&amp;diff=15360</id>
		<title>Add Library Configuration</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Add_Library_Configuration&amp;diff=15360"/>
				<updated>2016-01-21T12:20:00Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
As of [[:Category:EiffelStudio|EiffelStudio]] 6.3, the configuration's Add Library and Add Precompile Library dialogs can be customized to include user-specific locations, making it easier to add libraries quickly.&lt;br /&gt;
&lt;br /&gt;
== Installation Files ==&lt;br /&gt;
The stock installation configuration files are found under the usual ''eifinit'' configuration folder under ''[[Environment Variables#Core Variables|$ISE_EIFFEL]]/studio/eifinit''. For Add Library the configuration file is named ''libraries.cfg'' and for Add Precompile Library the file is named ''precompiles.cfg''. These are the standard configurations for known locations in the [[:Category:EiffelStudio|EiffelStudio]] installation. It is premittable to [[#Editing the Configuration Files|modify]] the contents of these files, if you have the privileges and can point to locations where all users will benefit.&lt;br /&gt;
&lt;br /&gt;
== User Files ==&lt;br /&gt;
If you do not have permission to modify the installed configuration files, want to point to user-specific locations or just want a location to remain private to the user then a [[Replaceable User Files|user file]] can be used.&lt;br /&gt;
&lt;br /&gt;
The library configuration dialogs configuration [[Replaceable User Files|user files]] should be located under ''[[Environment Variables#Optional Variables|$ISE_USER_FILES]]/studio/eifinit''. See [[Replaceable User Files]] for more information about the resolved value of [[Environment Variables#Optional Variables|ISE_USER_FILES]] for each platform.&lt;br /&gt;
&lt;br /&gt;
Simply create the necessary directory structure and create a '''new''' configuration file with the same name as the one installed. So for ''[[Environment Variables#Core Variables|$ISE_EIFFEL]]/studio/eifinit/libraries.cfg'' you'd need to create ''[[Environment Variables#Optional Variables|$ISE_USER_FILES]]/studio/eifinit/libraries.cfg''. There is not need to copy the installed configuration files because the contents of both are merged to build the complete list of available libraries, in the appropriate Add Library dialog.&lt;br /&gt;
&lt;br /&gt;
== Editing the Configuration Files ==&lt;br /&gt;
The format of the library configuration files is very simplistic:&lt;br /&gt;
&lt;br /&gt;
Each folder entry must be on a new line and may contain [[Environment Variables|environment]] or [[Configuration Variables|configuration file variables]] tokenized by using $NAME or ${NAME} where necessary. Paths should be declared using a back-slash ('\') separator and '''not''' a forward-slash ('/'); although it will function it is not recommended. A path declaration should be followed by a single TAB character and then an integer value, indicating the depth to search in the directory structure.&lt;br /&gt;
&lt;br /&gt;
Search depths can be from 0 to any reasonable depth, respecting the larger the search depth the longer the search duration. A value of 0 will search the declared folder path only, 1 the declared folder and and sub-folder. Finally -1 may be used to search all sub-folders.&lt;br /&gt;
&lt;br /&gt;
The following is an example, with ''&amp;lt;TAB&amp;gt;'' representing the TAB character.&lt;br /&gt;
&lt;br /&gt;
 Folder\SubFolder&amp;lt;TAB&amp;gt;3&lt;br /&gt;
 AnotherFolder\SubFolder&amp;lt;TAB&amp;gt;2&lt;br /&gt;
&lt;br /&gt;
A more concrete, and possible useful example, is referencing the Eiffel source framework libraries:&lt;br /&gt;
&lt;br /&gt;
 $EIFFEL_SRC\framework&amp;lt;TAB&amp;gt;3&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Replaceable_User_Files&amp;diff=15359</id>
		<title>Replaceable User Files</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Replaceable_User_Files&amp;diff=15359"/>
				<updated>2016-01-21T12:19:27Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Extending EiffelStudio]]&lt;br /&gt;
[[Category:EiffelStudio]]&lt;br /&gt;
&lt;br /&gt;
With the release of [[:Category:EiffelStudio|EiffelStudio]] [[EiffelStudio 6.2 Releases|6.2]] came the notion of user files, or user replaceable files. These are configuration files, and the like, the end-user (that's you) can author to override a matching file found in the stock [[:Category:EiffelStudio|EiffelStudio]] installation.&lt;br /&gt;
&lt;br /&gt;
The advantages of such a mechanism are numerous; per-user configuration, user extensibility, customize/change an installation without touching the installation, augmenting the installation with additional files and folders, ...&lt;br /&gt;
&lt;br /&gt;
== User Files ==&lt;br /&gt;
&lt;br /&gt;
User files and folders can replace or augment files found under the installation under ''[[Environment Variables#Core Variables|$ISE_EIFFEL]]/studio''. The following indicates the corresponding user paths to place installation user replacement/augment files (''X.X'' indicates the ''Major.Minor'' version number of the compiler):&lt;br /&gt;
&lt;br /&gt;
* Under '''Windows''' the default location for Eiffel user files is ''%HOMEDRIVE%\%HOMEPATH%\My Documents\Eiffel User Files\X.X\studio''&lt;br /&gt;
&lt;br /&gt;
* Under '''Unix/Linux''' the default location is ''~/.es/Eiffel User Files/X.X/studio''&lt;br /&gt;
&lt;br /&gt;
* Under '''Mac OS X''' the default location is ''~/Eiffel User Files/X.X/studio''&lt;br /&gt;
&lt;br /&gt;
If any of these location do not suit your needs, set the environment variable [[Environment Variables#Optional Variables|ISE_USER_FILES]] to point to the user files folder. Defining [[Environment Variables#Optional Variables|ISE_USER_FILES]] means user replacement/augmented files will be located under [[Environment Variables#Optional Variables|$ISE_USER_FILES]]/studio.&lt;br /&gt;
&lt;br /&gt;
To replace an install file with a user file simply mirror the directory structure found under ''[[Environment Variables#Core Variables|$ISE_EIFFEL]]/studio'' in the user files folder, as explained above. Create or place a file with the same name in the user files respective folder and it will be utilized instead of the stock installed edition. It's that simple!&lt;br /&gt;
&lt;br /&gt;
{{Note|If running a workbench version of [[:Category:EiffelStudio|EiffelStudio]] or the Eiffel compiler remember to place user files under the user file folder with a '' (workbench)'' suffix for Windows, and ''_workbench&amp;quot; suffix for non Windows. &amp;lt;br/&amp;gt;I.E. Under Linux place user files under ''~/.es_workbench/Eiffel User Files/X.X/studio'' instead of ''~/.es/Eiffel User Files/X.X/studio''.&amp;lt;br/&amp;gt; If the [[Environment Variables#Optional Variables|$ISE_USER_FILES]] environment variable has been defined then the suffix is not used because of the explicit use of an overriding the default value with an [[Environment Variables|environment variable]].}}&lt;br /&gt;
&lt;br /&gt;
=== User Folders ===&lt;br /&gt;
In some cases, user files can be found in a user folder and will not be used to replace stock installation files but to augment a stock collection of files with a user set. This functionality can be found when working with [[Code Templates|code templates]]. Templates work a little differently because the folder under the installation does not have to be mirrored in the user files folder. Instead under the user folder there is a separate ''templates'' folder used to contain any and all code templates for tools like the [[Contract Tool|contract tool]] and the [[Eiffel Editor|editor]].&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
Not all files are currently supported with user files, just a select number of configuration files and template files. For all new developments, user files should be supported if applicable.&lt;br /&gt;
&lt;br /&gt;
For now there is no support for those version of [[:Category:EiffelStudio|EiffelStudio]] built using the [[LinuxUnixLayout|Unix Layout]]. [[LinuxUnixLayout|Unix layouts]] distribute files across the system and prevent a clean and reliable means to replicate an [[:Category:EiffelStudio|EiffelStudio]] installation, required to detect and utilize user files.&lt;br /&gt;
&lt;br /&gt;
== Working with User Files ==&lt;br /&gt;
Most of the well know directories and files for the Eiffel compiler are located in a common class call &amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt;, which is part of the environment library found in the [[:Category:EiffelStudio|EiffelStudio]] framework folder at ''[[Environment Variables#Auxiliary Variables|$EIFFEL_SRC]]/framework/environment''. There are effective implementations of &amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt;; &amp;lt;e&amp;gt;EC_EIFFEL_LAYOUT&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;ES_EIFFEL_LAYOUT&amp;lt;/e&amp;gt; used respectively in the Eiffel compiler and [[:Category:EiffelStudio|EiffelStudio]].&lt;br /&gt;
&lt;br /&gt;
{{Note|These classes need a little refactoring because most of the accessor functions live in &amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt; instead of the more appropriate effective implementation class. It's just something to be aware in case of future changes.}}&lt;br /&gt;
&lt;br /&gt;
Most classes can access a single per-process instance of &amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt; through inheriting &amp;lt;e&amp;gt;EIFFEL_LAYOUT&amp;lt;/e&amp;gt; and accessing &amp;lt;e&amp;gt;eiffel_layout&amp;lt;/e&amp;gt;, or alternatively using it as a client. A single instance is used because (a) there are parts of the Eiffel system that have no idea if they are running inside the graphical [[:Category:EiffelStudio|EiffelStudio]] IDE or as a TTY compiler (b) there are performance overheads when initializing &amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt; so it's desirable to create and initialize the object once and once only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt; contains the two necessary functions to map an installation file or folder to a user file or folder; &amp;lt;e&amp;gt;user_priority_file_name&amp;lt;/e&amp;gt; and &amp;lt;e&amp;gt;user_priority_path&amp;lt;/e&amp;gt; for retrieving a user file location and a folder path respectively. These functions take an absolute path and return either an existing user based location, or &amp;lt;e&amp;gt;Void&amp;lt;/e&amp;gt; if no user specific file or folder was found.&lt;br /&gt;
&lt;br /&gt;
=== Implementing User File Replacement ===&lt;br /&gt;
&lt;br /&gt;
Here's an example of utilizing user files as found in &amp;lt;e&amp;gt;EIFFEL_ENV&amp;lt;/e&amp;gt;:&lt;br /&gt;
&amp;lt;e&amp;gt;&lt;br /&gt;
compiler_configuration: FILE_NAME&lt;br /&gt;
		-- Platform specific system level resource specification file&lt;br /&gt;
		-- ($ISE_EIFFEL/eifinit/application_name/spec/$ISE_PLATFORM)&lt;br /&gt;
	require&lt;br /&gt;
		is_valid_environment: is_valid_environment&lt;br /&gt;
	once&lt;br /&gt;
		create Result.make_from_string (eifinit_path)&lt;br /&gt;
		Result.set_file_name (&amp;quot;general&amp;quot;)&lt;br /&gt;
		Result.add_extension (&amp;quot;cfg&amp;quot;)&lt;br /&gt;
		if is_user_files_supported then&lt;br /&gt;
				-- Check user override file.&lt;br /&gt;
			if attached user_priority_file_name (Result, True) as l_user then&lt;br /&gt;
				Result := l_user&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	ensure&lt;br /&gt;
		not_result_is_empty: not Result.is_empty&lt;br /&gt;
	end&lt;br /&gt;
&amp;lt;/e&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the example the path to ''general.cfg'' is built, which will be the normal default file used from the installation. A check is done to ensure the notion of user files is supported and being so, a check to see if there is a user specific version under the user folder. In the event that there is a user ''general.cfg'' file then it will be taken over the installed ''general.cfg''. In the example above the first argument represents the string path to map to a specific user file and the second Boolean argument indicates if a user file name should only be returned if the file actually exist.&lt;br /&gt;
&lt;br /&gt;
The use of &amp;lt;e&amp;gt;user_priority_path&amp;lt;/e&amp;gt; is exactly the same way, but typically user folders are used to augment the contents of the respective installation folder instead of the replacing the content.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Category:Libraries&amp;diff=15358</id>
		<title>Category:Libraries</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Category:Libraries&amp;diff=15358"/>
				<updated>2016-01-21T12:18:56Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Created page with &amp;quot;Documentation about the Eiffel libraries not limited to the one included in Eiffel Studio.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Documentation about the Eiffel libraries not limited to the one included in Eiffel Studio.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15357</id>
		<title>Eiffel Breaking Changes</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Eiffel_Breaking_Changes&amp;diff=15357"/>
				<updated>2016-01-21T12:18:14Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Compiler]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
[[Category:Libraries]]&lt;br /&gt;
{{Warning|Article under development}}&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Exception_mechanism_internals&amp;diff=15356</id>
		<title>Exception mechanism internals</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Exception_mechanism_internals&amp;diff=15356"/>
				<updated>2016-01-21T12:17:52Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Exception]]&lt;br /&gt;
[[Category:Code Generation]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article documents exception handling mechanisms at implementation level, including runtime and code generation.&lt;br /&gt;
&lt;br /&gt;
== Typical execution/trace stack operation in a routine ==&lt;br /&gt;
Once or routine with old variable is slightly different.&lt;br /&gt;
See following pseudocode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
-- entry&lt;br /&gt;
&lt;br /&gt;
new_exset&lt;br /&gt;
	do&lt;br /&gt;
		-- eif_stack: Create a new vector EX_CALL on eif_stack.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if not setjmp then&lt;br /&gt;
&lt;br /&gt;
	-- Routine body&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
	exresc&lt;br /&gt;
&lt;br /&gt;
	do&lt;br /&gt;
&lt;br /&gt;
		-- eif_trace: Check the stack of eif_trace top element must be EN_FAIL or EN_RES&lt;br /&gt;
		&lt;br /&gt;
		-- eif_trace: Mark top node as rescued&lt;br /&gt;
&lt;br /&gt;
		-- eif_trace: Create new EN_ILVL item on eif_trace, indicating entering a new level&lt;br /&gt;
&lt;br /&gt;
		-- eif_stack: Create new EX_RESC vector on eif_stack.&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	Rescue_body&lt;br /&gt;
&lt;br /&gt;
		-- If there is retry clause, it calls &lt;br /&gt;
		&lt;br /&gt;
	exret&lt;br /&gt;
&lt;br /&gt;
	do&lt;br /&gt;
&lt;br /&gt;
		-- eif_stack: Check top vector of eif_stack is EX_RESC&lt;br /&gt;
&lt;br /&gt;
		-- eif_stack: Override top item of eif_stack with the vector of current routine (saved as local). Change the type of the vector to EX_RETY&lt;br /&gt;
&lt;br /&gt;
		-- eif_trace: Pop off eif_trace, which must be EN_ILVL item&lt;br /&gt;
&lt;br /&gt;
		-- eif_trace: unwind_trace, pop items from eif_trace until EN_ILVL item is found. Restore `exdata' at previous level.&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
		-- If no retry is called, call at the end:&lt;br /&gt;
		&lt;br /&gt;
	exfail&lt;br /&gt;
&lt;br /&gt;
	do&lt;br /&gt;
&lt;br /&gt;
		-- eif_stack: pop EX_RESC from eif_stack&lt;br /&gt;
&lt;br /&gt;
		-- eif_trace: pop EN_ILVL from eif_trace, leaving call failures created by `draise' on stack.&lt;br /&gt;
&lt;br /&gt;
		-- create last_exception (ROUTINE_FAILURE)&lt;br /&gt;
&lt;br /&gt;
		-- eif_stack: call `backtrack' which will pop eif_stack until find the top most jmpbuf.&lt;br /&gt;
&lt;br /&gt;
		-- Call longjmp with the found jmpbuf.&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
exok&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
&lt;br /&gt;
	-- eif_stack: Pop eif_stack until a EX_CALL, EX_RESC, EX_RETY or EX_OSTK is found and popped.&lt;br /&gt;
&lt;br /&gt;
	-- eif_trace: unwind_trace, pop item from eif_trace until we find EN_ILVL item. Restore `exdata' at previous level.&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Raise an exception (draise, eraise, com_raise, ) ==&lt;br /&gt;
&lt;br /&gt;
*  Create a new item on eif_trace, with the type the exception.&lt;br /&gt;
&lt;br /&gt;
*  Pop and push back eif_stack in order to get information. Fill those information into `exdata'.&lt;br /&gt;
&lt;br /&gt;
*  Setup information for top node in eif_trace.&lt;br /&gt;
&lt;br /&gt;
*  In make_exception, when building trace, traverse eif_stack, and push corresponding items into eif_trace, until jmp pointer is found. In the meantime, if the item is EX_RESC, we change it to EN_OLVL and put into eif_trace.&lt;br /&gt;
&lt;br /&gt;
*  Continue buidling trace from the rest element of eif_stack until root node is reached.&lt;br /&gt;
&lt;br /&gt;
*  Call `back_track' to really pop off items in eif_stack and call longjmp when the first jmp pointer is found.&lt;br /&gt;
&lt;br /&gt;
== System signal handler ==&lt;br /&gt;
&lt;br /&gt;
*  Push an EN_ILVL item on eif_trace&lt;br /&gt;
&lt;br /&gt;
*  Push an EX_HDLR item on eif_stack and setup a jmpbuf&lt;br /&gt;
&lt;br /&gt;
*  Call exception handler and be ready to longjmp back and call eraise to populate the exception.&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15355</id>
		<title>Exceptions as Objects</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Exceptions_as_Objects&amp;diff=15355"/>
				<updated>2016-01-21T12:17:41Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Exception]]&lt;br /&gt;
[[Category:Eiffel Language]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article describes many aspects of Exceptions as Objects (ECMA-367 8.26) which will be implemented in ISE Eiffel. All exceptions will be raised as objects which can be accessed by `last_exception'. Exceptions as objects are known as type EXCEPTION and its descendants. EXCEPTION_MANAGER is introduced to handle common exception class operations, i.e. catch, and ignore.&lt;br /&gt;
&lt;br /&gt;
This doc is from the original working version: http://docs.google.com/Doc?docid=dckspcv8_9htpfm4&amp;amp;hl=en&lt;br /&gt;
&lt;br /&gt;
== Exception class hierarchy ==&lt;br /&gt;
  {{Red|EXCEPTION}}&lt;br /&gt;
     {{Red|SYSTEM_EXCEPTION}}&lt;br /&gt;
        {{Red|MACHINE_EXCEPTION}}&lt;br /&gt;
           {{Red|OPERATING_SYSTEM_EXCEPTION}}&lt;br /&gt;
              {{Red|COM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_FAILURE}}&lt;br /&gt;
              {{Red|OPERATING_SYSTEM_SIGNAL_FAILURE}}&lt;br /&gt;
           {{Red|HARDWARE_EXCEPTION}}&lt;br /&gt;
              {{Red|FLOATING_POINT_FAILURE}}&lt;br /&gt;
        {{Red|EIFFEL_EXCEPTION}}&lt;br /&gt;
           {{Red|LANGUAGE_EXCEPTION}}&lt;br /&gt;
              {{Red|BAD_INSPECT_VALUE}}&lt;br /&gt;
              {{Red|VOID_TARGET}}&lt;br /&gt;
              {{Red|VOID_ASSIGNED_TO_EXPANDED}}&lt;br /&gt;
              {{Red|ROUTINE_FAILURE}}&lt;br /&gt;
              EIFFELSTUDIO_SPECIFIC_LANGUAGE_EXCEPTION&lt;br /&gt;
                 CREATE_ON_DEFERRED&lt;br /&gt;
                 ADDRESS_APPLIED_TO_MELTED_FEATURE&lt;br /&gt;
           {{Red|EIFFEL_RUNTIME_EXCEPTION}}&lt;br /&gt;
              NO_MORE_MEMORY&lt;br /&gt;
              DATA_EXCEPTION&lt;br /&gt;
                 IO_FAILURE&lt;br /&gt;
                 SERIALIZATION_FAILURE&lt;br /&gt;
                 MISMATCH_FAILURE&lt;br /&gt;
              EXTERNAL_FAILURE-- Only used for threads at the moment&lt;br /&gt;
              EIFFEL_RUNTIME_PANIC               &lt;br /&gt;
    {{Red|ASSERTION_VIOLATION}}&lt;br /&gt;
       {{Red|INVARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|PRECONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|POSTCONDITION_VIOLATION}}&lt;br /&gt;
       {{Red|CHECK_VIOLATION}}&lt;br /&gt;
       {{Red|VARIANT_VIOLATION}}&lt;br /&gt;
       {{Red|OLD_VIOLATION}}&lt;br /&gt;
       {{Red|LOOP_INVARIANT_VIOLATION}}&lt;br /&gt;
    {{Red|DEVELOPER_EXCEPTION}}&lt;br /&gt;
    {{Red|OBSOLETE_EXCEPTION}}     &lt;br /&gt;
       RESUMPTION_FAILURE Was RESUMPTION_FAILED.&lt;br /&gt;
       RESCUE_FAILURE --------- SHOULD NOT APPLY ANY MORE WITH ISO/ECMA, CHECK!!!&lt;br /&gt;
       EXCEPTION_IN_SIGNAL_HANDLER_FAILURE&lt;br /&gt;
&lt;br /&gt;
Classes in red plus EXCEPTION_MANAGER will be placed at base\elks\kernel\exceptions\.&lt;br /&gt;
The rests are ise specific.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Terminology'''&lt;br /&gt;
We use _EXCEPTION for intermediate nodes in the hierarchy; when we need a term in the leaves of the hierarchy we don't use EXCEPTION but&lt;br /&gt;
  &lt;br /&gt;
    * _VIOLATION for assertions (also used for ASSERTION_VIOLATION, an intermediate node)&lt;br /&gt;
    * _FAILURE otherwise&lt;br /&gt;
  &lt;br /&gt;
  This is consistent with Eiffel exception terminology since from the viewpoint of Eiffel these things have failed, for example a signal was not handled properly. The Eiffel runtime is causing an exception in the Eiffel code as a result, but the original event was a failure.  Hence SERIALIZATION_FAILURE etc.&lt;br /&gt;
&lt;br /&gt;
== Raise and catch an exception ==&lt;br /&gt;
&lt;br /&gt;
==== Catching an exception ====&lt;br /&gt;
All exceptions can possibly be caught. `is_caught' is set by default. Only the given type of exception is `ignore'd in EXCEPTION_MANAGER if possible, it hence is not caught.&lt;br /&gt;
The caught exception can be accessed by `last_exception'.&lt;br /&gt;
&lt;br /&gt;
==== Raising an exception ====&lt;br /&gt;
There are two types of exceptions concerning how an exception is raised.&lt;br /&gt;
* System raised&lt;br /&gt;
Exception raised through the runtime. Most exceptions of this type are predefine as classes in base library. i.e. assertion violations, no memory exceptions and routine failures.&lt;br /&gt;
* User raised&lt;br /&gt;
User raised exceptions are initialized by users and raised by explicit call of {EXCEPTION}.raise.&lt;br /&gt;
&lt;br /&gt;
Theoretically the runtime can raise any exceptions known. A user can only raise an EXCEPTION that is `is_raisable'. `is_raisable' is possible true only when the exception is of DEVELOPER_EXCEPTION. This means only raising a DEVELOPER_EXCEPTION or its descendant is guaranteed correct.&lt;br /&gt;
&lt;br /&gt;
== Ignoring, continuing an exception ==&lt;br /&gt;
&lt;br /&gt;
Quote from ECMA 8.26.12:&lt;br /&gt;
  It is possible, through routines of the Kernel Library class EXCEPTION, to ensure that exceptions of certain types be:&lt;br /&gt;
  &lt;br /&gt;
  * Ignored: lead to no change of non-exception semantics.&lt;br /&gt;
  * Continued: lead to execution of a programmer-specified routine, then to continuation of the execution according to non-exception semantics.&lt;br /&gt;
&lt;br /&gt;
An ignorable exception can be ignored. When an exception is ignored, the raising does nothing as if non-exception semantics.&lt;br /&gt;
What are the exceptions not ignorable?&lt;br /&gt;
&lt;br /&gt;
Related queries in EXCEPTION:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_ignored: BOOLEAN&lt;br /&gt;
is_caught: BOOLEAN&lt;br /&gt;
is_ignorable: BOOLEAN&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Related routines in EXCEPTION_MANAGER:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
catch (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
ignore (a_exception: TYPE [EXCEPTION]) &lt;br /&gt;
set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== `origin' VS `cause' ==&lt;br /&gt;
&lt;br /&gt;
* The origin of an exception is, among all exceptions that have so far been triggered but not handled, the most recent one that is not a ROUTINE_FAILURE. Because a ROUTINE_FAILURE is always the result of an exception of another kind, the `origin' is always defined.&lt;br /&gt;
&lt;br /&gt;
* The `cause' of an exception is only interesting in the case of an exception triggered in a rescue clause. In that case the exception is the result of incomplete handling of another exception (which might be a ROUTINE_FAILURE or any other kind). Then the `cause' is that other exception.&lt;br /&gt;
&lt;br /&gt;
* If an exception was not triggered in a rescue clause, its `cause' is the exception itself.&lt;br /&gt;
&lt;br /&gt;
== Exception at rescue clause ==&lt;br /&gt;
See the following diagram:&lt;br /&gt;
&lt;br /&gt;
[[Image:exception_in_rescue.png]]&lt;br /&gt;
&lt;br /&gt;
Exception e2 is kept as `cause' at d.f4 in which e3 is raised, and being called in rescue clause r2. In this case e3 is accessible by `last_exception' and e2 is accessible by `cause' of e3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;&lt;br /&gt;
A behavior should be clarified, that when an exception occurs deep in execution level of a rescue clause, `last_exception' is understood as &amp;quot;last unhandled exception&amp;quot;.&lt;br /&gt;
&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1. A new exception causes &amp;quot;last_exception&amp;quot; to be saved somewhere before&lt;br /&gt;
entering &amp;quot;rescue&amp;quot; clause. After that the new exception object is attached to&lt;br /&gt;
&amp;quot;last_exception&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
2. If an exception is not handled (there is no rescue clause or &amp;quot;retry&amp;quot; is not&lt;br /&gt;
performed), a new exception object &amp;quot;ROUTINE_FAILURE&amp;quot; is created, its attribute&lt;br /&gt;
&amp;quot;original_exception&amp;quot; is set to &amp;quot;last_exception&amp;quot;, and &amp;quot;last_exception&amp;quot; is set to&lt;br /&gt;
this new &amp;quot;ROUTINE_FAILURE&amp;quot; object.&lt;br /&gt;
&lt;br /&gt;
3. If an exception is handled (&amp;quot;retry&amp;quot; is executed), &amp;quot;last_exception&amp;quot; is attached&lt;br /&gt;
a value saved in step 1.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
If &amp;quot;last_exception&amp;quot; in the following code snippet is modified&lt;br /&gt;
by the call to feature &amp;quot;h&amp;quot; that raises an exception internally and handles it?&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
        rescue&lt;br /&gt;
                -- &amp;quot;last_exception&amp;quot; is set to &amp;quot;X&amp;quot;.&lt;br /&gt;
                -- Call feature that raises exception &amp;quot;Y&amp;quot;, but handles it.&lt;br /&gt;
            h&lt;br /&gt;
&lt;br /&gt;
                -- Is &amp;quot;last_exception&amp;quot; set to &amp;quot;X&amp;quot; or to &amp;quot;Y&amp;quot;?&lt;br /&gt;
                -- The answer is X.&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OLD_VIOLATION ==&lt;br /&gt;
&lt;br /&gt;
OLD_VIOLATION behaves similarly with ROUTINE_FAILURE. In other words, OLD_VIOLATION is never a &amp;quot;root&amp;quot; exception of an exception chain. According to ECMA 8.26.11, OLD_VIOLATION should be treated as a &amp;quot;root&amp;quot; exception. But I believe it is more interesting to know the cause (original exception) of the old voilation. This will be clarified soon.&lt;br /&gt;
&lt;br /&gt;
== Class ANY ==&lt;br /&gt;
This is now done in EXCEPTION_MANAGER.&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
feature -- Exception&lt;br /&gt;
&lt;br /&gt;
    frozen last_exception: EXCEPTION&lt;br /&gt;
            -- Last exception&lt;br /&gt;
        external&lt;br /&gt;
            &amp;quot;built_in&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
deferred class interface&lt;br /&gt;
	EXCEPTION&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	code: INTEGER_32&lt;br /&gt;
			-- Code of the exception.&lt;br /&gt;
			-- |Maybe we don't need this anymore&lt;br /&gt;
&lt;br /&gt;
	exception_trace: STRING_8&lt;br /&gt;
			-- String representation of current exception trace&lt;br /&gt;
&lt;br /&gt;
	meaning: STRING_8&lt;br /&gt;
			-- A message in English describing what `except' is&lt;br /&gt;
&lt;br /&gt;
	message: STRING_8&lt;br /&gt;
			-- Tag of current exception&lt;br /&gt;
&lt;br /&gt;
	original: EXCEPTION&lt;br /&gt;
			-- Original exception that triggered current exception&lt;br /&gt;
&lt;br /&gt;
	cause: EXCEPTION&lt;br /&gt;
			-- Unhandled exception before current exception was triggered in a rescue clause&lt;br /&gt;
&lt;br /&gt;
	recipient_name: STRING_8&lt;br /&gt;
			-- Name of the routine whose execution was&lt;br /&gt;
			-- interrupted by current exception&lt;br /&gt;
&lt;br /&gt;
	type_name: STRING_8&lt;br /&gt;
			-- Name of the class that includes the recipient&lt;br /&gt;
			-- of original form of current exception&lt;br /&gt;
	&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught: BOOLEAN&lt;br /&gt;
			-- If set, exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught_implies_is_ignorable: not Result implies is_ignorable&lt;br /&gt;
			not_is_ignored: not is_ignored&lt;br /&gt;
&lt;br /&gt;
	is_ignorable: BOOLEAN&lt;br /&gt;
			-- Is current exception ignorable?&lt;br /&gt;
&lt;br /&gt;
	is_ignored: BOOLEAN&lt;br /&gt;
			-- If set, no exception is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_implies_is_ignorable: Result implies is_ignorable&lt;br /&gt;
			not_is_caught: not is_caught&lt;br /&gt;
&lt;br /&gt;
	is_raisable: BOOLEAN&lt;br /&gt;
			-- Is current exception raisable by raise?&lt;br /&gt;
	&lt;br /&gt;
feature -- Raise&lt;br /&gt;
&lt;br /&gt;
	raise&lt;br /&gt;
			-- Raise current exception&lt;br /&gt;
		require&lt;br /&gt;
			is_raisable: is_raisable&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Class EXCEPTION_MANAGER ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class interface&lt;br /&gt;
	EXCEPTION_MANAGER&lt;br /&gt;
&lt;br /&gt;
create &lt;br /&gt;
	default_create&lt;br /&gt;
&lt;br /&gt;
feature -- Access&lt;br /&gt;
&lt;br /&gt;
	frozen last_exception: EXCEPTION&lt;br /&gt;
			-- Last exception&lt;br /&gt;
&lt;br /&gt;
feature -- Status report&lt;br /&gt;
&lt;br /&gt;
	is_caught (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	is_ignorable (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is ignorable.&lt;br /&gt;
&lt;br /&gt;
	is_ignored (a_exception: TYPE [EXCEPTION]): BOOLEAN&lt;br /&gt;
			-- If set, type of `a_exception' is not raised.&lt;br /&gt;
		ensure&lt;br /&gt;
			not_is_caught: not is_caught (a_exception)&lt;br /&gt;
	&lt;br /&gt;
feature -- Status setting&lt;br /&gt;
&lt;br /&gt;
	catch (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Set type of `a_exception' is_ignored.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored: not is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	ignore (a_exception: TYPE [EXCEPTION])&lt;br /&gt;
			-- Make sure that any exception of code `code' will be&lt;br /&gt;
			-- ignored. This is not the default.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			is_ignorable: is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_caught: is_ignored (a_exception)&lt;br /&gt;
&lt;br /&gt;
	set_is_ignored (a_exception: TYPE [EXCEPTION]; a_ignored: BOOLEAN)&lt;br /&gt;
			-- Set type of `a_exception' to be `a_ignored'.&lt;br /&gt;
		require&lt;br /&gt;
			a_exception_not_void: a_exception /= Void&lt;br /&gt;
			a_ignored_implies_is_ignorable: a_ignored implies is_ignorable (a_exception)&lt;br /&gt;
		ensure&lt;br /&gt;
			is_ignored_set: is_ignored (a_exception) = a_ignored&lt;br /&gt;
	&lt;br /&gt;
end -- class EXCEPTION_MANAGER&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default rescue ==&lt;br /&gt;
As specified in ECMA, `default_rescue' in ANY or its descendant is called as unqualified when an internal routine or an attributes with no rescue clause fails.&lt;br /&gt;
We choose not to invoke it when it is not redefined, or this will be too expensive.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class ANY&lt;br /&gt;
...&lt;br /&gt;
    default_rescue&lt;br /&gt;
       do&lt;br /&gt;
       end&lt;br /&gt;
...&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample code: Raising and catching developer exception ==&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    MY_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    DEVELOPER_EXCEPTION&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    A&lt;br /&gt;
&lt;br /&gt;
feature&lt;br /&gt;
&lt;br /&gt;
    f&lt;br /&gt;
        local&lt;br /&gt;
            retried: BOOLEAN&lt;br /&gt;
        do&lt;br /&gt;
            if not retried then&lt;br /&gt;
                my_exception.raise   -- Raise user-defined exception.&lt;br /&gt;
            end&lt;br /&gt;
        rescue&lt;br /&gt;
            if last_exception = my_exception then   -- Check the exception object was the one user defined.&lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    my_exception: MY_EXCEPTION&lt;br /&gt;
        once&lt;br /&gt;
            create Result&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;br /&gt;
&amp;lt;eiffel&amp;gt;&lt;br /&gt;
class&lt;br /&gt;
    APPLICATION&lt;br /&gt;
&lt;br /&gt;
inherit&lt;br /&gt;
    A&lt;br /&gt;
&lt;br /&gt;
create&lt;br /&gt;
    make&lt;br /&gt;
&lt;br /&gt;
feature -- Initialization&lt;br /&gt;
&lt;br /&gt;
    make&lt;br /&gt;
            -- Run application.&lt;br /&gt;
        local&lt;br /&gt;
            a: A&lt;br /&gt;
            retried: BOOLEAN&lt;br /&gt;
        do&lt;br /&gt;
            if not retried then&lt;br /&gt;
                create a&lt;br /&gt;
                a.f&lt;br /&gt;
            end&lt;br /&gt;
        rescue&lt;br /&gt;
            retried := True&lt;br /&gt;
                &lt;br /&gt;
            -- `last_exception' is an object of ROUTINE_FAILURE?&lt;br /&gt;
            if attached {ROUTINE_FAILURE} (create {EXCEPTION_MANAGER}).last_exception as l_exception then&lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
                &lt;br /&gt;
            -- `original' exception is the one caused `last_exception'?&lt;br /&gt;
            if last_exception.original = my_exception then   &lt;br /&gt;
                print (&amp;quot;True&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            else&lt;br /&gt;
                print (&amp;quot;False&amp;quot; + &amp;quot;%N&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
            retry&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
end -- class APPLICATION&lt;br /&gt;
&amp;lt;/eiffel&amp;gt;&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	<entry>
		<id>https://dev.eiffel.com/index.php?title=Category:Eiffel_Language&amp;diff=15354</id>
		<title>Category:Eiffel Language</title>
		<link rel="alternate" type="text/html" href="https://dev.eiffel.com/index.php?title=Category:Eiffel_Language&amp;diff=15354"/>
				<updated>2016-01-21T12:17:20Z</updated>
		
		<summary type="html">&lt;p&gt;Manus: Manus moved page Category:Language to Category:Eiffel Language without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;All documentation related to the Eiffel language&lt;/div&gt;</summary>
		<author><name>Manus</name></author>	</entry>

	</feed>