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:
parent
fd9f539438
commit
279ccfb366
|
@ -137,7 +137,7 @@
|
|||
|
||||
<p class="endnote">The function CodeGen::Eliminate::go is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Eliminate::gone is used in 4/fc (<a href="4-fc.html#SP2">§2</a>), 4/cal (<a href="4-cal.html#SP2">§2</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Eliminate::gone is used in 4/fc (<a href="4-fc.html#SP2">§2</a>), 4/cal (<a href="4-cal.html#SP3">§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">
|
||||
|
|
|
@ -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">>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>
|
||||
<<span class="cwebmacro">Define constants for the responses</span> <span class="cwebmacronumber">1.1</span>><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NR</span><span class="plain"> > 0) </span><<span class="cwebmacro">Define an array of the responses</span> <span class="cwebmacronumber">1.2</span>><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">§3</a>).</p>
|
||||
<p class="endnote">The function CodeGen::CL::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">§8.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Define constants for the responses</span> <span class="cwebmacronumber">1.1</span>> =
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§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">>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>
|
||||
<<span class="cwebmacro">Define constants for the responses</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NR</span><span class="plain"> > 0) </span><<span class="cwebmacro">Define an array of the responses</span> <span class="cwebmacronumber">2.2</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#SP8_3">§8.3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Define constants for the responses</span> <span class="cwebmacronumber">2.1</span>> =
|
||||
</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">§1</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1_2"></a><b>§1.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Define an array of the responses</span> <span class="cwebmacronumber">1.2</span>> =
|
||||
<p class="inwebparagraph"><a id="SP2_2"></a><b>§2.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Define an array of the responses</span> <span class="cwebmacronumber">2.2</span>> =
|
||||
</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 --> "</span><span class="plain">);</span>
|
||||
|
@ -74,9 +95,9 @@
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">This code is used in <a href="#SP1">§1</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>There's a contrivance here to get around an awkward point of I6 syntax:
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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 --> 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">-></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"><</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">></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">§3</a>).</p>
|
||||
<p class="endnote">The function CodeGen::CL::sort_literals is used in 4/cg (<a href="4-cg.html#SP8_3">§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">§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">§4</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::CL::literal is used in <a href="#SP1_2">§1.2</a>, 4/fc (<a href="4-fc.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">§5.8.4.1.1</a>, <a href="4-iap.html#SP8">§8</a>), 4/vrb (<a href="4-vrb.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function CodeGen::CL::literal is used in <a href="#SP2_2">§2.2</a>, 4/fc (<a href="4-fc.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">§5.8.4.1.1</a>, <a href="4-iap.html#SP8">§8</a>), 5/gi6 (<a href="5-gi6.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::CL::name is used in <a href="#SP1_1">§1.1</a>, 4/fc (<a href="4-fc.html#SP3">§3</a>, <a href="4-fc.html#SP4">§4</a>), 4/iap (<a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5_5">§5.5</a>, <a href="4-iap.html#SP5_7">§5.7</a>, <a href="4-iap.html#SP5_8_4">§5.8.4</a>, <a href="4-iap.html#SP5_9">§5.9</a>, <a href="4-iap.html#SP5_11">§5.11</a>, <a href="4-iap.html#SP5_11_2">§5.11.2</a>, <a href="4-iap.html#SP5_11_2_1">§5.11.2.1</a>, <a href="4-iap.html#SP5_11_2_2">§5.11.2.2</a>, <a href="4-iap.html#SP6">§6</a>, <a href="4-iap.html#SP8">§8</a>), 4/vrb (<a href="4-vrb.html#SP1">§1</a>), 5/gi6 (<a href="5-gi6.html#SP5">§5</a>).</p>
|
||||
<p class="endnote">The function CodeGen::CL::name is used in <a href="#SP2_1">§2.1</a>, 4/fc (<a href="4-fc.html#SP3">§3</a>, <a href="4-fc.html#SP4">§4</a>), 4/iap (<a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5_5">§5.5</a>, <a href="4-iap.html#SP5_7">§5.7</a>, <a href="4-iap.html#SP5_8_4">§5.8.4</a>, <a href="4-iap.html#SP5_9">§5.9</a>, <a href="4-iap.html#SP5_11">§5.11</a>, <a href="4-iap.html#SP5_11_2">§5.11.2</a>, <a href="4-iap.html#SP5_11_2_1">§5.11.2.1</a>, <a href="4-iap.html#SP5_11_2_2">§5.11.2.2</a>, <a href="4-iap.html#SP6">§6</a>, <a href="4-iap.html#SP8">§8</a>), 5/gi6 (<a href="5-gi6.html#SP5">§5</a>, <a href="5-gi6.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The structure text_literal_holder is private to this section.</p>
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<!--Weave of '4/cg' generated by 7-->
|
||||
<ul class="crumbs"><li><a href="../webs.html">★</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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Generations</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Pipeline stage</a></li><li><a href="#SP2">§2. Generations</a></li><li><a href="#SP8">§8. </a></li><li><a href="#SP9">§9. Marking</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>repository</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">>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">>repository</span><span class="plain">, </span><span class="identifier">step</span><span class="plain">-</span><span class="element">>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">>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">>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">>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"><</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">>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">§1</a>, 4/fc (<a href="4-fc.html#SP3">§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>§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">§1</a>, 4/fc (<a href="4-fc.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::new_segment is used in <a href="#SP3">§3</a>, 5/gi6 (<a href="5-gi6.html#SP2">§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">§6</a>, 5/gi6 (<a href="5-gi6.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The structure generated_segment is private to this section.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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"><</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">>segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) && (</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">>segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">>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">>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">§2</a>), 4/cal (<a href="4-cal.html#SP2_1">§2.1</a>, <a href="4-cal.html#SP2_2">§2.2</a>, <a href="4-cal.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>, <a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>), 5/gi6 (<a href="5-gi6.html#SP5">§5</a>, <a href="5-gi6.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::deselect is used in 4/fc (<a href="4-fc.html#SP2">§2</a>), 4/cal (<a href="4-cal.html#SP2_1">§2.1</a>, <a href="4-cal.html#SP2_2">§2.2</a>, <a href="4-cal.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>, <a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>), 5/gi6 (<a href="5-gi6.html#SP5">§5</a>, <a href="5-gi6.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§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">>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">>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">>segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">]-</span><span class="element">>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">>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">>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">>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">§2</a>, <a href="4-fc.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">§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">§2</a>, <a href="4-fc.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">§5.8.4.1.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">>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">>segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">]-</span><span class="element">>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">>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">>segments</span><span class="plain">[</span><span class="constant">TEMP_CG_SEGMENT</span><span class="plain">]-</span><span class="element">>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">>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">>current_segment</span><span class="plain">-</span><span class="element">>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"><</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">>segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) && (</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">>segments</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]-</span><span class="element">>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">§2</a>, <a href="4-fc.html#SP3">§3</a>, <a href="4-fc.html#SP4">§4</a>), 4/cal (<a href="4-cal.html#SP2_1">§2.1</a>, <a href="4-cal.html#SP2_2">§2.2</a>, <a href="4-cal.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>, <a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>, <a href="4-iap.html#SP6">§6</a>, <a href="4-iap.html#SP8">§8</a>), 5/gi6 (<a href="5-gi6.html#SP2">§2</a>, <a href="5-gi6.html#SP3">§3</a>, <a href="5-gi6.html#SP4">§4</a>, <a href="5-gi6.html#SP5">§5</a>, <a href="5-gi6.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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>
|
||||
<<span class="cwebmacro">Phase one - preparation</span> <span class="cwebmacronumber">8.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Phase two - traverse</span> <span class="cwebmacronumber">8.2</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Phase three - consolidation</span> <span class="cwebmacronumber">8.3</span>><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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8_1"></a><b>§8.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Phase one - preparation</span> <span class="cwebmacronumber">8.1</span>> =
|
||||
</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">§8</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8_2"></a><b>§8.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Phase two - traverse</span> <span class="cwebmacronumber">8.2</span>> =
|
||||
</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">§8</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8_3"></a><b>§8.3. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Phase three - consolidation</span> <span class="cwebmacronumber">8.3</span>> =
|
||||
</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">§8</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§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">§2</a>), 4/cal (<a href="4-cal.html#SP1_1">§1.1</a>, <a href="4-cal.html#SP1_2">§1.2</a>, <a href="4-cal.html#SP2">§2</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>, <a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>), 5/gi6 (<a href="5-gi6.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::select_temporary is used in 4/fc (<a href="4-fc.html#SP2">§2</a>, <a href="4-fc.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">§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">§2</a>), 4/cal (<a href="4-cal.html#SP1_1">§1.1</a>, <a href="4-cal.html#SP1_2">§1.2</a>, <a href="4-cal.html#SP2">§2</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>, <a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>), 5/gi6 (<a href="5-gi6.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::deselect_temporary is used in 4/fc (<a href="4-fc.html#SP2">§2</a>, <a href="4-fc.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP5_8_4_1_1">§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">§2</a>, <a href="4-fc.html#SP3">§3</a>, <a href="4-fc.html#SP4">§4</a>), 4/cal (<a href="4-cal.html#SP1_1">§1.1</a>, <a href="4-cal.html#SP1_2">§1.2</a>, <a href="4-cal.html#SP2">§2</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>, <a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>, <a href="4-iap.html#SP6">§6</a>, <a href="4-iap.html#SP8">§8</a>), 4/vrb (<a href="4-vrb.html#SP1">§1</a>), 5/gi6 (<a href="5-gi6.html#SP2">§2</a>, <a href="5-gi6.html#SP3">§3</a>, <a href="5-gi6.html#SP4">§4</a>, <a href="5-gi6.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::write is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::generate is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::marked is used in 4/iap (<a href="4-iap.html#SP5_8_4">§5.8.4</a>), 5/fi (<a href="5-fi.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::mark is used in 4/iap (<a href="4-iap.html#SP5_8_4">§5.8.4</a>), 5/fi (<a href="5-fi.html#SP1">§1</a>).</p>
|
||||
|
|
|
@ -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">>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">§3</a>).</p>
|
||||
<p class="endnote">The function CodeGen::FC::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">§8.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::FC::frame is used in <a href="#SP3">§3</a>, <a href="#SP4">§4</a>, 4/cal (<a href="4-cal.html#SP2">§2</a>), 5/gi6 (<a href="5-gi6.html#SP2_1">§2.1</a>, <a href="5-gi6.html#SP2_9">§2.9</a>).</p>
|
||||
<p class="endnote">The function CodeGen::FC::iterate is used in 4/cg (<a href="4-cg.html#SP8_2">§8.2</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::FC::frame is used in <a href="#SP3">§3</a>, <a href="#SP4">§4</a>, 4/cal (<a href="4-cal.html#SP3">§3</a>), 5/gi6 (<a href="5-gi6.html#SP2_1">§2.1</a>, <a href="5-gi6.html#SP2_9">§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">-></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">-></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>
|
||||
|
|
|
@ -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">§3</a>), 4/fc (<a href="4-fc.html#SP2">§2</a>).</p>
|
||||
<p class="endnote">The function CodeGen::IP::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">§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">§8.3</a>), 4/fc (<a href="4-fc.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§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">) >= 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">>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">) && (</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"><</span><span class="identifier">inst_name</span><span class="plain">-></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">-></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">-></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>
|
||||
|
|
|
@ -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">>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">>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 -->\</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">") ! -->%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">-></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"> < 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">>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">>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-->%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">§2</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Var::prepare is used in 4/cg (<a href="4-cg.html#SP8_1">§8.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Var::set_translates is used in 4/cg (<a href="4-cg.html#SP3">§3</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Var::knowledge is used in 4/fc (<a href="4-fc.html#SP2">§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">
|
||||
|
|
|
@ -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">§2</a>), 4/cal (<a href="4-cal.html#SP1_1">§1.1</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Targets::general_segment is used in 4/fc (<a href="4-fc.html#SP2">§2</a>), 4/cal (<a href="4-cal.html#SP2_1">§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">§1.2</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Targets::default_segment is used in 4/cal (<a href="4-cal.html#SP2_2">§2.2</a>), 4/iap (<a href="4-iap.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Targets::constant_segment is used in 4/cal (<a href="4-cal.html#SP1_2">§1.2</a>), 4/iap (<a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Targets::constant_segment is used in 4/cal (<a href="4-cal.html#SP2_2">§2.2</a>), 4/iap (<a href="4-iap.html#SP4_5">§4.5</a>, <a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§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">§2</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Targets::tl_segment is used in 4/cal (<a href="4-cal.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">§2</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Targets::compile_dictionary_word is used in 4/cal (<a href="4-cal.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§2</a>).</p>
|
||||
<p class="endnote">The function CodeGen::Targets::compile_literal_text is used in 4/cal (<a href="4-cal.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§5.1</a>, <a href="4-iap.html#SP5_12">§5.12</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§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">>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">>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">>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">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Targets::declare_variable is used in 4/vrb (<a href="4-vrb.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Targets::declare_local_variable is used in 4/fc (<a href="4-fc.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP10"></a><b>§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">>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">>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">§2.1</a>, <a href="4-cal.html#SP2_2">§2.2</a>, <a href="4-cal.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>, <a href="4-iap.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Targets::end_constant is used in 4/cal (<a href="4-cal.html#SP2_1">§2.1</a>, <a href="4-cal.html#SP2_2">§2.2</a>, <a href="4-cal.html#SP3">§3</a>), 4/iap (<a href="4-iap.html#SP4_6">§4.6</a>, <a href="4-iap.html#SP5">§5</a>, <a href="4-iap.html#SP6">§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-->
|
||||
|
|
|
@ -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">>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">>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">>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">>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">>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">>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">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§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-->%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 -->\</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">") ! -->%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">-></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"> < 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">-></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">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::I6::declare_variable is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::I6::declare_local_variable is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::I6::begin_constant is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::I6::end_constant is used in <a href="#SP1">§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-->
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue