<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.liberty-eiffel.org/index.php?action=history&amp;feed=atom&amp;title=C_code_generation</id>
	<title>C code generation - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.liberty-eiffel.org/index.php?action=history&amp;feed=atom&amp;title=C_code_generation"/>
	<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;action=history"/>
	<updated>2026-04-14T04:13:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2585&amp;oldid=prev</id>
		<title>Hzwakenberg: /* Recovering from exceptions */</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2585&amp;oldid=prev"/>
		<updated>2018-08-30T19:55:16Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Recovering from exceptions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:55, 30 August 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 200:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 200:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The last line of the block describes the standard behaviour of propagating the routine failure if a rescue block ends without running a retry statement.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The last line of the block describes the standard behaviour of propagating the routine failure if a rescue block ends without running a retry statement.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;After the rescue section at the beginning of the routine there is a C label called &amp;lt;code&amp;gt;retry_tag:&amp;lt;/code&amp;gt;; the '''retry''' statement is implemented as a &amp;lt;code&amp;gt;goto retry_tag;&amp;lt;/code&amp;gt;. Note that this means that &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SE&lt;/del&gt; is unable to retry from outside the routine (and the compiler actually checks that a retry statement is inside a rescue clause); this is a bit different to other Eiffel variants which allow retry instructions anywhere. Precondition checking is after this tag, so the check is actually done again if the rescue clause retries.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;After the rescue section at the beginning of the routine there is a C label called &amp;lt;code&amp;gt;retry_tag:&amp;lt;/code&amp;gt;; the '''retry''' statement is implemented as a &amp;lt;code&amp;gt;goto retry_tag;&amp;lt;/code&amp;gt;. Note that this means that &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Liberty&lt;/ins&gt; is unable to retry from outside the routine (and the compiler actually checks that a retry statement is inside a rescue clause); this is a bit different to other Eiffel variants which allow retry instructions anywhere. Precondition checking is after this tag, so the check is actually done again if the rescue clause retries.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;After precondition checking, the rescue context is actually added to the stack context (which means that a precondition failure will trigger an outer rescue clause, not the rescue clause of the same routine with the rescue handler. The initialization looks like:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;After precondition checking, the rescue context is actually added to the stack context (which means that a precondition failure will trigger an outer rescue clause, not the rescue clause of the same routine with the rescue handler. The initialization looks like:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2584&amp;oldid=prev</id>
		<title>Hzwakenberg: /* Recovering from exceptions */</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2584&amp;oldid=prev"/>
		<updated>2018-08-30T19:42:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Recovering from exceptions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:42, 30 August 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 183:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 183:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When the program passes through a routine with a rescue handler, the information about the handler is added to a stack. When exiting one of those routines, the top of that stack is removed. The internal handlers know whether there is some rescue clause to catch the exception or not by looking if the stack is empty.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When the program passes through a routine with a rescue handler, the information about the handler is added to a stack. When exiting one of those routines, the top of that stack is removed. The internal handlers know whether there is some rescue clause to catch the exception or not by looking if the stack is empty.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The stack is implemented as a linked list of nodes stored locally, at the stack frames of routines with rescue clauses. The top of the stack is pointed by a global variable &amp;lt;code&amp;gt;rescue_context_top&amp;lt;/code&amp;gt;, set to NULL when the stack is empty. Each node of the rescue stack is of type &amp;lt;code&amp;gt;rescue_context&amp;lt;/code&amp;gt;, a structure containing the following fields:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The stack is implemented as a linked list of nodes stored locally, at the stack frames of routines with rescue clauses. The top of the stack is pointed&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; to&lt;/ins&gt; by a global variable &amp;lt;code&amp;gt;rescue_context_top&amp;lt;/code&amp;gt;, set to NULL when the stack is empty. Each node of the rescue stack is of type &amp;lt;code&amp;gt;rescue_context&amp;lt;/code&amp;gt;, a structure containing the following fields:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;jb&amp;lt;/code&amp;gt;, a jump buffer returned by the C function setjmp, which is used to jump back to the routine when handling the exception.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;jb&amp;lt;/code&amp;gt;, a jump buffer returned by the C function setjmp, which is used to jump back to the routine when handling the exception.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, a pointer to the rescue context below, or NULL when we are at the bottom of the stack.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, a pointer to the rescue context below, or NULL when we are at the bottom of the stack.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 197:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 197:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This will set the jump buffer, so the body of the rescue clause is executed after a longjmp (which will happen &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;on&lt;/del&gt; the event of an exception).&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This will set the jump buffer, so the body of the rescue clause is executed after a longjmp (which will happen &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;in&lt;/ins&gt; the event of an exception).&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The last line of the block describes the standard behaviour of propagating the routine failure if a rescue block ends without running a retry statement.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The last line of the block describes the standard behaviour of propagating the routine failure if a rescue block ends without running a retry statement.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2583&amp;oldid=prev</id>
		<title>Hzwakenberg: /* Encoding source positions */</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2583&amp;oldid=prev"/>
		<updated>2018-08-30T19:39:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Encoding source positions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:39, 30 August 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 173:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 173:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There are macros to decode positions in the &amp;lt;tt&amp;gt;no_check.h&amp;lt;/tt&amp;gt; runtime header. They are used when printing tracebacks and error messages. The macros are called &amp;lt;code&amp;gt;se_position2*&amp;lt;/code&amp;gt;. The mangling, in the compiler, is defined in the [[tool_class:POSITION|&amp;lt;tt&amp;gt;POSITION&amp;lt;/tt&amp;gt;]] class.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There are macros to decode positions in the &amp;lt;tt&amp;gt;no_check.h&amp;lt;/tt&amp;gt; runtime header. They are used when printing tracebacks and error messages. The macros are called &amp;lt;code&amp;gt;se_position2*&amp;lt;/code&amp;gt;. The mangling, in the compiler, is defined in the [[tool_class:POSITION|&amp;lt;tt&amp;gt;POSITION&amp;lt;/tt&amp;gt;]] class.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;File ids are actually the same number as type ids. A globally allocated array &amp;lt;code&amp;gt;char *p[N]&amp;lt;/code&amp;gt; is declared by the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;compilers&lt;/del&gt; where &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; is the highest type id. The routine &amp;lt;tt&amp;gt;initialize_eiffel_runtime&amp;lt;/tt&amp;gt; assigns initial values to the elements of this array, in the style of &amp;lt;code&amp;gt;p[7]=&quot;/usr/lib/SmartEiffel/lib/string/string.e&quot;;&amp;lt;/code&amp;gt;. Some assignments are also done aliasing the strings, for example &amp;lt;code&amp;gt;p[99]=p[88];&amp;lt;/code&amp;gt; this happens when 99 and 88 are ids of two types which are actually based on the same class (due to genericity).&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;File ids are actually the same number as type ids. A globally allocated array &amp;lt;code&amp;gt;char *p[N]&amp;lt;/code&amp;gt; is declared by the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;compiler&lt;/ins&gt; where &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; is the highest type id. The routine &amp;lt;tt&amp;gt;initialize_eiffel_runtime&amp;lt;/tt&amp;gt; assigns initial values to the elements of this array, in the style of &amp;lt;code&amp;gt;p[7]=&quot;/usr/lib/SmartEiffel/lib/string/string.e&quot;;&amp;lt;/code&amp;gt;. Some assignments are also done aliasing the strings, for example &amp;lt;code&amp;gt;p[99]=p[88];&amp;lt;/code&amp;gt; this happens when 99 and 88 are ids of two types which are actually based on the same class (due to genericity).&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;On&lt;/del&gt; the generated C code, you will find a lot of encoded positions. Each time the compiler generates code for a piece of Eiffel source at a distinct position, an assignment &amp;lt;code&amp;gt;ds.p=0x&amp;lt;encoded&amp;gt;;&amp;lt;/code&amp;gt; is inserted (usually with a human readable comment like &amp;lt;code&amp;gt;/*l133c5/string.e*/&amp;lt;/code&amp;gt;). The assignment modifies the status of the current dump stack frame (see [[#The managed stack|previous section]]); in that way, if an exception triggers, there is detailed information about the source code positions for each of the routines in the stack.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;In&lt;/ins&gt; the generated C code, you will find a lot of encoded positions. Each time the compiler generates code for a piece of Eiffel source at a distinct position, an assignment &amp;lt;code&amp;gt;ds.p=0x&amp;lt;encoded&amp;gt;;&amp;lt;/code&amp;gt; is inserted (usually with a human readable comment like &amp;lt;code&amp;gt;/*l133c5/string.e*/&amp;lt;/code&amp;gt;). The assignment modifies the status of the current dump stack frame (see [[#The managed stack|previous section]]); in that way, if an exception triggers, there is detailed information about the source code positions for each of the routines in the stack.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Recovering from exceptions ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Recovering from exceptions ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2582&amp;oldid=prev</id>
		<title>Hzwakenberg: /* The managed stack */</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2582&amp;oldid=prev"/>
		<updated>2018-08-30T19:03:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;The managed stack&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 21:03, 30 August 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 138:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 138:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== The managed stack ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== The managed stack ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Even if not required for implementing the rescue construct, Liberty Eiffel implements a &quot;managed stack&quot;. This managed stack consists &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;on&lt;/del&gt; extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Even if not required for implementing the rescue construct, Liberty Eiffel implements a &quot;managed stack&quot;. This managed stack consists &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;of&lt;/ins&gt; extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. Liberty Eiffel adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. Liberty Eiffel adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2576&amp;oldid=prev</id>
		<title>Hzwakenberg: /* The managed stack */</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2576&amp;oldid=prev"/>
		<updated>2018-08-29T11:03:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;The managed stack&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:03, 29 August 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 158:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 158:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SmartEiffel&lt;/del&gt; dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Liberty Eiffel&lt;/ins&gt; dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:call chain.svg|center]]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:call chain.svg|center]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2513&amp;oldid=prev</id>
		<title>Dkearns: s/LibertyEiffel/Liberty Eiffel/</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=2513&amp;oldid=prev"/>
		<updated>2016-07-02T10:09:39Z</updated>

		<summary type="html">&lt;p&gt;s/LibertyEiffel/Liberty Eiffel/&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:09, 2 July 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Generated files ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Generated files ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When [[Compile to c|compiling to C]], &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/del&gt; generates the following output:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When [[Compile to c|compiling to C]], &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Liberty Eiffel&lt;/ins&gt; generates the following output:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* One or more C files&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* One or more C files&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 14:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 14:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/del&gt; runtime (i.e., auxiliar routines to handle some mechanisms like garbage collection, exceptions, etc) and plugins are not linked, but embedded instead. That means that the code for those components will be embedded inside the .c/.h files. The runtime files are located in the &amp;lt;code&amp;gt;sys/runtime/c&amp;lt;/code&amp;gt; directory of the compiler distribution. For example when compiling with the GC enabled, the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.c&amp;lt;/code&amp;gt; is copied verbatim into one of the generated ''projectN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; and the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.h&amp;lt;/code&amp;gt; is copied verbatim into the ''projectN''&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Liberty Eiffel&lt;/ins&gt; runtime (i.e., auxiliar routines to handle some mechanisms like garbage collection, exceptions, etc) and plugins are not linked, but embedded instead. That means that the code for those components will be embedded inside the .c/.h files. The runtime files are located in the &amp;lt;code&amp;gt;sys/runtime/c&amp;lt;/code&amp;gt; directory of the compiler distribution. For example when compiling with the GC enabled, the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.c&amp;lt;/code&amp;gt; is copied verbatim into one of the generated ''projectN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; and the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.h&amp;lt;/code&amp;gt; is copied verbatim into the ''projectN''&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Mapping types to IDs ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Mapping types to IDs ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 138:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 138:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== The managed stack ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== The managed stack ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Even if not required for implementing the rescue construct, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/del&gt; implements a &quot;managed stack&quot;. This managed stack consists on extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Even if not required for implementing the rescue construct, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Liberty Eiffel&lt;/ins&gt; implements a &quot;managed stack&quot;. This managed stack consists on extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/del&gt; adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Liberty Eiffel&lt;/ins&gt; adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* which routine is the one corresponding to that frame&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* which routine is the one corresponding to that frame&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* where are the locals and arguments located in the stack&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* where are the locals and arguments located in the stack&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 158:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 158:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/del&gt; dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SmartEiffel&lt;/ins&gt; dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:call chain.svg|center]]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:call chain.svg|center]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dkearns</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=1926&amp;oldid=prev</id>
		<title>Hzwakenberg: /* Generated files */</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=1926&amp;oldid=prev"/>
		<updated>2014-09-06T21:03:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Generated files&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:03, 6 September 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 10:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 10:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* A C compilation script (''projectname''&amp;lt;tt&amp;gt;.make&amp;lt;/tt&amp;gt; or ''projectname''&amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt; depending on the platform).&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* A C compilation script (''projectname''&amp;lt;tt&amp;gt;.make&amp;lt;/tt&amp;gt; or ''projectname''&amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt; depending on the platform).&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are using the &amp;lt;code&amp;gt;-no_split&amp;lt;/code&amp;gt; mode, all the C code will be put inside a ''projectname''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; file. Otherwise, code will be split in chunks (of more or less the same size) called ''projectnameN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt;, where ''N'' is a positive integer number. The number of chunks may vary depending on the size of the project&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. The policy for splitting files will probably change in SE 2.4&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are using the &amp;lt;code&amp;gt;-no_split&amp;lt;/code&amp;gt; mode, all the C code will be put inside a ''projectname''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; file. Otherwise, code will be split in chunks (of more or less the same size) called ''projectnameN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt;, where ''N'' is a positive integer number. The number of chunks may vary depending on the size of the project.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=1877&amp;oldid=prev</id>
		<title>Hzwakenberg at 17:45, 5 September 2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=1877&amp;oldid=prev"/>
		<updated>2014-09-05T17:45:06Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 19:45, 5 September 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Smarteiffel]]&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty&quot;&gt;&amp;#160;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= General aspects =&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= General aspects =&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Generated files ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Generated files ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When [[Compile to c|compiling to C]], &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SmartEiffel&lt;/del&gt; generates the following output:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;When [[Compile to c|compiling to C]], &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/ins&gt; generates the following output:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* One or more C files&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* One or more C files&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 15:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 14:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SmartEiffel&lt;/del&gt; runtime (i.e., auxiliar routines to handle some mechanisms like garbage collection, exceptions, etc) and plugins are not linked, but embedded instead. That means that the code for those components will be embedded inside the .c/.h files. The runtime files are located in the &amp;lt;code&amp;gt;sys/runtime/c&amp;lt;/code&amp;gt; directory of the compiler distribution. For example when compiling with the GC enabled, the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.c&amp;lt;/code&amp;gt; is copied verbatim into one of the generated ''projectN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; and the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.h&amp;lt;/code&amp;gt; is copied verbatim into the ''projectN''&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/ins&gt; runtime (i.e., auxiliar routines to handle some mechanisms like garbage collection, exceptions, etc) and plugins are not linked, but embedded instead. That means that the code for those components will be embedded inside the .c/.h files. The runtime files are located in the &amp;lt;code&amp;gt;sys/runtime/c&amp;lt;/code&amp;gt; directory of the compiler distribution. For example when compiling with the GC enabled, the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.c&amp;lt;/code&amp;gt; is copied verbatim into one of the generated ''projectN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; and the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.h&amp;lt;/code&amp;gt; is copied verbatim into the ''projectN''&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Mapping types to IDs ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Mapping types to IDs ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 139:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 138:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== The managed stack ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== The managed stack ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Even if not required for implementing the rescue construct, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SmartEiffel&lt;/del&gt; implements a &quot;managed stack&quot;. This managed stack consists on extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Even if not required for implementing the rescue construct, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/ins&gt; implements a &quot;managed stack&quot;. This managed stack consists on extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SmartEiffel&lt;/del&gt; adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/ins&gt; adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* which routine is the one corresponding to that frame&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* which routine is the one corresponding to that frame&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* where are the locals and arguments located in the stack&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* where are the locals and arguments located in the stack&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 159:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 158:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;smarteiffel&lt;/del&gt; dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;LibertyEiffel&lt;/ins&gt; dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:call chain.svg|center]]&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image:call chain.svg|center]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 176:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 175:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;File ids are actually the same number as type ids. A globally allocated array &amp;lt;code&amp;gt;char *p[N]&amp;lt;/code&amp;gt; is declared by the compilers where &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; is the highest type id. The routine &amp;lt;tt&amp;gt;initialize_eiffel_runtime&amp;lt;/tt&amp;gt; assigns initial values to the elements of this array, in the style of &amp;lt;code&amp;gt;p[7]=&quot;/usr/lib/SmartEiffel/lib/string/string.e&quot;;&amp;lt;/code&amp;gt;. Some assignments are also done aliasing the strings, for example &amp;lt;code&amp;gt;p[99]=p[88];&amp;lt;/code&amp;gt; this happens when 99 and 88 are ids of two types which are actually based on the same class (due to genericity).&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;File ids are actually the same number as type ids. A globally allocated array &amp;lt;code&amp;gt;char *p[N]&amp;lt;/code&amp;gt; is declared by the compilers where &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; is the highest type id. The routine &amp;lt;tt&amp;gt;initialize_eiffel_runtime&amp;lt;/tt&amp;gt; assigns initial values to the elements of this array, in the style of &amp;lt;code&amp;gt;p[7]=&quot;/usr/lib/SmartEiffel/lib/string/string.e&quot;;&amp;lt;/code&amp;gt;. Some assignments are also done aliasing the strings, for example &amp;lt;code&amp;gt;p[99]=p[88];&amp;lt;/code&amp;gt; this happens when 99 and 88 are ids of two types which are actually based on the same class (due to genericity).&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;−&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;On the generated C code, you will find a lot of encoded positions. Each &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;times&lt;/del&gt; the compiler generates code for a piece of Eiffel source at a distinct position, an assignment &amp;lt;code&amp;gt;ds.p=0x&amp;lt;encoded&amp;gt;;&amp;lt;/code&amp;gt; is inserted (usually with a human readable comment like &amp;lt;code&amp;gt;/*l133c5/string.e*/&amp;lt;/code&amp;gt;). The assignment modifies the status of the current dump stack frame (see [[#The managed stack|previous section]]); in that way, if an exception triggers, there is detailed information about the source code positions for each of the routines in the stack.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;On the generated C code, you will find a lot of encoded positions. Each &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;time&lt;/ins&gt; the compiler generates code for a piece of Eiffel source at a distinct position, an assignment &amp;lt;code&amp;gt;ds.p=0x&amp;lt;encoded&amp;gt;;&amp;lt;/code&amp;gt; is inserted (usually with a human readable comment like &amp;lt;code&amp;gt;/*l133c5/string.e*/&amp;lt;/code&amp;gt;). The assignment modifies the status of the current dump stack frame (see [[#The managed stack|previous section]]); in that way, if an exception triggers, there is detailed information about the source code positions for each of the routines in the stack.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Recovering from exceptions ==&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Recovering from exceptions ==&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hzwakenberg</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=1579&amp;oldid=prev</id>
		<title>Ramack at 21:13, 4 March 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=1579&amp;oldid=prev"/>
		<updated>2013-03-04T21:13:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:13, 4 March 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;+&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Smarteiffel]]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= General aspects =&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;= General aspects =&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&amp;#160;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ramack</name></author>
	</entry>
	<entry>
		<id>https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=84&amp;oldid=prev</id>
		<title>Ramack: 27 revisions:&amp;#32;initial import from SamrtEiffel Wiki - The Grand SmartEiffel Book</title>
		<link rel="alternate" type="text/html" href="https://wiki.liberty-eiffel.org/index.php?title=C_code_generation&amp;diff=84&amp;oldid=prev"/>
		<updated>2013-03-03T21:04:26Z</updated>

		<summary type="html">&lt;p&gt;27 revisions: initial import from SamrtEiffel Wiki - The Grand SmartEiffel Book&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= General aspects =&lt;br /&gt;
