1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-02 23:14:57 +03:00

Further work on target abstraction

This commit is contained in:
Graham Nelson 2019-06-29 13:17:29 +01:00
parent fd9f539438
commit 279ccfb366
15 changed files with 640 additions and 231 deletions

View file

@ -137,7 +137,7 @@
<p class="endnote">The function CodeGen::Eliminate::go is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::Eliminate::gone is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Eliminate::gone is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP3">&#167;3</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-rv.html">Back to 'Reconcile Verbs'</a></li><li><a href="2-erl.html">Continue with 'Eliminate Redundant Labels'</a></li></ul><hr class="tocbar">

View file

@ -15,20 +15,37 @@
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::CL::responses</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NR</span><span class="plain"> = 0;</span>
&lt;<span class="cwebmacro">Define constants for the responses</span> <span class="cwebmacronumber">1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NR</span><span class="plain"> &gt; 0) </span>&lt;<span class="cwebmacro">Define an array of the responses</span> <span class="cwebmacronumber">1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">the_quartet_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">box_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">printing_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::CL::prepare</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">the_quartet_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">box_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">; </span><span class="identifier">printing_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::CL::responses is used in 4/cg (<a href="4-cg.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function CodeGen::CL::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">&#167;8.1</a>).</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Define constants for the responses</span> <span class="cwebmacronumber">1.1</span>&gt; =
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::CL::responses</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NR</span><span class="plain"> = 0;</span>
&lt;<span class="cwebmacro">Define constants for the responses</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NR</span><span class="plain"> &gt; 0) </span>&lt;<span class="cwebmacro">Define an array of the responses</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::CL::responses is used in 4/cg (<a href="4-cg.html#SP8_3">&#167;8.3</a>).</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Define constants for the responses</span> <span class="cwebmacronumber">2.1</span>&gt; =
</code></p>
@ -37,9 +54,11 @@
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">RESPONSE_IST</span><span class="plain">) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::Targets::general_segment</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">));</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">TO</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">resp_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">DEFN_RESPONSE_IFLD</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">TO</span><span class="plain">, </span><span class="string">"Constant %S = %d;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">resp_name</span><span class="plain">), ++</span><span class="identifier">NR</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">resp_name</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, ++</span><span class="identifier">NR</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">resp_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -47,16 +66,18 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP1_2"></a><b>&#167;1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Define an array of the responses</span> <span class="cwebmacronumber">1.2</span>&gt; =
<p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Define an array of the responses</span> <span class="cwebmacronumber">2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::Targets::constant_segment</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"Constant NO_RESPONSES = %d;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">NR</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"NO_RESPONSES"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">NR</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"NO_RESPONSES"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::Targets::default_segment</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"Array ResponseTexts --&gt; "</span><span class="plain">);</span>
@ -74,9 +95,9 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>There's a contrivance here to get around an awkward point of I6 syntax:
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>There's a contrivance here to get around an awkward point of I6 syntax:
an array written in the form
</p>
@ -96,8 +117,6 @@ is 20. We instead compile this as
<pre class="display">
<span class="plain">Array X --&gt; 1 20;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">the_quartet_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::CL::quartet_present</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
@ -203,7 +222,9 @@ is 20. We instead compile this as
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_INDIRECT_TEXT</span><span class="plain">: {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">ID</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">DATA_CONST_IFLD</span><span class="plain">];</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Inter::get_text</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">repo_segment</span><span class="plain">-&gt;</span><span class="identifier">owning_repo</span><span class="plain">, </span><span class="identifier">ID</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant %S = \</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">"</span><span class="string">%S\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_INDIRECT_LIST</span><span class="plain">: {</span>
@ -237,7 +258,7 @@ is 20. We instead compile this as
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_PRODUCT_LIST</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_DIFFERENCE_LIST</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_QUOTIENT_LIST</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant %S = "</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">DATA_CONST_IFLD</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">extent</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">=</span><span class="identifier">i</span><span class="plain">+2) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">i</span><span class="plain">&gt;</span><span class="identifier">DATA_CONST_IFLD</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">FORMAT_CONST_IFLD</span><span class="plain">] == </span><span class="identifier">CONSTANT_SUM_LIST</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" + "</span><span class="plain">);</span>
@ -251,17 +272,16 @@ is 20. We instead compile this as
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">+1], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bracket</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">")"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CONSTANT_DIRECT</span><span class="plain">: {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">DATA_CONST_IFLD</span><span class="plain">];</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val2</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">DATA_CONST_IFLD</span><span class="plain"> + 1];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ifndef_me</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"#ifndef %S; "</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant %S = "</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ifndef_me</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"#ifndef %S;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">), </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ifndef_me</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" #endif;"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ifndef_me</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" #endif;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"ungenerated constant format"</span><span class="plain">);</span>
@ -309,8 +329,6 @@ is 20. We instead compile this as
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">box_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">printing_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::CL::enter_box_mode</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">box_mode</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
@ -407,7 +425,7 @@ is 20. We instead compile this as
<p class="endnote">The function CodeGen::CL::compare_tlh appears nowhere else.</p>
<p class="endnote">The function CodeGen::CL::sort_literals is used in 4/cg (<a href="4-cg.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function CodeGen::CL::sort_literals is used in 4/cg (<a href="4-cg.html#SP8_3">&#167;8.3</a>).</p>
<p class="endnote">The function CodeGen::CL::enter_box_mode is used in 4/fc (<a href="4-fc.html#SP4">&#167;4</a>).</p>
@ -417,9 +435,9 @@ is 20. We instead compile this as
<p class="endnote">The function CodeGen::CL::exit_print_mode is used in 4/fc (<a href="4-fc.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function CodeGen::CL::literal is used in <a href="#SP1_2">&#167;1.2</a>, 4/fc (<a href="4-fc.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">&#167;5.8.4.1.1</a>, <a href="4-iap.html#SP8">&#167;8</a>), 4/vrb (<a href="4-vrb.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::CL::literal is used in <a href="#SP2_2">&#167;2.2</a>, 4/fc (<a href="4-fc.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">&#167;5.8.4.1.1</a>, <a href="4-iap.html#SP8">&#167;8</a>), 5/gi6 (<a href="5-gi6.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function CodeGen::CL::name is used in <a href="#SP1_1">&#167;1.1</a>, 4/fc (<a href="4-fc.html#SP3">&#167;3</a>, <a href="4-fc.html#SP4">&#167;4</a>), 4/iap (<a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5_5">&#167;5.5</a>, <a href="4-iap.html#SP5_7">&#167;5.7</a>, <a href="4-iap.html#SP5_8_4">&#167;5.8.4</a>, <a href="4-iap.html#SP5_9">&#167;5.9</a>, <a href="4-iap.html#SP5_11">&#167;5.11</a>, <a href="4-iap.html#SP5_11_2">&#167;5.11.2</a>, <a href="4-iap.html#SP5_11_2_1">&#167;5.11.2.1</a>, <a href="4-iap.html#SP5_11_2_2">&#167;5.11.2.2</a>, <a href="4-iap.html#SP6">&#167;6</a>, <a href="4-iap.html#SP8">&#167;8</a>), 4/vrb (<a href="4-vrb.html#SP1">&#167;1</a>), 5/gi6 (<a href="5-gi6.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::CL::name is used in <a href="#SP2_1">&#167;2.1</a>, 4/fc (<a href="4-fc.html#SP3">&#167;3</a>, <a href="4-fc.html#SP4">&#167;4</a>), 4/iap (<a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5_5">&#167;5.5</a>, <a href="4-iap.html#SP5_7">&#167;5.7</a>, <a href="4-iap.html#SP5_8_4">&#167;5.8.4</a>, <a href="4-iap.html#SP5_9">&#167;5.9</a>, <a href="4-iap.html#SP5_11">&#167;5.11</a>, <a href="4-iap.html#SP5_11_2">&#167;5.11.2</a>, <a href="4-iap.html#SP5_11_2_1">&#167;5.11.2.1</a>, <a href="4-iap.html#SP5_11_2_2">&#167;5.11.2.2</a>, <a href="4-iap.html#SP6">&#167;6</a>, <a href="4-iap.html#SP8">&#167;8</a>), 5/gi6 (<a href="5-gi6.html#SP5">&#167;5</a>, <a href="5-gi6.html#SP6">&#167;6</a>).</p>
<p class="endnote">The structure text_literal_holder is private to this section.</p>

View file

@ -11,7 +11,7 @@
<!--Weave of '4/cg' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#4">Chapter 4: Inter to Final Code</a></li><li><b>Code Generation</b></li></ul><p class="purpose">To generate final code from intermediate code.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Generations</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. Generations</a></li><li><a href="#SP8">&#167;8. </a></li><li><a href="#SP9">&#167;9. Marking</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Pipeline stage. </b></p>
@ -23,7 +23,8 @@
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;target_argument</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no target specified"</span><span class="plain">);</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain"> = </span><span class="functiontext">CodeGen::new_generation</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;target_argument</span><span class="plain">);</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain"> =</span>
<span class="functiontext">CodeGen::new_generation</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;target_argument</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">CodeGen::Targets::begin_generation</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::generate</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::write</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;text_out_file</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">);</span>
@ -54,6 +55,11 @@ arrays, and one could do this by creating two segments, one to accumulate
the constants in, one to accumulate the arrays.
</p>
<p class="inwebparagraph">At any given time, a generation has a "current" segment, to which output
is being written. Ome segment is special: the temporary one, which is used
only when assembling other material, and not for the final output.
</p>
<pre class="definitions">
<span class="definitionkeyword">define</span> <span class="constant">MAX_CG_SEGMENTS</span><span class="plain"> 100</span>
@ -66,17 +72,13 @@ the constants in, one to accumulate the arrays.
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">segments</span><span class="plain">[</span><span class="constant">MAX_CG_SEGMENTS</span><span class="plain">];</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">current_segment</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">temporarily_diverted</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">current_segment</span><span class="plain">; </span> <span class="comment">an entry in that array, or null</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">temporarily_diverted</span><span class="plain">; </span> <span class="comment">to the temporary segment</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">code_generation</span><span class="plain">;</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">generated_segment</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">generated_code</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">generated_segment</span><span class="plain">;</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="functiontext">CodeGen::new_generation</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">) {</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="functiontext">CodeGen::new_generation</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">, </span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">,</span>
<span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">) {</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain">);</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from_step</span><span class="plain"> = </span><span class="identifier">step</span><span class="plain">;</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain"> = </span><span class="identifier">I</span><span class="plain">;</span>
@ -86,6 +88,24 @@ the constants in, one to accumulate the arrays.
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_CG_SEGMENTS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">gen</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::new_generation is used in <a href="#SP1">&#167;1</a>, 4/fc (<a href="4-fc.html#SP3">&#167;3</a>).</p>
<p class="endnote">The structure code_generation is accessed in 4/fc, 4/cal, 4/iap, 4/vrb, 5/ft, 5/fti, 5/fbi, 5/fi, 5/fsi, 5/gi6 and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>At present, at least, a "segment" is nothing more than a wrapper for a text.
But we abstract it in case it's ever useful for it to be more.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">generated_segment</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">generated_code</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">generated_segment</span><span class="plain">;</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="functiontext">CodeGen::new_segment</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">seg</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">generated_segment</span><span class="plain">);</span>
@ -96,15 +116,30 @@ the constants in, one to accumulate the arrays.
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::new_generation is used in <a href="#SP1">&#167;1</a>, 4/fc (<a href="4-fc.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function CodeGen::new_segment is used in <a href="#SP3">&#167;3</a>, 5/gi6 (<a href="5-gi6.html#SP2">&#167;2</a>).</p>
<p class="endnote">The structure code_generation is accessed in 4/fc, 4/cal, 4/iap, 4/vrb, 5/ft, 5/fti, 5/fbi, 5/fi, 5/fsi, 5/gi6 and here.</p>
<p class="endnote">The function CodeGen::new_segment is used in <a href="#SP6">&#167;6</a>, 5/gi6 (<a href="5-gi6.html#SP2">&#167;2</a>).</p>
<p class="endnote">The structure generated_segment is private to this section.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The segments should be numbered in the order they will appear in the final
output, because:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::write</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_CG_SEGMENTS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) &amp;&amp; (</span><span class="identifier">i</span><span class="plain"> != </span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;generated_code</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::write is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>Here we switch the output, by changing the segment selection. This must
always be done in a way which is then undone, restoring the previous state:
</p>
<pre class="display">
@ -116,6 +151,24 @@ the constants in, one to accumulate the arrays.
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">saved</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;temporarily_diverted</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"poorly timed deselection"</span><span class="plain">);</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;current_segment</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::select is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP2_1">&#167;2.1</a>, <a href="4-cal.html#SP2_2">&#167;2.2</a>, <a href="4-cal.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>, <a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>), 5/gi6 (<a href="5-gi6.html#SP5">&#167;5</a>, <a href="5-gi6.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function CodeGen::deselect is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP2_1">&#167;2.1</a>, <a href="4-cal.html#SP2_2">&#167;2.2</a>, <a href="4-cal.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>, <a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>), 5/gi6 (<a href="5-gi6.html#SP5">&#167;5</a>, <a href="5-gi6.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>The procedure for selecting the temporary segment is different, because
we also have to direct it to a given text.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::select_temporary</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">] == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
@ -127,36 +180,100 @@ the constants in, one to accumulate the arrays.
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">]-</span><span class="element">&gt;generated_code</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;temporarily_diverted</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"poorly timed deselection"</span><span class="plain">);</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;current_segment</span><span class="plain"> = </span><span class="identifier">saved</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::deselect_temporary</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;temporarily_diverted</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::select_temporary is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>, <a href="4-fc.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">&#167;5.8.4.1.1</a>).</p>
<p class="endnote">The function CodeGen::deselect_temporary is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>, <a href="4-fc.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">&#167;5.8.4.1.1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>Note that temporary selections take precedence over the regular selection.
</p>
<pre class="display">
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;temporarily_diverted</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">]-</span><span class="element">&gt;generated_code</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;temporarily_diverted</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">]-</span><span class="element">&gt;generated_code</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;current_segment</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;current_segment</span><span class="plain">-</span><span class="element">&gt;generated_code</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::write</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="constant">MAX_CG_SEGMENTS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) &amp;&amp; (</span><span class="identifier">i</span><span class="plain"> != </span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">))</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">&gt;generated_code</span><span class="plain">);</span>
<span class="plain">}</span>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::current is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>, <a href="4-fc.html#SP3">&#167;3</a>, <a href="4-fc.html#SP4">&#167;4</a>), 4/cal (<a href="4-cal.html#SP2_1">&#167;2.1</a>, <a href="4-cal.html#SP2_2">&#167;2.2</a>, <a href="4-cal.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>, <a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>, <a href="4-iap.html#SP6">&#167;6</a>, <a href="4-iap.html#SP8">&#167;8</a>), 5/gi6 (<a href="5-gi6.html#SP2">&#167;2</a>, <a href="5-gi6.html#SP3">&#167;3</a>, <a href="5-gi6.html#SP4">&#167;4</a>, <a href="5-gi6.html#SP5">&#167;5</a>, <a href="5-gi6.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>Actual generation happens in three phases:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::generate</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
&lt;<span class="cwebmacro">Phase one - preparation</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Phase two - traverse</span> <span class="cwebmacronumber">8.2</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Phase three - consolidation</span> <span class="cwebmacronumber">8.3</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::generate is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Phase one - preparation</span> <span class="cwebmacronumber">8.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">Inter::Symbols::clear_transient_flags</span><span class="plain">();</span>
<span class="functiontext">CodeGen::Var::set_translates</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::FC::prepare</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::CL::prepare</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Var::prepare</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::IP::prepare</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_2"></a><b>&#167;8.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Phase two - traverse</span> <span class="cwebmacronumber">8.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">CodeGen::FC::iterate</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP8_3"></a><b>&#167;8.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Phase three - consolidation</span> <span class="cwebmacronumber">8.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">CodeGen::CL::responses</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::IP::write_properties</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="functiontext">CodeGen::CL::sort_literals</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Marking. </b>We use a transient flag on symbols, but abstract that here:
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::marked</span><span class="plain">(</span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb_name</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::Symbols::get_flag</span><span class="plain">(</span><span class="identifier">symb_name</span><span class="plain">, </span><span class="identifier">TRAVERSE_MARK_BIT</span><span class="plain">);</span>
<span class="plain">}</span>
@ -172,20 +289,6 @@ the constants in, one to accumulate the arrays.
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::select is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP1_1">&#167;1.1</a>, <a href="4-cal.html#SP1_2">&#167;1.2</a>, <a href="4-cal.html#SP2">&#167;2</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>, <a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>), 5/gi6 (<a href="5-gi6.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::select_temporary is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>, <a href="4-fc.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">&#167;5.8.4.1.1</a>).</p>
<p class="endnote">The function CodeGen::deselect is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP1_1">&#167;1.1</a>, <a href="4-cal.html#SP1_2">&#167;1.2</a>, <a href="4-cal.html#SP2">&#167;2</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>, <a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>), 5/gi6 (<a href="5-gi6.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::deselect_temporary is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>, <a href="4-fc.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">&#167;5.8.4.1.1</a>).</p>
<p class="endnote">The function CodeGen::current is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>, <a href="4-fc.html#SP3">&#167;3</a>, <a href="4-fc.html#SP4">&#167;4</a>), 4/cal (<a href="4-cal.html#SP1_1">&#167;1.1</a>, <a href="4-cal.html#SP1_2">&#167;1.2</a>, <a href="4-cal.html#SP2">&#167;2</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>, <a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>, <a href="4-iap.html#SP6">&#167;6</a>, <a href="4-iap.html#SP8">&#167;8</a>), 4/vrb (<a href="4-vrb.html#SP1">&#167;1</a>), 5/gi6 (<a href="5-gi6.html#SP2">&#167;2</a>, <a href="5-gi6.html#SP3">&#167;3</a>, <a href="5-gi6.html#SP4">&#167;4</a>, <a href="5-gi6.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::write is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::generate is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::marked is used in 4/iap (<a href="4-iap.html#SP5_8_4">&#167;5.8.4</a>), 5/fi (<a href="5-fi.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::mark is used in 4/iap (<a href="4-iap.html#SP5_8_4">&#167;5.8.4</a>), 5/fi (<a href="5-fi.html#SP1">&#167;1</a>).</p>

View file

@ -17,6 +17,17 @@
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">query_labels_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">negate_label_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">void_level</span><span class="plain"> = 3;</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">temporary_generation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::FC::prepare</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">query_labels_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">negate_label_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">void_level</span><span class="plain"> = 3;</span>
<span class="identifier">temporary_generation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::FC::iterate</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">) {</span>
@ -42,7 +53,6 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">query_labels_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">negate_label_mode</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::FC::frame</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">]) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SYMBOL_IST</span><span class="plain">: </span><span class="reserved">break</span><span class="plain">;</span>
@ -103,9 +113,6 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">void_level</span><span class="plain"> = 3;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::FC::pragma</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">target_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">TARGET_PRAGMA_IFLD</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">target_symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad pragma"</span><span class="plain">);</span>
@ -120,9 +127,11 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::FC::iterate is used in 4/cg (<a href="4-cg.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function CodeGen::FC::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function CodeGen::FC::frame is used in <a href="#SP3">&#167;3</a>, <a href="#SP4">&#167;4</a>, 4/cal (<a href="4-cal.html#SP2">&#167;2</a>), 5/gi6 (<a href="5-gi6.html#SP2_1">&#167;2.1</a>, <a href="5-gi6.html#SP2_9">&#167;2.9</a>).</p>
<p class="endnote">The function CodeGen::FC::iterate is used in 4/cg (<a href="4-cg.html#SP8_2">&#167;8.2</a>).</p>
<p class="endnote">The function CodeGen::FC::frame is used in <a href="#SP3">&#167;3</a>, <a href="#SP4">&#167;4</a>, 4/cal (<a href="4-cal.html#SP3">&#167;3</a>), 5/gi6 (<a href="5-gi6.html#SP2_1">&#167;2.1</a>, <a href="5-gi6.html#SP2_9">&#167;2.9</a>).</p>
<p class="endnote">The function CodeGen::FC::pragma appears nowhere else.</p>
@ -159,8 +168,7 @@
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain"> = </span><span class="identifier">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">routine</span><span class="plain"> = </span><span class="identifier">pack</span><span class="plain">-&gt;</span><span class="identifier">package_name</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::local_symbol_from_id</span><span class="plain">(</span><span class="identifier">routine</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">DEFN_LOCAL_IFLD</span><span class="plain">]);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" %S"</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::declare_local_variable</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::FC::label</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
@ -242,7 +250,6 @@
<span class="identifier">PUT</span><span class="plain">(</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">temporary_generation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::FC::val_from</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val2</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::is_stored_in_data</span><span class="plain">(</span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_data_pair_and_table</span><span class="plain">(</span>

View file

@ -18,6 +18,14 @@
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">properties_written</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">FBNA_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">properties_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">attribute_slots_used</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::IP::prepare</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">properties_written</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">FBNA_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">properties_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">attribute_slots_used</span><span class="plain"> = 0;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::IP::write_properties</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">properties_written</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::Targets::default_segment</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">));</span>
@ -37,7 +45,9 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::IP::write_properties is used in 4/cg (<a href="4-cg.html#SP3">&#167;3</a>), 4/fc (<a href="4-fc.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::IP::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function CodeGen::IP::write_properties is used in 4/cg (<a href="4-cg.html#SP8_3">&#167;8.3</a>), 4/fc (<a href="4-fc.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Representing instances in I6. </b>Partly for historical reasons, partly to squeeze performance out of the
virtual machines used in traditional parser IF, the I6 run-time
@ -129,7 +139,6 @@ limited number can be stored this way. Here we choose which.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">FBNA_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">properties_found</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">attribute_slots_used</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::IP::property</span><span class="plain">(</span><span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">prop_name</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">prop_name</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"bad property"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">prop_name</span><span class="plain">, </span><span class="identifier">EITHER_OR_IANN</span><span class="plain">) &gt;= 0) {</span>
@ -343,7 +352,9 @@ compiles an I6 constant for this value.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">FBNA_found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">FBNA_found</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::Targets::constant_segment</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"Constant FBNA_PROP_NUMBER = %S;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">prop_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"FBNA_PROP_NUMBER"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"%S"</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">prop_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"FBNA_PROP_NUMBER"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -363,7 +374,9 @@ above has been tried on all properties:
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">FBNA_found</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (</span><span class="identifier">properties_found</span><span class="plain">)) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::Targets::constant_segment</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"Constant FBNA_PROP_NUMBER = MAX_POSITIVE_NUMBER; ! No actual FBNA\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"FBNA_PROP_NUMBER"</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">), </span><span class="string">"MAX_POSITIVE_NUMBER"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"FBNA_PROP_NUMBER"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> **</span><span class="identifier">all_props_in_source_order</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -1213,17 +1226,17 @@ linearly with the size of the source text, even though N does.
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val1</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_INST_IFLD</span><span class="plain">];</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val2</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_INST_IFLD</span><span class="plain">];</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant %S"</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">inst_name</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val1</span><span class="plain"> != </span><span class="identifier">UNDEF_IVAL</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">defined</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">val1</span><span class="plain"> == </span><span class="identifier">UNDEF_IVAL</span><span class="plain">) </span><span class="identifier">defined</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">inst_name</span><span class="plain">), </span><span class="identifier">defined</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">defined</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">hex</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">inst_name</span><span class="plain">-&gt;</span><span class="identifier">no_symbol_annotations</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inst_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_annotations</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="identifier">annot</span><span class="plain">-&gt;</span><span class="identifier">annotation_ID</span><span class="plain"> == </span><span class="identifier">HEX_IANN</span><span class="plain">)</span>
<span class="identifier">hex</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hex</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$%x"</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hex</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"$%x"</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">); </span><span class="reserved">else</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d"</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">inst_name</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>