&lt;br /&gt;
== Generated files ==&lt;br /&gt;
&lt;br /&gt;
When [[Compile to c|compiling to C]], SmartEiffel generates the following output:&lt;br /&gt;
&lt;br /&gt;
* One or more C files&lt;br /&gt;
* A C header file, ''projectname''&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* A type-to-id mapping file (see [[#Mapping types to IDs]] section below).&lt;br /&gt;
* A C compilation script (''projectname''&amp;lt;tt&amp;gt;.make&amp;lt;/tt&amp;gt; or ''projectname''&amp;lt;tt&amp;gt;.bat&amp;lt;/tt&amp;gt; depending on the platform).&lt;br /&gt;
&lt;br /&gt;
If you are using the &amp;lt;code&amp;gt;-no_split&amp;lt;/code&amp;gt; mode, all the C code will be put inside a ''projectname''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; file. Otherwise, code will be split in chunks (of more or less the same size) called ''projectnameN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt;, where ''N'' is a positive integer number. The number of chunks may vary depending on the size of the project. The policy for splitting files will probably change in SE 2.4.&lt;br /&gt;
&lt;br /&gt;
The compilation script will contain a list of commands to invoke the system C compiler and compile the relevant files with the proper flags (extracted from the command line, ACE file and/or [[Plugins|plugin]] options). It will only include compile commands for those C files which have no associated object file, or that have changed since the previous compilation. It will also contain a final linking command (to generate the executable) when any of the relevant C flags has changed.&lt;br /&gt;
&lt;br /&gt;
The SmartEiffel runtime (i.e., auxiliar routines to handle some mechanisms like garbage collection, exceptions, etc) and plugins are not linked, but embedded instead. That means that the code for those components will be embedded inside the .c/.h files. The runtime files are located in the &amp;lt;code&amp;gt;sys/runtime/c&amp;lt;/code&amp;gt; directory of the compiler distribution. For example when compiling with the GC enabled, the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.c&amp;lt;/code&amp;gt; is copied verbatim into one of the generated ''projectN''&amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; and the file &amp;lt;code&amp;gt;sys/runtime/c/gc_lib.h&amp;lt;/code&amp;gt; is copied verbatim into the ''projectN''&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Mapping types to IDs ==&lt;br /&gt;
&lt;br /&gt;
When compiling to C, every type existing in the system is assigned an ''id'', which is a unique positive integer number. This number is used in different parts of the C code instead of the actual type name. For example if the type ''STRING'' is assigned id 7, the feature is_equal of type ''STRING'' will be mapped to a C routine called &amp;lt;tt&amp;gt;r7is_equal&amp;lt;/tt&amp;gt; (the 7 in the name comes from the type id).&lt;br /&gt;
&lt;br /&gt;
Note that ids are assigned to types and not to classes. Most of the time there is one type per class, but there can be possibly more types per class. For example, even if [[library_class:ARRAY|&amp;lt;tt&amp;gt;ARRAY&amp;lt;/tt&amp;gt;]] is a single class, ''ARRAY[INTEGER]'' and ''ARRAY[STRING]'' are distinct types, and as such will get different ids.&lt;br /&gt;
&lt;br /&gt;
A few of the types based on  library classes (all ''INTEGER*'', ''REAL*'', ''CHARACTER'', ''BOOLEAN'', ''POINTER'', ''NATIVE_ARRAY[CHARACTER]'' and ''STRING'') have a predefined, fixed id. For details on implementation of this fixed mapping, check the [[tool_class:ID_PROVIDER|&amp;lt;tt&amp;gt;ID_PROVIDER&amp;lt;/tt&amp;gt;]] class, specially feature &amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After compilation, the mapping of types to ids is stored in a text file called ''project''&amp;lt;tt&amp;gt;.id&amp;lt;/tt&amp;gt;. This file is a useful help to read the generated C code. It is also used by the compiler itself when recompiling; the compiler uses it to keep the mapping between different runs. Maintaining the mapping helps to get similar generated code between compiler runs, which means that fewer C files need to be recompiled.&lt;br /&gt;
&lt;br /&gt;
= Mapping Eiffel types to C types =&lt;br /&gt;
&lt;br /&gt;
Not every type needs a direct C implementation. A lot of types are never instantiated, because they are deferred or just because the system never creates an instance of them. Types which are effectively used in the system are called &amp;quot;live&amp;quot; types. For each live type with id ''N'', a C type is created called &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;''N''. For some of the standard base types, the definition of the type is hardcoded in the compiler; for example, in your project &amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt;  file you will find:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;typedef int32_t T2&amp;lt;/code&amp;gt; (&amp;quot;2&amp;quot; is the id for ''INTEGER'')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;typedef double T5&amp;lt;/code&amp;gt; (&amp;quot;5&amp;quot; is the id for ''REAL_64'')&lt;br /&gt;
&lt;br /&gt;
For references (which might be polymorphic), the C type &amp;lt;code&amp;gt;T0&amp;lt;/code&amp;gt; is defined, and references are of type &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For most other live types, a C struct is used, where fields of the struct correspond to the attributes (proper and inherited) of the type. The struct of the type is called &amp;lt;code&amp;gt;struct S&amp;lt;/code&amp;gt;''N''. For example, if the type &amp;lt;tt&amp;gt;STD_OUTPUT&amp;lt;/tt&amp;gt; has id 38, you will get the following code in the &amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct S38 T38;&lt;br /&gt;
/* ... */&lt;br /&gt;
struct S38{Tid id;T0* _filter;T2 _buffer_position;T9 _buffer;T2 _capacity;};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that each field has the corresponding field name on Eiffel, preceded by an underscore (to avoid possible name clashes with C keywords, for example if you have a class with some field called &amp;quot;static&amp;quot; or &amp;quot;int&amp;quot;). The type of the field has the corresponding C type if the field is expanded: you can see in the struct above that the attribute &amp;lt;code&amp;gt;buffer_position&amp;lt;/code&amp;gt; was declared as [[library_class:INTEGER_32|&amp;lt;tt&amp;gt;INTEGER&amp;lt;/tt&amp;gt;]] whose type has id 2; &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; is of type &amp;lt;code&amp;gt;T9&amp;lt;/code&amp;gt; because type id 9 was mapped to type ''NATIVE_ARRAY[CHARACTER]''. If the field is not of an expanded type, it is declared as a C field with type &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Also note that there is an additional field &amp;lt;code&amp;gt;Tid id&amp;lt;/code&amp;gt;. This field is an integer field containing the type id for this structure, in this case the field should always be set to 38. The field is used to identify the type in every case that a pointer (usually a &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt; may point to more than one type of structure). That happens not only when using polymorphism on the original source, but also when using some internal polymorphic functions existing in the stack-dump printing code and in the garbage collector. If the compiler decides that the &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; field is not needed (happens a lot on boost mode with no GC, but also in expanded types), the field is omitted.&lt;br /&gt;
&lt;br /&gt;
Now it is easy to explain the definition of type &amp;lt;code&amp;gt;T0&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct S0 T0;&lt;br /&gt;
struct S0{Tid id;};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Native arrays have a special, different implementation. The C type is defined as a a pointer to the element type. When the element type is a reference type, the mapping of that element type is a &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt; so:&lt;br /&gt;
* ''NATIVE_ARRAY[CHARACTER]'' , with ''CHARACTER'' having type id 3, will be mapped to a &amp;lt;code&amp;gt;T3 *&amp;lt;/code&amp;gt;&lt;br /&gt;
* ''NATIVE_ARRAY[STRING]'' , with ''STRING'' having type id 7, will be mapped to a &amp;lt;code&amp;gt;T0 **&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each type, there is also an initialization constant defined to set the default values for the object. The constant to initialize values of type with id ''N'' is called &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;''N''. For default values, the constant gets a hardcoded value and is defined as a macro:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define M5 (0.0) /* 5 is the id for REAL_64 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For generic instantiations of [[library_class:NATIVE_ARRAY|&amp;lt;tt&amp;gt;NATIVE_ARRAY&amp;lt;/tt&amp;gt;]], the default is also defined as a macro and is always &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define M9 NULL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For structures, the initial value is an &amp;lt;code&amp;gt;extern&amp;lt;/code&amp;gt; variable defined at the &amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt; file, with its value set at one of the &amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; files. The initial value sets the id field if present to the correct type id, while other fields are respectively set to their default values. for the example struct above, the initialization code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
extern T38 M38; /* in the .h file */&lt;br /&gt;
 /* in the .c file */&lt;br /&gt;
T38 M38={38,(void*)0,0,(void*)0,0};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(explain what happens when an type has no attributes)&lt;br /&gt;
&lt;br /&gt;
= Mapping Eiffel features to C code =&lt;br /&gt;
&lt;br /&gt;
== Routines ==&lt;br /&gt;
&lt;br /&gt;
Eiffel routines are mapped to C functions. For a routine in the type with id ''N'', called ''eiffel_name'', a C function called &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;''Neiffel_name'' is generated. That routine:&lt;br /&gt;
* Is declared as &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; for procedures or has a return type of the obvious mapping type of the result for functions (that is &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt; for references, or &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt;''N'' for expanded types).&lt;br /&gt;
* Has an argument &amp;lt;code&amp;gt;se_dump_stack *caller&amp;lt;/code&amp;gt;. This argument is used for describing the activation record of the caller routine; more details about this are given in the [[#Exception handling]] section. In boost mode, this information is not needed and this argument is removed.&lt;br /&gt;
* Has an argument called &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; with the type of ''Current'' directly mapped. This is one of the few cases where references are not changed to &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt;, but the specific id is used even for reference types. Note that an expanded current will have a declaration of &amp;lt;code&amp;gt;Tnn C&amp;lt;/code&amp;gt;, while a reference type will have a declaration of &amp;lt;code&amp;gt;Tnn *C&amp;lt;/code&amp;gt;; this is because there is no possible polymorphism here. In a few cases, for routines that do not need information on the current instance, this argument is omitted.&lt;br /&gt;
* Has arguments called &amp;lt;code&amp;gt;a1, a2, ...&amp;lt;/code&amp;gt; for each of the arguments of the Eiffel routine. This arguments are mapped to C types in the usual way.&lt;br /&gt;
&lt;br /&gt;
Note that each routine in the Eiffel source may be remapped as multiple C functions, one per live descendant type (and generic variation). This happens even if there is no redefinition, because C types may be different for the same piece of Eiffel code (due to anchors, generics, and the change of Current). Note that when generating code for this routines, anchored types and generics are resolved to specific types and thus require no special handling.&lt;br /&gt;
&lt;br /&gt;
When there is a call and the compiler can statically decide the run time type of the call target, the call is mapped directly to one of these functions. When there is a possible polymorphic target, a &amp;quot;switching function&amp;quot; is generated. The switching function is called as &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;''Mname'', where M is the type id of the static target. This function has a similar prototype to the functions described above, but with &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; (the argument to pass ''Current'') declared as &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt; (note that polymorphic calls are always done on reference targets). The implementation of the function is a &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt; or nested &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;s, which call the corresponding &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;''P'' when the run-time type of the object is the one with id ''P'' (''P'' should be the id of a type which conforms to the type with id ''M''). The switching function may contain an argument called &amp;lt;code&amp;gt;position&amp;lt;/code&amp;gt; in non-boost modes, with a codification of the source position of the call for error reporting purposes (see [[#Exception handling]]).&lt;br /&gt;
&lt;br /&gt;
In boost mode, some simplifications may be made. Specially, some routines are inlined instead of being mapped to a C function. The switching functions may be inlined too.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
As seen before, Eiffel attributes have corresponding attributes in the C structures which represent instances. Attribute access is translated to structure field access when the type of the object can be decided at compile-time. However, an Eiffel expression &amp;lt;code&amp;gt;x.attr&amp;lt;/code&amp;gt;, when the run-time type of &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is not completely decided, can not be translated directly as field access, because the compiler doesn't know at compile time how to typecast the &amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt; which represents &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;; and in fact a cast can not be done safely, because due to inheritance (possibly multiple), the attribute can be at different offsets in the structures that represent the possible live run time types of &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In those cases, a switching function is also generated. The branches on the switch check the live type and do the proper typecast and field access in each case.&lt;br /&gt;
&lt;br /&gt;
Note that this also generalizes to the cases where a query is implemented in some subtypes as a function and in other subtypes as an attribute. In those cases, the switching function has some branches doing function calls and other branches doing field access.&lt;br /&gt;
&lt;br /&gt;
== Once routines ==&lt;br /&gt;
&lt;br /&gt;
For once routines, one or more routines are generated like for other non-once routines. But also one or two global variables are generated: a flag to remember if the routine has already been called, and in the case of once functions a second one for the cached result. These two variables have in their name the id of the class where the once function is declared.  By &amp;quot;id of a class&amp;quot;, it actually means &amp;quot;the id of the type which directly represents the class&amp;quot; (which is always one because generic classes can not have once features declared directly on them).&lt;br /&gt;
&lt;br /&gt;
The flag variable is called &amp;lt;code&amp;gt;int fBC&amp;lt;/code&amp;gt;''Mname'' (fBC means &amp;quot;flag at base class&amp;quot;); the cached result is called &amp;quot;&amp;lt;code&amp;gt;oBC&amp;lt;/code&amp;gt;''Mname''&amp;quot; (once for base class), with the type mapped in the normal way. They are declared in the&amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt; file, and initialized on one of the &amp;lt;tt&amp;gt;.c&amp;lt;/tt&amp;gt; files. The routines in the live-types (which may be more than one, and their type ids of several of them will not be ''M''), will have code like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (fBCmmname==0) {&lt;br /&gt;
  fBCmmname=1; {&lt;br /&gt;
   /* translation of routine body here, using oBCmmname as `Result' */&lt;br /&gt;
}}&lt;br /&gt;
return oBCmmname; /* Only in functions */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that using the id of the base class and not of the live type ensures that the once results are effectively shared systemwide (once-per-system instead of once-per-live-type).&lt;br /&gt;
&lt;br /&gt;
== Implementing local variables and Result values ==&lt;br /&gt;
&lt;br /&gt;
Local variables in Eiffel routines are mapped one by one to local variables in the mapped C function. The C types used is the usual mapping (&amp;lt;code&amp;gt;T0 *&amp;lt;/code&amp;gt; for references, &amp;lt;code&amp;gt;TN&amp;lt;/code&amp;gt; for expanded types). Locals are declared an initialized at the top of the routine. The name of the local is the Eiffel name preceded by an underscore. So, if you have &amp;lt;code&amp;gt;local i:INTEGER; some_string: STRING&amp;lt;/code&amp;gt;, the C code for implementations of that routine will have&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
T2 _i=0;&lt;br /&gt;
T7 _some_string=(void *)0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionaly, Eiffel functions get an additional local variable in the C code called &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt;, which maps the Eiffel ''Result'' special variable. It is typed and initialized as any other local variable. Eiffel functions always get exactly one &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; statement in their C mapping, on their last line, saying &amp;lt;code&amp;gt;return R;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An exception to the above are once functions. As mentioned [[#Once routines|before]], the result for that functions is a global variable. In that case, the &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; local is not declared, uses of ''Result'' in the Eiffel code are mapped to uses of the global variable, and the last line of the routine will be a &amp;lt;code&amp;gt;return oBCmmname;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
&lt;br /&gt;
== The managed stack ==&lt;br /&gt;
&lt;br /&gt;
Even if not required for implementing the rescue construct, SmartEiffel implements a &amp;quot;managed stack&amp;quot;. This managed stack consists on extra information embedded on the execution stack, which is useful to provide debugging and backtrace information; it is also used for assertion checking. The managed stack is used in all compilation modes except for the boost mode.&lt;br /&gt;
&lt;br /&gt;
In C, for every function call executed a stack frame is allocated. The stack frame contains the function arguments, the local variables, and probably some machine-dependent and C compiler dependent information (for example, a return address). The order of these elements on the stack frame may also be variable between platforms. SmartEiffel adds some local variables to each routine which hold some metadata about the structure of those stack frames, for example:&lt;br /&gt;
* which routine is the one corresponding to that frame&lt;br /&gt;
* where are the locals and arguments located in the stack&lt;br /&gt;
* where is each frame located in the call chain&lt;br /&gt;
&lt;br /&gt;
This information is stored in a local variable of every routine called &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; of type &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt;. A variable size part of the information is stored in another local variable called &amp;lt;code&amp;gt;locals&amp;lt;/code&amp;gt;, which is a stack allocated array of pointers. A typical stack frame might look like this:&lt;br /&gt;
&lt;br /&gt;
[[Image:example frame.svg|center]]&lt;br /&gt;
&lt;br /&gt;
The image above shows heap-allocated objects in blue, stack allocated (expanded) objects in red, global runtime structures in green and stack allocated runtime info/pointers in white. The routine above uses ''Current'' in some way (because of the local variable &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt;. It has two arguments (&amp;lt;code&amp;gt;a1, a2&amp;lt;/code&amp;gt;) and the first one is of an expanded type (shown in red). It is a function returning some expanded type (it has an &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; variable), and it has two local variables, &amp;lt;code&amp;gt;local_exp&amp;lt;/code&amp;gt; of an expanded type, and &amp;lt;code&amp;gt;local_ref&amp;lt;/code&amp;gt; of some reference type.&lt;br /&gt;
&lt;br /&gt;
The local &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; variable is initialized on routine entry. It has the following fields&lt;br /&gt;
* &amp;lt;code&amp;gt;ds.fd&amp;lt;/code&amp;gt; points to the frame descriptor. The frame descriptor is a structure declared as a local static variable (so, it is globally allocated and shared) and contains information shared by all the stack frames of the same routine (a string with the Eiffel routine name and class, number of arguments, etc).&lt;br /&gt;
* &amp;lt;code&amp;gt;ds.current&amp;lt;/code&amp;gt; is initialized to &amp;lt;code&amp;gt;&amp;amp;C&amp;lt;/code&amp;gt;. This allows code using the data structure to get the value of ''Current'' in this stack frame. Note that the pointer points to the location of the &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; variable, which may be the current object if ''Current'' is of an expanded type, but usually will be again a pointer to the actual object. If the routine has no need for ''Current'', this value will be &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ds.p&amp;lt;/code&amp;gt; is an integer value with an encoding of the position (file, line, column) inside the source Eiffel code which was last executed while this frame was active. See the [[#Encoding source positions|next section]] for details.&lt;br /&gt;
* &amp;lt;code&amp;gt;ds.locals&amp;lt;/code&amp;gt; is initialized to &amp;lt;code&amp;gt;&amp;amp;locals&amp;lt;/code&amp;gt; or to &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; in the cases where &amp;lt;code&amp;gt;locals&amp;lt;/code&amp;gt; is not needed (see below).&lt;br /&gt;
* &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; points to the &amp;lt;code&amp;gt;ds&amp;lt;/code&amp;gt; local variable of the calling function. This value is passed on the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; argument added by the compiler to each routine.&lt;br /&gt;
&lt;br /&gt;
There is a global runtime variable called &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; (smarteiffel dump-stack top) which always points to the &amp;lt;code&amp;gt;se_dump_stack&amp;lt;/code&amp;gt; of the currently running routine. So, starting from &amp;lt;code&amp;gt;se_dst&amp;lt;/code&amp;gt; and following the &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; attribute of the dump-stacks, you can follow a linked list of all the active routines in the call stack. For example if you compile a system with root class &amp;lt;code&amp;gt;ROOT&amp;lt;/code&amp;gt; with id 37 and creation routine &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; and that routine calls some &amp;lt;code&amp;gt;routine1&amp;lt;/code&amp;gt; of the same class, which calls the &amp;lt;code&amp;gt;item&amp;lt;/code&amp;gt; function of string, at some point the link chain will look like this (stack grows towards the bottom of the figure):&lt;br /&gt;
&lt;br /&gt;
[[Image:call chain.svg|center]]&lt;br /&gt;
&lt;br /&gt;
== Encoding source positions ==&lt;br /&gt;
&lt;br /&gt;
For debugging purposes, it is useful to map positions in C code to source files. In the compiled C code, source positions are represented as an unsigned int. The implementation expects that the C int type has at least 32 bits.&lt;br /&gt;
&lt;br /&gt;
There are two ways of encoding positions, one that encodes just a file and a line number, and another one that also encodes a column number. The last bit of the value is 0 when there is an encoded column. The column number, if present, is in the following 7 least significant bits. Then, the line number comes (16 bits if no column present, or 13 bits otherwise). Finally, a file identifier is in the remaining bits. So the two possible layouts are (see http://smarteiffel.loria.fr/tools/api/tools.d/kernel.d/POSITION.html#mangling):&lt;br /&gt;
&lt;br /&gt;
* 15 bits for file id, 16 bits for line number, 1 bit set to 1&lt;br /&gt;
* 11 bits for file id, 13 bits for line number, 7 bits for column number, 1 bit set to 0&lt;br /&gt;
&lt;br /&gt;
There are macros to decode positions in the &amp;lt;tt&amp;gt;no_check.h&amp;lt;/tt&amp;gt; runtime header. They are used when printing tracebacks and error messages. The macros are called &amp;lt;code&amp;gt;se_position2*&amp;lt;/code&amp;gt;. The mangling, in the compiler, is defined in the [[tool_class:POSITION|&amp;lt;tt&amp;gt;POSITION&amp;lt;/tt&amp;gt;]] class.&lt;br /&gt;
&lt;br /&gt;
File ids are actually the same number as type ids. A globally allocated array &amp;lt;code&amp;gt;char *p[N]&amp;lt;/code&amp;gt; is declared by the compilers where &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; is the highest type id. The routine &amp;lt;tt&amp;gt;initialize_eiffel_runtime&amp;lt;/tt&amp;gt; assigns initial values to the elements of this array, in the style of &amp;lt;code&amp;gt;p[7]=&amp;quot;/usr/lib/SmartEiffel/lib/string/string.e&amp;quot;;&amp;lt;/code&amp;gt;. Some assignments are also done aliasing the strings, for example &amp;lt;code&amp;gt;p[99]=p[88];&amp;lt;/code&amp;gt; this happens when 99 and 88 are ids of two types which are actually based on the same class (due to genericity).&lt;br /&gt;
&lt;br /&gt;
On the generated C code, you will find a lot of encoded positions. Each times the compiler generates code for a piece of Eiffel source at a distinct position, an assignment &amp;lt;code&amp;gt;ds.p=0x&amp;lt;encoded&amp;gt;;&amp;lt;/code&amp;gt; is inserted (usually with a human readable comment like &amp;lt;code&amp;gt;/*l133c5/string.e*/&amp;lt;/code&amp;gt;). The assignment modifies the status of the current dump stack frame (see [[#The managed stack|previous section]]); in that way, if an exception triggers, there is detailed information about the source code positions for each of the routines in the stack.&lt;br /&gt;
&lt;br /&gt;
== Recovering from exceptions ==&lt;br /&gt;
&lt;br /&gt;
When an exception is triggered internally (a developer exception, assertion check, or internal checks like the one for Void targets) the &amp;lt;code&amp;gt;internal_exception_handler&amp;lt;/code&amp;gt; is called. When an external signal is received, &amp;lt;code&amp;gt;signal_exception_handler&amp;lt;/code&amp;gt; is called. Both behave similarly (the signal catcher does some platform specific signal handling stuff). If there is no rescue clause, they print a traceback (except in boost mode, which has no managed stack to print), and exits.&lt;br /&gt;
&lt;br /&gt;
When the program passes through a routine with a rescue handler, the information about the handler is added to a stack. When exiting one of those routines, the top of that stack is removed. The internal handlers know whether there is some rescue clause to catch the exception or not by looking if the stack is empty.&lt;br /&gt;
&lt;br /&gt;
The stack is implemented as a linked list of nodes stored locally, at the stack frames of routines with rescue clauses. The top of the stack is pointed by a global variable &amp;lt;code&amp;gt;rescue_context_top&amp;lt;/code&amp;gt;, set to NULL when the stack is empty. Each node of the rescue stack is of type &amp;lt;code&amp;gt;rescue_context&amp;lt;/code&amp;gt;, a structure containing the following fields:&lt;br /&gt;
* &amp;lt;code&amp;gt;jb&amp;lt;/code&amp;gt;, a jump buffer returned by the C function setjmp, which is used to jump back to the routine when handling the exception.&lt;br /&gt;
* &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;, a pointer to the rescue context below, or NULL when we are at the bottom of the stack.&lt;br /&gt;
* &amp;lt;code&amp;gt;top_of_ds&amp;lt;/code&amp;gt;, a pointer to the managed stack frame of the routine which had this rescue close. This field is not present in boost mode, because there is no managed stack.&lt;br /&gt;
&lt;br /&gt;
Every routine containing a rescue class (or in a class with a redefined default_rescue feature) declares a variable called &amp;lt;code&amp;gt;rc&amp;lt;/code&amp;gt; of type &amp;lt;code&amp;gt;struct rescue_context&amp;lt;/code&amp;gt;. At the very beginning of the compiled routine, the &amp;lt;code&amp;gt;jb&amp;lt;/code&amp;gt; field of this context is initialized, with a block like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if(SETJMP(rc.jb)!=0){/*rescue*/&lt;br /&gt;
    ... compiled rescue clause ...&lt;br /&gt;
    internal_exception_handler(Routine_failure);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will set the jump buffer, so the body of the rescue clause is executed after a longjmp (which will happen on the event of an exception).&lt;br /&gt;
The last line of the block describes the standard behaviour of propagating the routine failure if a rescue block ends without running a retry statement.&lt;br /&gt;
&lt;br /&gt;
After the rescue section at the beginning of the routine there is a C label called &amp;lt;code&amp;gt;retry_tag:&amp;lt;/code&amp;gt;; the '''retry''' statement is implemented as a &amp;lt;code&amp;gt;goto retry_tag;&amp;lt;/code&amp;gt;. Note that this means that SE is unable to retry from outside the routine (and the compiler actually checks that a retry statement is inside a rescue clause); this is a bit different to other Eiffel variants which allow retry instructions anywhere. Precondition checking is after this tag, so the check is actually done again if the rescue clause retries.&lt;br /&gt;
&lt;br /&gt;
After precondition checking, the rescue context is actually added to the stack context (which means that a precondition failure will trigger an outer rescue clause, not the rescue clause of the same routine with the rescue handler. The initialization looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 rc.next = rescue_context_top;&lt;br /&gt;
 rescue_context_top = &amp;amp;rc;&lt;br /&gt;
 rc.top_of_ds=&amp;amp;ds;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end of the routine, the context is removed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 rescue_context_top = rc.next;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any exception produced internally (by assertion checking, void-checking, loop variants, etc.) is implemented by a call to the &amp;lt;code&amp;gt;internal_exception_handler&amp;lt;/code&amp;gt; function, defined in sys/runtime/c/exceptions.c. Signals are handled by &amp;lt;code&amp;gt;signal_exception_handler&amp;lt;/code&amp;gt; which is very similar. These functions do the folowing:&lt;br /&gt;
&lt;br /&gt;
# Setting some meta-information about the exception cause; specially global variables, &amp;lt;code&amp;gt;internal_exception_number&amp;lt;/code&amp;gt; (exception cause, same constants as in class [[library_class:EXCEPTIONS|&amp;lt;tt&amp;gt;EXCEPTIONS&amp;lt;/tt&amp;gt;]]),  &amp;lt;code&amp;gt;signal_exception_number&amp;lt;/code&amp;gt; (signal id when exception is caused by signal), &amp;lt;code&amp;gt;original_exception_number&amp;lt;/code&amp;gt; (original cause of exception; preserved even when the final cause is usually &amp;quot;routine failure&amp;quot;) and &amp;lt;code&amp;gt;additional_error_message&amp;lt;/code&amp;gt; (sometimes some extra info, the assertion tag for assertions).&lt;br /&gt;
# If &amp;lt;code&amp;gt;rescue_context_top == NULL&amp;lt;/code&amp;gt; it means that there is no rescue clause to catch this. An error message and a stack trace (on non-boost mode) are printed, and the program ends with &amp;lt;code&amp;gt;exit (EXIT_FAILURE);&amp;lt;/code&amp;gt;.&lt;br /&gt;
# If &amp;lt;code&amp;gt;rescue_context_top != NULL&amp;lt;/code&amp;gt;:&lt;br /&gt;
## The top rescue context is stored in the variable &amp;lt;code&amp;gt;current_context&amp;lt;/code&amp;gt;&lt;br /&gt;
## The top rescue context is removed from the top of the stack.&lt;br /&gt;
## Assertion checking is reset, calling to &amp;lt;code&amp;gt;reset_assertion_checking&amp;lt;/code&amp;gt;. See section on how assertion checking works for details.&lt;br /&gt;
## It does a &amp;lt;code&amp;gt;longjmp()&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;current_context-&amp;gt;jb&amp;lt;/code&amp;gt;. This should send the control flow right into the rescue handler.&lt;br /&gt;
&lt;br /&gt;
== Printing tracebacks ==&lt;br /&gt;
&lt;br /&gt;
= Garbage Collection =&lt;/div&gt;</summary>
		<author><name>Ramack</name></author>
	</entry>
</feed>