View file

@ -17,56 +17,31 @@
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">variables_written</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Var::knowledge</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">variables_written</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">variables_written</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">variables_written</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">prepare_counter</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Var::prepare</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">variables_written</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="identifier">prepare_counter</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">VARIABLE_IST</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">DEFN_VAR_IFLD</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">) == 1) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Global %S = "</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAR_IFLD</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAR_IFLD</span><span class="plain">], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">prepare_counter</span><span class="plain"> = </span><span class="functiontext">CodeGen::Targets::prepare_variable</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">prepare_counter</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = 0;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Array Global_Vars --&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">VARIABLE_IST</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">DEFN_VAR_IFLD</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">EXPLICIT_VARIABLE_IANN</span><span class="plain">) != 1) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ("</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">globals</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">globals</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAR_IFLD</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAR_IFLD</span><span class="plain">], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") ! --&gt;%d = %S (%S)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">), </span><span class="identifier">var_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">k</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> &lt; 2) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" NULL NULL"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Var::set_translates</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Var::knowledge</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">variables_written</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">variables_written</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">inter_repository</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;from</span><span class="plain">;</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain"> = 0;</span>
<span class="identifier">LOOP_THROUGH_FRAMES</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">VARIABLE_IST</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_frame_data</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">DEFN_VAR_IFLD</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">EXPLICIT_VARIABLE_IANN</span><span class="plain">) != 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">) != 1) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="string">"(Global_Vars--&gt;%d)"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">k</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="identifier">k</span><span class="plain"> = </span><span class="functiontext">CodeGen::Targets::declare_variable</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">prepare_counter</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -74,9 +49,9 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Var::knowledge is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Var::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function CodeGen::Var::set_translates is used in 4/cg (<a href="4-cg.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function CodeGen::Var::knowledge is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-iap.html">Back to 'Instances and Properties'</a></li><li><i>(This section ends Chapter 4: Inter to Final Code.)</i></li></ul><hr class="tocbar">

View file

@ -132,15 +132,15 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Targets::general_segment is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP1_1">&#167;1.1</a>).</p>
<p class="endnote">The function CodeGen::Targets::general_segment is used in 4/fc (<a href="4-fc.html#SP2">&#167;2</a>), 4/cal (<a href="4-cal.html#SP2_1">&#167;2.1</a>).</p>
<p class="endnote">The function CodeGen::Targets::default_segment is used in 4/cal (<a href="4-cal.html#SP1_2">&#167;1.2</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::Targets::default_segment is used in 4/cal (<a href="4-cal.html#SP2_2">&#167;2.2</a>), 4/iap (<a href="4-iap.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::Targets::constant_segment is used in 4/cal (<a href="4-cal.html#SP1_2">&#167;1.2</a>), 4/iap (<a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::Targets::constant_segment is used in 4/cal (<a href="4-cal.html#SP2_2">&#167;2.2</a>), 4/iap (<a href="4-iap.html#SP4_5">&#167;4.5</a>, <a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::Targets::property_segment appears nowhere else.</p>
<p class="endnote">The function CodeGen::Targets::tl_segment is used in 4/cal (<a href="4-cal.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Targets::tl_segment is used in 4/cal (<a href="4-cal.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
@ -178,7 +178,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Targets::compile_dictionary_word is used in 4/cal (<a href="4-cal.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Targets::compile_dictionary_word is used in 4/cal (<a href="4-cal.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b></p>
@ -196,7 +196,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Targets::compile_literal_text is used in 4/cal (<a href="4-cal.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function CodeGen::Targets::compile_literal_text is used in 4/cal (<a href="4-cal.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b></p>
@ -216,6 +216,67 @@
<p class="endnote">The function CodeGen::Targets::declare_property is used in 4/iap (<a href="4-iap.html#SP5_1">&#167;5.1</a>, <a href="4-iap.html#SP5_12">&#167;5.12</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b></p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">PREPARE_VARIABLE_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">DECLARE_VARIABLE_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">DECLARE_LOCAL_VARIABLE_MTID</span>
</pre>
<pre class="display">
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">PREPARE_VARIABLE_MTID</span><span class="plain">, </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">)</span>
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">DECLARE_VARIABLE_MTID</span><span class="plain">, </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">of</span><span class="plain">)</span>
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">DECLARE_LOCAL_VARIABLE_MTID</span><span class="plain">, </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">)</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Targets::prepare_variable</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = 0;</span>
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;target</span><span class="plain">, </span><span class="constant">PREPARE_VARIABLE_MTID</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Targets::declare_variable</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">of</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = 0;</span>
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">rv</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;target</span><span class="plain">, </span><span class="constant">DECLARE_VARIABLE_MTID</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="identifier">of</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Targets::declare_local_variable</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;target</span><span class="plain">, </span><span class="constant">DECLARE_LOCAL_VARIABLE_MTID</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Targets::prepare_variable is used in 4/vrb (<a href="4-vrb.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::Targets::declare_variable is used in 4/vrb (<a href="4-vrb.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::Targets::declare_local_variable is used in 4/fc (<a href="4-fc.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">BEGIN_CONSTANT_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">END_CONSTANT_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">BEGIN_CONSTANT_MTID</span><span class="plain">, </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">continues</span><span class="plain">)</span>
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">END_CONSTANT_MTID</span><span class="plain">, </span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">)</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Targets::begin_constant</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">continues</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;target</span><span class="plain">, </span><span class="constant">BEGIN_CONSTANT_MTID</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">const_name</span><span class="plain">, </span><span class="identifier">continues</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Targets::end_constant</span><span class="plain">(</span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">-</span><span class="element">&gt;target</span><span class="plain">, </span><span class="constant">END_CONSTANT_MTID</span><span class="plain">, </span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">const_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Targets::begin_constant is used in 4/cal (<a href="4-cal.html#SP2_1">&#167;2.1</a>, <a href="4-cal.html#SP2_2">&#167;2.2</a>, <a href="4-cal.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>, <a href="4-iap.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function CodeGen::Targets::end_constant is used in 4/cal (<a href="4-cal.html#SP2_1">&#167;2.1</a>, <a href="4-cal.html#SP2_2">&#167;2.2</a>, <a href="4-cal.html#SP3">&#167;3</a>), 4/iap (<a href="4-iap.html#SP4_6">&#167;4.6</a>, <a href="4-iap.html#SP5">&#167;5</a>, <a href="4-iap.html#SP6">&#167;6</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 5: Final Code.)</i></li><li><a href="5-fti.html">Continue with 'Final Textual Inter'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -30,6 +30,11 @@
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">COMPILE_DICTIONARY_WORD_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::compile_dictionary_word</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">COMPILE_LITERAL_TEXT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::compile_literal_text</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DECLARE_PROPERTY_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::declare_property</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">PREPARE_VARIABLE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::prepare_variable</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DECLARE_VARIABLE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::declare_variable</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">DECLARE_LOCAL_VARIABLE_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::declare_local_variable</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">BEGIN_CONSTANT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::begin_constant</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">cgt</span><span class="plain">, </span><span class="constant">END_CONSTANT_MTID</span><span class="plain">, </span><span class="functiontext">CodeGen::I6::end_constant</span><span class="plain">);</span>
<span class="identifier">inform6_target</span><span class="plain"> = </span><span class="identifier">cgt</span><span class="plain">;</span>
<span class="plain">}</span>
@ -54,6 +59,7 @@
<span class="definitionkeyword">enum</span> <span class="constant">text_literals_code_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">summations_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">arrays_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">globals_array_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">main_matter_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">routines_at_eof_I7CGS</span>
<span class="definitionkeyword">enum</span> <span class="constant">code_at_eof_I7CGS</span>
@ -68,6 +74,7 @@
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">text_literals_code_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">summations_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">arrays_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">globals_array_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">main_matter_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">routines_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
<span class="identifier">cg</span><span class="plain">-</span><span class="element">&gt;segments</span><span class="plain">[</span><span class="constant">code_at_eof_I7CGS</span><span class="plain">] = </span><span class="functiontext">CodeGen::new_segment</span><span class="plain">();</span>
@ -713,6 +720,80 @@ trick called "stubbing", these being "stub definitions".)
<p class="endnote">The function CodeGen::I6::declare_property is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::prepare_variable</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">EXPLICIT_VARIABLE_IANN</span><span class="plain">) != 1) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">) != 1) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="string">"(Global_Vars--&gt;%d)"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">k</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::declare_variable</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">of</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">) == 1) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">main_matter_I7CGS</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Global %S = "</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">));</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAR_IFLD</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAR_IFLD</span><span class="plain">], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">, </span><span class="identifier">EXPLICIT_VARIABLE_IANN</span><span class="plain">) != 1) {</span>
<span class="reserved">generated_segment</span><span class="plain"> *</span><span class="identifier">saved</span><span class="plain"> = </span><span class="functiontext">CodeGen::select</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="constant">attributes_at_eof_I7CGS</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Array Global_Vars --&gt;\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" ("</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">globals</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope_of</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">CodeGen::CL::literal</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">globals</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL1_VAR_IFLD</span><span class="plain">], </span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">VAL2_VAR_IFLD</span><span class="plain">], </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">") ! --&gt;%d = %S (%S)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">k</span><span class="plain">, </span><span class="functiontext">CodeGen::CL::name</span><span class="plain">(</span><span class="identifier">var_name</span><span class="plain">), </span><span class="identifier">var_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">k</span><span class="plain">++;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> == </span><span class="identifier">of</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">k</span><span class="plain"> &lt; 2) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" NULL NULL"</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::deselect</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">saved</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">k</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::declare_local_variable</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">,</span>
<span class="identifier">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">var_name</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" %S"</span><span class="plain">, </span><span class="identifier">var_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::begin_constant</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">continues</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Constant %S"</span><span class="plain">, </span><span class="identifier">const_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">continues</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" = "</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::I6::end_constant</span><span class="plain">(</span><span class="reserved">code_generation_target</span><span class="plain"> *</span><span class="identifier">cgt</span><span class="plain">, </span><span class="reserved">code_generation</span><span class="plain"> *</span><span class="identifier">gen</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">const_name</span><span class="plain">) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain"> = </span><span class="functiontext">CodeGen::current</span><span class="plain">(</span><span class="identifier">gen</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">";\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::I6::prepare_variable is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::declare_variable is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::declare_local_variable is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::begin_constant is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::I6::end_constant is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-fsi.html">Back to 'Final Summarised Inter'</a></li><li><i>(This section ends Chapter 5: Final Code.)</i></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -11,7 +11,8 @@ void CodeGen::create_pipeline_stage(void) {
int CodeGen::run_pipeline_stage(pipeline_step *step) {
if (step->target_argument == NULL) internal_error("no target specified");
code_generation *gen = CodeGen::new_generation(step, step->repository, step->target_argument);
code_generation *gen =
CodeGen::new_generation(step, step->repository, step->target_argument);
if (CodeGen::Targets::begin_generation(gen) == FALSE) {
CodeGen::generate(gen);
CodeGen::write(step->text_out_file, gen);
@ -33,6 +34,10 @@ for example, one might need to have all constants defined first, then all
arrays, and one could do this by creating two segments, one to accumulate
the constants in, one to accumulate the arrays.
At any given time, a generation has a "current" segment, to which output
is being written. Ome segment is special: the temporary one, which is used
only when assembling other material, and not for the final output.
@d MAX_CG_SEGMENTS 100
@d TEMP_CG_SEGMENT 99
@ -42,17 +47,13 @@ typedef struct code_generation {
struct inter_repository *from;
struct code_generation_target *target;
struct generated_segment *segments[MAX_CG_SEGMENTS];
struct generated_segment *current_segment;
int temporarily_diverted;
struct generated_segment *current_segment; /* an entry in that array, or null */
int temporarily_diverted; /* to the temporary segment */
MEMORY_MANAGEMENT
} code_generation;
typedef struct generated_segment {
struct text_stream *generated_code;
MEMORY_MANAGEMENT
} generated_segment;
code_generation *CodeGen::new_generation(pipeline_step *step, inter_repository *I, code_generation_target *target) {
code_generation *CodeGen::new_generation(pipeline_step *step, inter_repository *I,
code_generation_target *target) {
code_generation *gen = CREATE(code_generation);
gen->from_step = step;
gen->from = I;
@ -63,13 +64,33 @@ code_generation *CodeGen::new_generation(pipeline_step *step, inter_repository *
return gen;
}
@ At present, at least, a "segment" is nothing more than a wrapper for a text.
But we abstract it in case it's ever useful for it to be more.
=
typedef struct generated_segment {
struct text_stream *generated_code;
MEMORY_MANAGEMENT
} generated_segment;
generated_segment *CodeGen::new_segment(void) {
generated_segment *seg = CREATE(generated_segment);
seg->generated_code = Str::new();
return seg;
}
@
@ The segments should be numbered in the order they will appear in the final
output, because:
=
void CodeGen::write(OUTPUT_STREAM, code_generation *gen) {
for (int i=0; i<MAX_CG_SEGMENTS; i++)
if ((gen->segments[i]) && (i != TEMP_CG_SEGMENT))
WRITE("%S", gen->segments[i]->generated_code);
}
@ Here we switch the output, by changing the segment selection. This must
always be done in a way which is then undone, restoring the previous state:
=
generated_segment *CodeGen::select(code_generation *gen, int i) {
@ -80,6 +101,15 @@ generated_segment *CodeGen::select(code_generation *gen, int i) {
return saved;
}
void CodeGen::deselect(code_generation *gen, generated_segment *saved) {
if (gen->temporarily_diverted) internal_error("poorly timed deselection");
gen->current_segment = saved;
}
@ The procedure for selecting the temporary segment is different, because
we also have to direct it to a given text.
=
void CodeGen::select_temporary(code_generation *gen, text_stream *T) {
if (gen->segments[TEMP_CG_SEGMENT] == NULL) {
gen->segments[TEMP_CG_SEGMENT] = CodeGen::new_segment();
@ -91,36 +121,48 @@ void CodeGen::select_temporary(code_generation *gen, text_stream *T) {
gen->segments[TEMP_CG_SEGMENT]->generated_code = T;
}
void CodeGen::deselect(code_generation *gen, generated_segment *saved) {
if (gen->temporarily_diverted) internal_error("poorly timed deselection");
gen->current_segment = saved;
}
void CodeGen::deselect_temporary(code_generation *gen) {
gen->temporarily_diverted = FALSE;
}
@ Note that temporary selections take precedence over the regular selection.
=
text_stream *CodeGen::current(code_generation *gen) {
if (gen->temporarily_diverted) return gen->segments[TEMP_CG_SEGMENT]->generated_code;
if (gen->temporarily_diverted)
return gen->segments[TEMP_CG_SEGMENT]->generated_code;
if (gen->current_segment == NULL) return NULL;
return gen->current_segment->generated_code;
}
void CodeGen::write(OUTPUT_STREAM, code_generation *gen) {
for (int i=0; i<MAX_CG_SEGMENTS; i++)
if ((gen->segments[i]) && (i != TEMP_CG_SEGMENT))
WRITE("%S", gen->segments[i]->generated_code);
@h Actual generation happens in three phases:
=
void CodeGen::generate(code_generation *gen) {
@<Phase one - preparation@>;
@<Phase two - traverse@>;
@<Phase three - consolidation@>;
}
void CodeGen::generate(code_generation *gen) {
@<Phase one - preparation@> =
Inter::Symbols::clear_transient_flags();
CodeGen::Var::set_translates(gen);
CodeGen::FC::prepare(gen);
CodeGen::CL::prepare(gen);
CodeGen::Var::prepare(gen);
CodeGen::IP::prepare(gen);
@<Phase two - traverse@> =
CodeGen::FC::iterate(gen);
@<Phase three - consolidation@> =
CodeGen::CL::responses(gen);
CodeGen::IP::write_properties(gen);
CodeGen::CL::sort_literals(gen);
}
CodeGen::CL::sort_literals(gen);
@h Marking.
We use a transient flag on symbols, but abstract that here:
=
int CodeGen::marked(inter_symbol *symb_name) {
return Inter::Symbols::get_flag(symb_name, TRAVERSE_MARK_BIT);
}

View file

@ -4,6 +4,17 @@ To generate final code for constants, including arrays.
@
=
int the_quartet_found = FALSE;
int box_mode = FALSE, printing_mode = FALSE;
void CodeGen::CL::prepare(code_generation *gen) {
the_quartet_found = FALSE;
box_mode = FALSE; printing_mode = FALSE;
}
@
=
void CodeGen::CL::responses(code_generation *gen) {
inter_repository *I = gen->from;
@ -17,16 +28,20 @@ void CodeGen::CL::responses(code_generation *gen) {
LOOP_THROUGH_FRAMES(P, I) {
if (P.data[ID_IFLD] == RESPONSE_IST) {
generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::general_segment(gen, P));
text_stream *TO = CodeGen::current(gen);
inter_symbol *resp_name = Inter::SymbolsTables::symbol_from_frame_data(P, DEFN_RESPONSE_IFLD);
WRITE_TO(TO, "Constant %S = %d;\n", CodeGen::CL::name(resp_name), ++NR);
CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(resp_name), TRUE);
text_stream *OUT = CodeGen::current(gen);
WRITE("%d", ++NR);
CodeGen::Targets::end_constant(gen, CodeGen::CL::name(resp_name));
CodeGen::deselect(gen, saved);
}
}
@<Define an array of the responses@> =
generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::constant_segment(gen));
WRITE_TO(CodeGen::current(gen), "Constant NO_RESPONSES = %d;\n", NR);
CodeGen::Targets::begin_constant(gen, I"NO_RESPONSES", TRUE);
WRITE_TO(CodeGen::current(gen), "%d", NR);
CodeGen::Targets::end_constant(gen, I"NO_RESPONSES");
CodeGen::deselect(gen, saved);
saved = CodeGen::select(gen, CodeGen::Targets::default_segment(gen));
WRITE_TO(CodeGen::current(gen), "Array ResponseTexts --> ");
@ -54,8 +69,6 @@ is 20. We instead compile this as
|Array X --> 1 20;|
=
int the_quartet_found = FALSE;
int CodeGen::CL::quartet_present(void) {
#ifdef CORE_MODULE
return TRUE;
@ -161,7 +174,9 @@ void CodeGen::CL::constant(code_generation *gen, inter_frame P) {
case CONSTANT_INDIRECT_TEXT: {
inter_t ID = P.data[DATA_CONST_IFLD];
text_stream *S = Inter::get_text(P.repo_segment->owning_repo, ID);
WRITE("Constant %S = \"%S\";\n", CodeGen::CL::name(con_name), S);
CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(con_name), TRUE);
WRITE("\"%S\"", S);
CodeGen::Targets::end_constant(gen, CodeGen::CL::name(con_name));
break;
}
case CONSTANT_INDIRECT_LIST: {
@ -195,7 +210,7 @@ void CodeGen::CL::constant(code_generation *gen, inter_frame P) {
case CONSTANT_PRODUCT_LIST:
case CONSTANT_DIFFERENCE_LIST:
case CONSTANT_QUOTIENT_LIST:
WRITE("Constant %S = ", CodeGen::CL::name(con_name));
CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(con_name), TRUE);
for (int i=DATA_CONST_IFLD; i<P.extent; i=i+2) {
if (i>DATA_CONST_IFLD) {
if (P.data[FORMAT_CONST_IFLD] == CONSTANT_SUM_LIST) WRITE(" + ");
@ -209,17 +224,16 @@ void CodeGen::CL::constant(code_generation *gen, inter_frame P) {
CodeGen::CL::literal(gen, con_name, Inter::Packages::scope_of(P), P.data[i], P.data[i+1], FALSE);
if (bracket) WRITE(")");
}
WRITE(";\n");
CodeGen::Targets::end_constant(gen, CodeGen::CL::name(con_name));
break;
case CONSTANT_DIRECT: {
inter_t val1 = P.data[DATA_CONST_IFLD];
inter_t val2 = P.data[DATA_CONST_IFLD + 1];
if (ifndef_me) WRITE("#ifndef %S; ", CodeGen::CL::name(con_name));
WRITE("Constant %S = ", CodeGen::CL::name(con_name));
if (ifndef_me) WRITE("#ifndef %S;\n", CodeGen::CL::name(con_name));
CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(con_name), TRUE);
CodeGen::CL::literal(gen, con_name, Inter::Packages::scope_of(P), val1, val2, FALSE);
WRITE(";");
if (ifndef_me) WRITE(" #endif;");
WRITE("\n");
CodeGen::Targets::end_constant(gen, CodeGen::CL::name(con_name));
if (ifndef_me) WRITE(" #endif;\n");
break;
}
default: internal_error("ungenerated constant format");
@ -267,8 +281,6 @@ void CodeGen::CL::sort_literals(code_generation *gen) {
}
}
int box_mode = FALSE, printing_mode = FALSE;
void CodeGen::CL::enter_box_mode(void) {
box_mode = TRUE;
}

View file

@ -5,6 +5,17 @@ To manage the final-code process, at the frame level.
@
@ =
int query_labels_mode = FALSE, negate_label_mode = FALSE;
int void_level = 3;
code_generation *temporary_generation = NULL;
void CodeGen::FC::prepare(code_generation *gen) {
query_labels_mode = FALSE;
negate_label_mode = FALSE;
void_level = 3;
temporary_generation = NULL;
}
void CodeGen::FC::iterate(code_generation *gen) {
inter_repository *I = gen->from;
if (I) {
@ -30,7 +41,6 @@ void CodeGen::FC::iterate(code_generation *gen) {
}
}
int query_labels_mode = FALSE, negate_label_mode = FALSE;
void CodeGen::FC::frame(code_generation *gen, inter_frame P) {
switch (P.data[ID_IFLD]) {
case SYMBOL_IST: break;
@ -91,9 +101,6 @@ void CodeGen::FC::frame(code_generation *gen, inter_frame P) {
}
}
int void_level = 3;
void CodeGen::FC::pragma(code_generation *gen, inter_frame P) {
inter_symbol *target_symbol = Inter::SymbolsTables::symbol_from_frame_data(P, TARGET_PRAGMA_IFLD);
if (target_symbol == NULL) internal_error("bad pragma");
@ -135,8 +142,7 @@ void CodeGen::FC::local(code_generation *gen, inter_frame P) {
inter_package *pack = Inter::Packages::container(P);
inter_symbol *routine = pack->package_name;
inter_symbol *var_name = Inter::SymbolsTables::local_symbol_from_id(routine, P.data[DEFN_LOCAL_IFLD]);
text_stream *OUT = CodeGen::current(gen);
WRITE(" %S", var_name->symbol_name);
CodeGen::Targets::declare_local_variable(gen, P, var_name);
}
void CodeGen::FC::label(code_generation *gen, inter_frame P) {
@ -218,7 +224,6 @@ void CodeGen::FC::lab(code_generation *gen, inter_frame P) {
PUT(Str::get(pos));
}
code_generation *temporary_generation = NULL;
void CodeGen::FC::val_from(OUTPUT_STREAM, inter_reading_state *IRS, inter_t val1, inter_t val2) {
if (Inter::Symbols::is_stored_in_data(val1, val2)) {
inter_symbol *symb = Inter::SymbolsTables::symbol_from_data_pair_and_table(

View file

@ -7,6 +7,14 @@ properties, and all associated metadata.
=
int properties_written = FALSE;
int FBNA_found = FALSE, properties_found = FALSE, attribute_slots_used = 0;
void CodeGen::IP::prepare(code_generation *gen) {
properties_written = FALSE;
FBNA_found = FALSE;
properties_found = FALSE;
attribute_slots_used = 0;
}
void CodeGen::IP::write_properties(code_generation *gen) {
if (properties_written == FALSE) {
generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::default_segment(gen));
@ -97,7 +105,6 @@ Some either-or properties of object instances can be stored as I6
limited number can be stored this way. Here we choose which.
=
int FBNA_found = FALSE, properties_found = FALSE, attribute_slots_used = 0;
void CodeGen::IP::property(inter_repository *I, inter_symbol *prop_name, code_generation *gen) {
if (prop_name == NULL) internal_error("bad property");
if (Inter::Symbols::read_annotation(prop_name, EITHER_OR_IANN) >= 0) {
@ -229,7 +236,9 @@ compiles an I6 constant for this value.
if (FBNA_found == FALSE) {
FBNA_found = TRUE;
generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::constant_segment(gen));
WRITE_TO(CodeGen::current(gen), "Constant FBNA_PROP_NUMBER = %S;\n", CodeGen::CL::name(prop_name));
CodeGen::Targets::begin_constant(gen, I"FBNA_PROP_NUMBER", TRUE);
WRITE_TO(CodeGen::current(gen), "%S", CodeGen::CL::name(prop_name));
CodeGen::Targets::end_constant(gen, I"FBNA_PROP_NUMBER");
CodeGen::deselect(gen, saved);
}
@ -242,7 +251,9 @@ void CodeGen::IP::knowledge(code_generation *gen) {
inter_repository *I = gen->from;
if ((FBNA_found == FALSE) && (properties_found)) {
generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::constant_segment(gen));
WRITE_TO(CodeGen::current(gen), "Constant FBNA_PROP_NUMBER = MAX_POSITIVE_NUMBER; ! No actual FBNA\n");
CodeGen::Targets::begin_constant(gen, I"FBNA_PROP_NUMBER", TRUE);
WRITE_TO(CodeGen::current(gen), "MAX_POSITIVE_NUMBER");
CodeGen::Targets::end_constant(gen, I"FBNA_PROP_NUMBER");
CodeGen::deselect(gen, saved);
}
inter_symbol **all_props_in_source_order = NULL;
@ -818,17 +829,17 @@ void CodeGen::IP::instance(code_generation *gen, inter_frame P) {
inter_t val1 = P.data[VAL1_INST_IFLD];
inter_t val2 = P.data[VAL2_INST_IFLD];
text_stream *OUT = CodeGen::current(gen);
WRITE("Constant %S", CodeGen::CL::name(inst_name));
if (val1 != UNDEF_IVAL) {
WRITE(" = ");
int defined = TRUE;
if (val1 == UNDEF_IVAL) defined = FALSE;
CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(inst_name), defined);
if (defined) {
int hex = FALSE;
for (int i=0; i<inst_name->no_symbol_annotations; i++)
if (inst_name->symbol_annotations[i].annot->annotation_ID == HEX_IANN)
hex = TRUE;
if (hex) WRITE("$%x", val2);
else WRITE("%d", val2);
if (hex) WRITE("$%x", val2); else WRITE("%d", val2);
}
WRITE(";\n");
CodeGen::Targets::end_constant(gen, CodeGen::CL::name(inst_name));
}
}

View file

@ -5,56 +5,31 @@ To generate the initial state of storage for variables.
@h Storage.
=
int variables_written = FALSE;
void CodeGen::Var::knowledge(code_generation *gen) {
if (variables_written == FALSE) {
variables_written = TRUE;
text_stream *OUT = CodeGen::current(gen);
inter_repository *I = gen->from;
int variables_written = FALSE, prepare_counter = 0;
void CodeGen::Var::prepare(code_generation *gen) {
variables_written = FALSE;
inter_repository *I = gen->from;
prepare_counter = 0;
if (I) {
inter_frame P;
LOOP_THROUGH_FRAMES(P, I)
if (P.data[ID_IFLD] == VARIABLE_IST) {
inter_symbol *var_name = Inter::SymbolsTables::symbol_from_frame_data(P, DEFN_VAR_IFLD);
if (Inter::Symbols::read_annotation(var_name, ASSIMILATED_IANN) == 1) {
WRITE("Global %S = ", CodeGen::CL::name(var_name));
CodeGen::CL::literal(gen, NULL, Inter::Packages::scope_of(P), P.data[VAL1_VAR_IFLD], P.data[VAL2_VAR_IFLD], FALSE);
WRITE(";\n");
}
prepare_counter = CodeGen::Targets::prepare_variable(gen, P, var_name, prepare_counter);
}
int k = 0;
WRITE("Array Global_Vars -->\n");
LOOP_THROUGH_FRAMES(P, I)
if (P.data[ID_IFLD] == VARIABLE_IST) {
inter_symbol *var_name = Inter::SymbolsTables::symbol_from_frame_data(P, DEFN_VAR_IFLD);
if (Inter::Symbols::read_annotation(var_name, EXPLICIT_VARIABLE_IANN) != 1) {
WRITE(" (");
inter_symbols_table *globals = Inter::Packages::scope_of(P);
CodeGen::CL::literal(gen, NULL, globals, P.data[VAL1_VAR_IFLD], P.data[VAL2_VAR_IFLD], FALSE);
WRITE(") ! -->%d = %S (%S)\n", k, CodeGen::CL::name(var_name), var_name->symbol_name);
k++;
}
}
if (k < 2) WRITE(" NULL NULL");
WRITE(";\n");
}
}
void CodeGen::Var::set_translates(code_generation *gen) {
inter_repository *I = gen->from;
if (I) {
void CodeGen::Var::knowledge(code_generation *gen) {
if (variables_written == FALSE) {
variables_written = TRUE;
inter_repository *I = gen->from;
inter_frame P;
int k = 0;
LOOP_THROUGH_FRAMES(P, I)
if (P.data[ID_IFLD] == VARIABLE_IST) {
inter_symbol *var_name = Inter::SymbolsTables::symbol_from_frame_data(P, DEFN_VAR_IFLD);
if (Inter::Symbols::read_annotation(var_name, EXPLICIT_VARIABLE_IANN) != 1) {
if (Inter::Symbols::read_annotation(var_name, ASSIMILATED_IANN) != 1) {
text_stream *S = Str::new();
WRITE_TO(S, "(Global_Vars-->%d)", k);
Inter::Symbols::set_translate(var_name, S);
}
k++;
}
k = CodeGen::Targets::declare_variable(gen, P, var_name, k, prepare_counter);
}
}
}

View file

@ -18,6 +18,11 @@ void CodeGen::I6::create_target(void) {
METHOD_ADD(cgt, COMPILE_DICTIONARY_WORD_MTID, CodeGen::I6::compile_dictionary_word);
METHOD_ADD(cgt, COMPILE_LITERAL_TEXT_MTID, CodeGen::I6::compile_literal_text);
METHOD_ADD(cgt, DECLARE_PROPERTY_MTID, CodeGen::I6::declare_property);
METHOD_ADD(cgt, PREPARE_VARIABLE_MTID, CodeGen::I6::prepare_variable);
METHOD_ADD(cgt, DECLARE_VARIABLE_MTID, CodeGen::I6::declare_variable);
METHOD_ADD(cgt, DECLARE_LOCAL_VARIABLE_MTID, CodeGen::I6::declare_local_variable);
METHOD_ADD(cgt, BEGIN_CONSTANT_MTID, CodeGen::I6::begin_constant);
METHOD_ADD(cgt, END_CONSTANT_MTID, CodeGen::I6::end_constant);
inform6_target = cgt;
}
@ -33,6 +38,7 @@ code_generation_target *CodeGen::I6::target(void) {
@e text_literals_code_I7CGS
@e summations_at_eof_I7CGS
@e arrays_at_eof_I7CGS
@e globals_array_I7CGS
@e main_matter_I7CGS
@e routines_at_eof_I7CGS
@e code_at_eof_I7CGS
@ -46,6 +52,7 @@ int CodeGen::I6::begin_generation(code_generation_target *cgt, code_generation *
cg->segments[text_literals_code_I7CGS] = CodeGen::new_segment();
cg->segments[summations_at_eof_I7CGS] = CodeGen::new_segment();
cg->segments[arrays_at_eof_I7CGS] = CodeGen::new_segment();
cg->segments[globals_array_I7CGS] = CodeGen::new_segment();
cg->segments[main_matter_I7CGS] = CodeGen::new_segment();
cg->segments[routines_at_eof_I7CGS] = CodeGen::new_segment();
cg->segments[code_at_eof_I7CGS] = CodeGen::new_segment();
@ -483,3 +490,63 @@ void CodeGen::I6::declare_property(code_generation_target *cgt, code_generation
CodeGen::deselect(gen, saved);
}
}
@
=
int CodeGen::I6::prepare_variable(code_generation_target *cgt, code_generation *gen,
inter_frame P, inter_symbol *var_name, int k) {
if (Inter::Symbols::read_annotation(var_name, EXPLICIT_VARIABLE_IANN) != 1) {
if (Inter::Symbols::read_annotation(var_name, ASSIMILATED_IANN) != 1) {
text_stream *S = Str::new();
WRITE_TO(S, "(Global_Vars-->%d)", k);
Inter::Symbols::set_translate(var_name, S);
}
k++;
}
return k;
}
int CodeGen::I6::declare_variable(code_generation_target *cgt, code_generation *gen,
inter_frame P, inter_symbol *var_name, int k, int of) {
if (Inter::Symbols::read_annotation(var_name, ASSIMILATED_IANN) == 1) {
generated_segment *saved = CodeGen::select(gen, main_matter_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("Global %S = ", CodeGen::CL::name(var_name));
CodeGen::CL::literal(gen, NULL, Inter::Packages::scope_of(P), P.data[VAL1_VAR_IFLD], P.data[VAL2_VAR_IFLD], FALSE);
WRITE(";\n");
CodeGen::deselect(gen, saved);
}
if (Inter::Symbols::read_annotation(var_name, EXPLICIT_VARIABLE_IANN) != 1) {
generated_segment *saved = CodeGen::select(gen, attributes_at_eof_I7CGS);
text_stream *OUT = CodeGen::current(gen);
if (k == 0) WRITE("Array Global_Vars -->\n");
WRITE(" (");
inter_symbols_table *globals = Inter::Packages::scope_of(P);
CodeGen::CL::literal(gen, NULL, globals, P.data[VAL1_VAR_IFLD], P.data[VAL2_VAR_IFLD], FALSE);
WRITE(") ! -->%d = %S (%S)\n", k, CodeGen::CL::name(var_name), var_name->symbol_name);
k++;
if (k == of) {
if (k < 2) WRITE(" NULL NULL");
WRITE(";\n");
}
CodeGen::deselect(gen, saved);
}
return k;
}
void CodeGen::I6::declare_local_variable(code_generation_target *cgt, code_generation *gen,
inter_frame P, inter_symbol *var_name) {
text_stream *OUT = CodeGen::current(gen);
WRITE(" %S", var_name->symbol_name);
}
void CodeGen::I6::begin_constant(code_generation_target *cgt, code_generation *gen, text_stream *const_name, int continues) {
text_stream *OUT = CodeGen::current(gen);
WRITE("Constant %S", const_name);
if (continues) WRITE(" = ");
}
void CodeGen::I6::end_constant(code_generation_target *cgt, code_generation *gen, text_stream *const_name) {
text_stream *OUT = CodeGen::current(gen);
WRITE(";\n");
}

View file

@ -133,3 +133,42 @@ VMETHOD_TYPE(DECLARE_PROPERTY_MTID, code_generation_target *cgt, code_generation
void CodeGen::Targets::declare_property(code_generation *gen, inter_symbol *prop_name, int used) {
VMETHOD_CALL(gen->target, DECLARE_PROPERTY_MTID, gen, prop_name, used);
}
@
@e PREPARE_VARIABLE_MTID
@e DECLARE_VARIABLE_MTID
@e DECLARE_LOCAL_VARIABLE_MTID
=
IMETHOD_TYPE(PREPARE_VARIABLE_MTID, code_generation_target *cgt, code_generation *gen, inter_frame P, inter_symbol *var_name, int k)
IMETHOD_TYPE(DECLARE_VARIABLE_MTID, code_generation_target *cgt, code_generation *gen, inter_frame P, inter_symbol *var_name, int k, int of)
VMETHOD_TYPE(DECLARE_LOCAL_VARIABLE_MTID, code_generation_target *cgt, code_generation *gen, inter_frame P, inter_symbol *var_name)
int CodeGen::Targets::prepare_variable(code_generation *gen, inter_frame P, inter_symbol *var_name, int k) {
int rv = 0;
IMETHOD_CALL(rv, gen->target, PREPARE_VARIABLE_MTID, gen, P, var_name, k);
return rv;
}
int CodeGen::Targets::declare_variable(code_generation *gen, inter_frame P, inter_symbol *var_name, int k, int of) {
int rv = 0;
IMETHOD_CALL(rv, gen->target, DECLARE_VARIABLE_MTID, gen, P, var_name, k, of);
return rv;
}
void CodeGen::Targets::declare_local_variable(code_generation *gen, inter_frame P, inter_symbol *var_name) {
VMETHOD_CALL(gen->target, DECLARE_LOCAL_VARIABLE_MTID, gen, P, var_name);
}
@
@e BEGIN_CONSTANT_MTID
@e END_CONSTANT_MTID
=
VMETHOD_TYPE(BEGIN_CONSTANT_MTID, code_generation_target *cgt, code_generation *gen, text_stream *const_name, int continues)
VMETHOD_TYPE(END_CONSTANT_MTID, code_generation_target *cgt, code_generation *gen, text_stream *const_name)
void CodeGen::Targets::begin_constant(code_generation *gen, text_stream *const_name, int continues) {
VMETHOD_CALL(gen->target, BEGIN_CONSTANT_MTID, gen, const_name, continues);
}
void CodeGen::Targets::end_constant(code_generation *gen, text_stream *const_name) {
VMETHOD_CALL(gen->target, END_CONSTANT_MTID, gen, const_name);
}