1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-01 06:24:58 +03:00

Simplified C global variables

This commit is contained in:
Graham Nelson 2021-10-25 21:44:15 +01:00
parent 05478d28e4
commit 76d2e5d70c
14 changed files with 296 additions and 146 deletions

View file

@ -414,11 +414,11 @@ but for now about 10 layers is plenty.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP4_1">&#167;4.1</a>, <a href="4-fi6.html#SP4_2">&#167;4.2</a>, <a href="4-fi6.html#SP5">&#167;5</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP3_1">&#167;3.1</a>, <a href="4-i6c.html#SP3_2">&#167;3.2</a>, <a href="4-i6c.html#SP6">&#167;6</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_1">&#167;2.1</a>, <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_3">&#167;2.3</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP4_3">&#167;4.3</a>, <a href="4-i6o.html#SP4_4">&#167;4.4</a>, <a href="4-i6o.html#SP4_5">&#167;4.5</a>, <a href="4-i6o.html#SP4_6">&#167;4.6</a>, <a href="4-i6o.html#SP5_1">&#167;5.1</a>, <a href="4-i6o.html#SP9">&#167;9</a>, <a href="4-i6o.html#SP13_1">&#167;13.1</a>, <a href="4-i6o.html#SP13_2">&#167;13.2</a>, <a href="4-i6o.html#SP13_3">&#167;13.3</a><br/>Inform 6 Code - <a href="4-i6c2.html#SP2">&#167;2</a>, <a href="4-i6c2.html#SP9">&#167;9</a><br/>Final C - <a href="5-fnc.html#SP5_2">&#167;5.2</a>, <a href="5-fnc.html#SP5_3">&#167;5.3</a>, <a href="5-fnc.html#SP6_1">&#167;6.1</a><br/>C Global Variables - <a href="5-cgv.html#SP1">&#167;1</a>, <a href="5-cgv.html#SP2">&#167;2</a><br/>C Memory Model - <a href="5-cmm.html#SP3">&#167;3</a>, <a href="5-cmm.html#SP4">&#167;4</a>, <a href="5-cmm.html#SP11">&#167;11</a>, <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP15">&#167;15</a><br/>C Object Model - <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP1_7">&#167;1.7</a>, <a href="5-com.html#SP1_8">&#167;1.8</a>, <a href="5-com.html#SP8">&#167;8</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP4_1">&#167;4.1</a>, <a href="4-fi6.html#SP4_2">&#167;4.2</a>, <a href="4-fi6.html#SP5">&#167;5</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP3_1">&#167;3.1</a>, <a href="4-i6c.html#SP3_2">&#167;3.2</a>, <a href="4-i6c.html#SP6">&#167;6</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_1">&#167;2.1</a>, <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_3">&#167;2.3</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP4_3">&#167;4.3</a>, <a href="4-i6o.html#SP4_4">&#167;4.4</a>, <a href="4-i6o.html#SP4_5">&#167;4.5</a>, <a href="4-i6o.html#SP4_6">&#167;4.6</a>, <a href="4-i6o.html#SP5_1">&#167;5.1</a>, <a href="4-i6o.html#SP9">&#167;9</a>, <a href="4-i6o.html#SP13_1">&#167;13.1</a>, <a href="4-i6o.html#SP13_2">&#167;13.2</a>, <a href="4-i6o.html#SP13_3">&#167;13.3</a><br/>Inform 6 Code - <a href="4-i6c2.html#SP2">&#167;2</a>, <a href="4-i6c2.html#SP9">&#167;9</a><br/>Final C - <a href="5-fnc.html#SP5_2">&#167;5.2</a>, <a href="5-fnc.html#SP5_3">&#167;5.3</a>, <a href="5-fnc.html#SP6_1">&#167;6.1</a><br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a>, <a href="5-cgv.html#SP3">&#167;3</a>, <a href="5-cgv.html#SP3_1">&#167;3.1</a>, <a href="5-cgv.html#SP3_2">&#167;3.2</a>, <a href="5-cgv.html#SP3_3">&#167;3.3</a>, <a href="5-cgv.html#SP3_4">&#167;3.4</a><br/>C Memory Model - <a href="5-cmm.html#SP3">&#167;3</a>, <a href="5-cmm.html#SP4">&#167;4</a>, <a href="5-cmm.html#SP11">&#167;11</a>, <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP15">&#167;15</a><br/>C Object Model - <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP1_7">&#167;1.7</a>, <a href="5-com.html#SP1_8">&#167;1.8</a>, <a href="5-com.html#SP8">&#167;8</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_layered</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select_layered</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select_layered</span></span>:<br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a><br/>C Namespace - <a href="5-cnm.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">layer</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select_layered</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select_layered</span></span>:<br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a><br/>C Namespace - <a href="5-cnm.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">layer</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">previous_pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">pos</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"poorly timed selection"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &gt;= </span><span class="identifier-syntax">NO_DEFINED_I7CGS_VALUES</span><span class="plain-syntax">)) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"out of range"</span><span class="plain-syntax">);</span>
@ -431,7 +431,7 @@ but for now about 10 layers is plenty.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">previous_pos</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::deselect</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP4_1">&#167;4.1</a>, <a href="4-fi6.html#SP4_2">&#167;4.2</a>, <a href="4-fi6.html#SP5">&#167;5</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a>, <a href="4-i6c.html#SP5">&#167;5</a>, <a href="4-i6c.html#SP6">&#167;6</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_1">&#167;2.1</a>, <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_3">&#167;2.3</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP4_3">&#167;4.3</a>, <a href="4-i6o.html#SP4_4">&#167;4.4</a>, <a href="4-i6o.html#SP4_5">&#167;4.5</a>, <a href="4-i6o.html#SP4_6">&#167;4.6</a>, <a href="4-i6o.html#SP6">&#167;6</a>, <a href="4-i6o.html#SP9">&#167;9</a>, <a href="4-i6o.html#SP13_1">&#167;13.1</a>, <a href="4-i6o.html#SP13_2">&#167;13.2</a>, <a href="4-i6o.html#SP13_3">&#167;13.3</a><br/>Inform 6 Code - <a href="4-i6c2.html#SP2">&#167;2</a>, <a href="4-i6c2.html#SP9">&#167;9</a><br/>Final C - <a href="5-fnc.html#SP5_2">&#167;5.2</a>, <a href="5-fnc.html#SP5_3">&#167;5.3</a>, <a href="5-fnc.html#SP6_1">&#167;6.1</a><br/>C Namespace - <a href="5-cnm.html#SP6">&#167;6</a><br/>C Global Variables - <a href="5-cgv.html#SP1">&#167;1</a>, <a href="5-cgv.html#SP2">&#167;2</a><br/>C Memory Model - <a href="5-cmm.html#SP3">&#167;3</a>, <a href="5-cmm.html#SP4">&#167;4</a>, <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP15">&#167;15</a><br/>C Object Model - <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP1_7">&#167;1.7</a>, <a href="5-com.html#SP1_8">&#167;1.8</a>, <a href="5-com.html#SP8">&#167;8</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::deselect</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP4_1">&#167;4.1</a>, <a href="4-fi6.html#SP4_2">&#167;4.2</a>, <a href="4-fi6.html#SP5">&#167;5</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a>, <a href="4-i6c.html#SP5">&#167;5</a>, <a href="4-i6c.html#SP6">&#167;6</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_1">&#167;2.1</a>, <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_3">&#167;2.3</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP4_3">&#167;4.3</a>, <a href="4-i6o.html#SP4_4">&#167;4.4</a>, <a href="4-i6o.html#SP4_5">&#167;4.5</a>, <a href="4-i6o.html#SP4_6">&#167;4.6</a>, <a href="4-i6o.html#SP6">&#167;6</a>, <a href="4-i6o.html#SP9">&#167;9</a>, <a href="4-i6o.html#SP13_1">&#167;13.1</a>, <a href="4-i6o.html#SP13_2">&#167;13.2</a>, <a href="4-i6o.html#SP13_3">&#167;13.3</a><br/>Inform 6 Code - <a href="4-i6c2.html#SP2">&#167;2</a>, <a href="4-i6c2.html#SP9">&#167;9</a><br/>Final C - <a href="5-fnc.html#SP5_2">&#167;5.2</a>, <a href="5-fnc.html#SP5_3">&#167;5.3</a>, <a href="5-fnc.html#SP6_1">&#167;6.1</a><br/>C Namespace - <a href="5-cnm.html#SP7">&#167;7</a><br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a>, <a href="5-cgv.html#SP3">&#167;3</a>, <a href="5-cgv.html#SP3_1">&#167;3.1</a>, <a href="5-cgv.html#SP3_2">&#167;3.2</a>, <a href="5-cgv.html#SP3_3">&#167;3.3</a>, <a href="5-cgv.html#SP3_4">&#167;3.4</a><br/>C Memory Model - <a href="5-cmm.html#SP3">&#167;3</a>, <a href="5-cmm.html#SP4">&#167;4</a>, <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP15">&#167;15</a><br/>C Object Model - <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP1_7">&#167;1.7</a>, <a href="5-com.html#SP1_8">&#167;1.8</a>, <a href="5-com.html#SP8">&#167;8</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"poorly timed deselection"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">saved</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -441,13 +441,13 @@ some temporary stream somewhere. For that, use the following pair:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select_temporary</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select_temporary</span></span>:<br/><a href="2-cg.html#SP4">&#167;4</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a><br/>Vanilla Objects - <a href="2-vo.html#SP2_2_1_2">&#167;2.2.1.2</a>, <a href="2-vo.html#SP4_1_1_1_1_1_1">&#167;4.1.1.1.1.1.1</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP11">&#167;11</a><br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Object Model - <a href="5-com.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select_temporary</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select_temporary</span></span>:<br/><a href="2-cg.html#SP4">&#167;4</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a><br/>Vanilla Objects - <a href="2-vo.html#SP2_2_1_2">&#167;2.2.1.2</a>, <a href="2-vo.html#SP4_1_1_1_1_1_1">&#167;4.1.1.1.1.1.1</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP11">&#167;11</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Object Model - <a href="5-com.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"nested temporary segments"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">T</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::deselect_temporary</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect_temporary</span></span>:<br/><a href="2-cg.html#SP4">&#167;4</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a><br/>Vanilla Objects - <a href="2-vo.html#SP2_2_1_2">&#167;2.2.1.2</a>, <a href="2-vo.html#SP4_1_1_1_1_1_1">&#167;4.1.1.1.1.1.1</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP11">&#167;11</a><br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Object Model - <a href="5-com.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::deselect_temporary</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect_temporary</span></span>:<br/><a href="2-cg.html#SP4">&#167;4</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a><br/>Vanilla Objects - <a href="2-vo.html#SP2_2_1_2">&#167;2.2.1.2</a>, <a href="2-vo.html#SP4_1_1_1_1_1_1">&#167;4.1.1.1.1.1.1</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP11">&#167;11</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Object Model - <a href="5-com.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted_to</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -457,7 +457,7 @@ if it has been "temporarily diverted" then the regiular selection is ignored.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">CodeGen::current</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">CodeGen::current</span></span>:<br/><a href="2-cg.html#SP16_1">&#167;16.1</a><br/>Vanilla - <a href="2-vnl.html#SP4">&#167;4</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP5">&#167;5</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP4_1">&#167;4.1</a>, <a href="4-fi6.html#SP4_2">&#167;4.2</a>, <a href="4-fi6.html#SP5">&#167;5</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a>, <a href="4-i6c.html#SP3_1">&#167;3.1</a>, <a href="4-i6c.html#SP3_2">&#167;3.2</a>, <a href="4-i6c.html#SP4">&#167;4</a>, <a href="4-i6c.html#SP5">&#167;5</a>, <a href="4-i6c.html#SP6">&#167;6</a>, <a href="4-i6c.html#SP7">&#167;7</a>, <a href="4-i6c.html#SP8">&#167;8</a>, <a href="4-i6c.html#SP9">&#167;9</a>, <a href="4-i6c.html#SP10">&#167;10</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_1">&#167;2.1</a>, <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_3">&#167;2.3</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a>, <a href="4-i6gv.html#SP3">&#167;3</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP4_3">&#167;4.3</a>, <a href="4-i6o.html#SP4_4">&#167;4.4</a>, <a href="4-i6o.html#SP4_5">&#167;4.5</a>, <a href="4-i6o.html#SP4_6">&#167;4.6</a>, <a href="4-i6o.html#SP5_1">&#167;5.1</a>, <a href="4-i6o.html#SP6">&#167;6</a>, <a href="4-i6o.html#SP9">&#167;9</a>, <a href="4-i6o.html#SP10">&#167;10</a>, <a href="4-i6o.html#SP11">&#167;11</a>, <a href="4-i6o.html#SP13_1">&#167;13.1</a>, <a href="4-i6o.html#SP13_2">&#167;13.2</a>, <a href="4-i6o.html#SP13_3">&#167;13.3</a><br/>Inform 6 Code - <a href="4-i6c2.html#SP2">&#167;2</a>, <a href="4-i6c2.html#SP2_2">&#167;2.2</a>, <a href="4-i6c2.html#SP3">&#167;3</a>, <a href="4-i6c2.html#SP4">&#167;4</a>, <a href="4-i6c2.html#SP5">&#167;5</a>, <a href="4-i6c2.html#SP6">&#167;6</a>, <a href="4-i6c2.html#SP6_4">&#167;6.4</a>, <a href="4-i6c2.html#SP9">&#167;9</a><br/>Final C - <a href="5-fnc.html#SP5_2">&#167;5.2</a>, <a href="5-fnc.html#SP5_3">&#167;5.3</a>, <a href="5-fnc.html#SP6_1">&#167;6.1</a><br/>C Namespace - <a href="5-cnm.html#SP6">&#167;6</a><br/>C References - <a href="5-crf.html#SP2">&#167;2</a><br/>C Global Variables - <a href="5-cgv.html#SP1">&#167;1</a>, <a href="5-cgv.html#SP2">&#167;2</a><br/>C Memory Model - <a href="5-cmm.html#SP3">&#167;3</a>, <a href="5-cmm.html#SP4">&#167;4</a>, <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP13">&#167;13</a>, <a href="5-cmm.html#SP15">&#167;15</a>, <a href="5-cmm.html#SP16">&#167;16</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Program Control - <a href="5-cpc.html#SP1">&#167;1</a>, <a href="5-cpc.html#SP2">&#167;2</a><br/>C Arithmetic - <a href="5-car.html#SP1">&#167;1</a><br/>C Conditions - <a href="5-ccn.html#SP1">&#167;1</a>, <a href="5-ccn.html#SP2">&#167;2</a><br/>C Object Model - <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP1_7">&#167;1.7</a>, <a href="5-com.html#SP1_8">&#167;1.8</a>, <a href="5-com.html#SP8">&#167;8</a>, <a href="5-com.html#SP9">&#167;9</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a>, <a href="5-clt.html#SP4">&#167;4</a>, <a href="5-clt.html#SP5">&#167;5</a><br/>C Input-Output Model - <a href="5-cim.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">CodeGen::current</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">CodeGen::current</span></span>:<br/><a href="2-cg.html#SP16_1">&#167;16.1</a><br/>Vanilla - <a href="2-vnl.html#SP4">&#167;4</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP5">&#167;5</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP4_1">&#167;4.1</a>, <a href="4-fi6.html#SP4_2">&#167;4.2</a>, <a href="4-fi6.html#SP5">&#167;5</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a>, <a href="4-i6c.html#SP3_1">&#167;3.1</a>, <a href="4-i6c.html#SP3_2">&#167;3.2</a>, <a href="4-i6c.html#SP4">&#167;4</a>, <a href="4-i6c.html#SP5">&#167;5</a>, <a href="4-i6c.html#SP6">&#167;6</a>, <a href="4-i6c.html#SP7">&#167;7</a>, <a href="4-i6c.html#SP8">&#167;8</a>, <a href="4-i6c.html#SP9">&#167;9</a>, <a href="4-i6c.html#SP10">&#167;10</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_1">&#167;2.1</a>, <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_3">&#167;2.3</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a>, <a href="4-i6gv.html#SP3">&#167;3</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP4_3">&#167;4.3</a>, <a href="4-i6o.html#SP4_4">&#167;4.4</a>, <a href="4-i6o.html#SP4_5">&#167;4.5</a>, <a href="4-i6o.html#SP4_6">&#167;4.6</a>, <a href="4-i6o.html#SP5_1">&#167;5.1</a>, <a href="4-i6o.html#SP6">&#167;6</a>, <a href="4-i6o.html#SP9">&#167;9</a>, <a href="4-i6o.html#SP10">&#167;10</a>, <a href="4-i6o.html#SP11">&#167;11</a>, <a href="4-i6o.html#SP13_1">&#167;13.1</a>, <a href="4-i6o.html#SP13_2">&#167;13.2</a>, <a href="4-i6o.html#SP13_3">&#167;13.3</a><br/>Inform 6 Code - <a href="4-i6c2.html#SP2">&#167;2</a>, <a href="4-i6c2.html#SP2_2">&#167;2.2</a>, <a href="4-i6c2.html#SP3">&#167;3</a>, <a href="4-i6c2.html#SP4">&#167;4</a>, <a href="4-i6c2.html#SP5">&#167;5</a>, <a href="4-i6c2.html#SP6">&#167;6</a>, <a href="4-i6c2.html#SP6_4">&#167;6.4</a>, <a href="4-i6c2.html#SP9">&#167;9</a><br/>Final C - <a href="5-fnc.html#SP5_2">&#167;5.2</a>, <a href="5-fnc.html#SP5_3">&#167;5.3</a>, <a href="5-fnc.html#SP6_1">&#167;6.1</a><br/>C Namespace - <a href="5-cnm.html#SP7">&#167;7</a><br/>C References - <a href="5-crf.html#SP2">&#167;2</a><br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a>, <a href="5-cgv.html#SP3">&#167;3</a>, <a href="5-cgv.html#SP3_1">&#167;3.1</a>, <a href="5-cgv.html#SP3_2">&#167;3.2</a>, <a href="5-cgv.html#SP3_3">&#167;3.3</a>, <a href="5-cgv.html#SP3_4">&#167;3.4</a>, <a href="5-cgv.html#SP4">&#167;4</a><br/>C Memory Model - <a href="5-cmm.html#SP3">&#167;3</a>, <a href="5-cmm.html#SP4">&#167;4</a>, <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP13">&#167;13</a>, <a href="5-cmm.html#SP15">&#167;15</a>, <a href="5-cmm.html#SP16">&#167;16</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Program Control - <a href="5-cpc.html#SP1">&#167;1</a>, <a href="5-cpc.html#SP2">&#167;2</a><br/>C Arithmetic - <a href="5-car.html#SP1">&#167;1</a><br/>C Conditions - <a href="5-ccn.html#SP1">&#167;1</a>, <a href="5-ccn.html#SP2">&#167;2</a><br/>C Object Model - <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP1_7">&#167;1.7</a>, <a href="5-com.html#SP1_8">&#167;1.8</a>, <a href="5-com.html#SP8">&#167;8</a>, <a href="5-com.html#SP9">&#167;9</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a>, <a href="5-clt.html#SP4">&#167;4</a>, <a href="5-clt.html#SP5">&#167;5</a><br/>C Input-Output Model - <a href="5-cim.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="identifier-syntax">temporarily_diverted_to</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">pos</span><span class="plain-syntax">.</span><span class="element-syntax">current_segment</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
@ -533,7 +533,7 @@ extracted from some Inter instruction.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cg.html#SP16_1" class="named-paragraph-link"><span class="named-paragraph">Generate from a value pair</span><span class="named-paragraph-number">16.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::pair</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">CodeGen::pair</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a>, <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP4_1_1_1_1_1_1">&#167;4.1.1.1.1.1.1</a><br/>Vanilla Code - <a href="2-vc2.html#SP4">&#167;4</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP3_1">&#167;3.1</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP11">&#167;11</a><br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a><br/>C Object Model - <a href="5-com.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::pair</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">CodeGen::pair</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a>, <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP4_1_1_1_1_1_1">&#167;4.1.1.1.1.1.1</a><br/>Vanilla Code - <a href="2-vc2.html#SP4">&#167;4</a><br/>Inform 6 Constants - <a href="4-i6c.html#SP3_1">&#167;3.1</a><br/>Inform 6 Global Variables - <a href="4-i6gv.html#SP2_2">&#167;2.2</a>, <a href="4-i6gv.html#SP2_4">&#167;2.4</a><br/>Inform 6 Objects - <a href="4-i6o.html#SP11">&#167;11</a><br/>C Global Variables - <a href="5-cgv.html#SP3_4">&#167;3.4</a><br/>C Object Model - <a href="5-com.html#SP8">&#167;8</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val1</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val2</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbols_table</span><span class="plain-syntax"> *</span><span class="identifier-syntax">T</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">?(</span><span class="identifier-syntax">Inter::Packages::scope_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">)):</span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cg.html#SP16_1" class="named-paragraph-link"><span class="named-paragraph">Generate from a value pair</span><span class="named-paragraph-number">16.1</span></a></span><span class="plain-syntax">;</span>

View file

@ -277,7 +277,7 @@ that, it will have to make other arrangements.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VanillaConstants::definition_value</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">VanillaConstants::definition_value</span></span>:<br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a>, <a href="4-i6c.html#SP2_4">&#167;2.4</a>, <a href="4-i6c.html#SP2_5">&#167;2.5</a><br/>C Namespace - <a href="5-cnm.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">form</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">VanillaConstants::definition_value</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">VanillaConstants::definition_value</span></span>:<br/>Inform 6 Constants - <a href="4-i6c.html#SP2">&#167;2</a>, <a href="4-i6c.html#SP2_4">&#167;2.4</a>, <a href="4-i6c.html#SP2_5">&#167;2.5</a><br/>C Namespace - <a href="5-cnm.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">form</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>

View file

@ -21,7 +21,6 @@ function togglePopup(material_id) {
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Extracts-Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
@ -74,95 +73,157 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inter Modules</a></li><li><a href="index.html">final</a></li><li><a href="index.html#5">Chapter 5: C</a></li><li><b>C Global Variables</b></li></ul></div>
<p class="purpose">Global variables translated to C.</p>
<ul class="toc"><li><a href="5-cgv.html#SP1">&#167;1. Setting up the model</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Setting up the model. </b></p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::initialise</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">CGlobals::initialise</span></span>:<br/>Final C - <a href="5-fnc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_VARIABLES_MTID</span><span class="plain-syntax">, </span><a href="5-cgv.html#SP2" class="function-link"><span class="function-syntax">CGlobals::declare_variables</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">EVALUATE_VARIABLE_MTID</span><span class="plain-syntax">, </span><a href="5-cgv.html#SP2" class="function-link"><span class="function-syntax">CGlobals::evaluate_variable</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_VARIABLES_MTID</span><span class="plain-syntax">, </span><a href="5-cgv.html#SP3" class="function-link"><span class="function-syntax">CGlobals::declare_variables</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">EVALUATE_VARIABLE_MTID</span><span class="plain-syntax">, </span><a href="5-cgv.html#SP4" class="function-link"><span class="function-syntax">CGlobals::evaluate_variable</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">C_generation_variables_data</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">C_generation_variables_data</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::initialise_data</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CGlobals::initialise_data</span></span>:<br/>Final C - <a href="5-fnc.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">C_GEN_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">vardata</span><span class="plain-syntax">.</span><span class="element-syntax">no_variables</span><span class="plain-syntax">) = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure C_generation_variables_data is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The basic scheme is this: the global Inter variables are going to have
their values stored in an array, so to identify which variable you are reading
or writing, you need an index (i.e., position) in that array.
</p>
<p class="commentary">The main thing we need to compile is a (static) array of initial values for
these variables, so that a new process can be initialised. But we must also
define constants to refer to their positions in the array.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::begin</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">CGlobals::begin</span></span>:<br/>Final C - <a href="5-fnc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::end</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">CGlobals::end</span></span>:<br/>Final C - <a href="5-fnc.html#SP6">&#167;6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_ids_and_maxima_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"#define i7_no_variables %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"#define i7_var_self 0\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"i7word_t i7_initial_variable_values[];\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_globals_array_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"i7word_t i7_initial_variable_values[] = { 0 %S };\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"#define i7_no_variables %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_GEN_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">vardata</span><span class="plain-syntax">.</span><span class="element-syntax">no_variables</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"i7word_t i7_initial_variable_values[i7_no_variables];\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>We will assign the global variables unique index numbers 0, 1, 2, ..., with
the special variable <span class="extract"><span class="extract-syntax">self</span></span> given index 0. Note that <span class="extract"><span class="extract-syntax">self</span></span> always exists,
but has no Inter declaration node.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::declare_variables</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">CGlobals::declare_variables</span></span>:<br/><a href="5-cgv.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_globals_array_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"i7word_t i7_initial_variable_values[i7_no_variables] = {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cgv.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Define a constant for the self position in the globals array</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cgv.html#SP3_3" class="named-paragraph-link"><span class="named-paragraph">Add the initial value for self to the globals array</span><span class="named-paragraph-number">3.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cgv.html#SP3_5" class="named-paragraph-link"><span class="named-paragraph">Define a more legible constant for self to the header target</span><span class="named-paragraph-number">3.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax"> = </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">var_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-cgv.html#SP2" class="function-link"><span class="function-syntax">CGlobals::declare_variable_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">), </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Metadata::read_optional_textual</span><span class="plain-syntax">(</span><span class="identifier-syntax">Inter::Packages::container</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"^name"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP4" class="function-link"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP4" class="function-link"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">), </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax"> - </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cgv.html#SP3_2" class="named-paragraph-link"><span class="named-paragraph">Define a constant for this position in the globals array</span><span class="named-paragraph-number">3.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cgv.html#SP3_4" class="named-paragraph-link"><span class="named-paragraph">Add the initial value to the globals array</span><span class="named-paragraph-number">3.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-cgv.html#SP3_6" class="named-paragraph-link"><span class="named-paragraph">Define a more legible constant for the header target</span><span class="named-paragraph-number">3.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">C_GEN_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">vardata</span><span class="plain-syntax">.</span><span class="element-syntax">no_variables</span><span class="plain-syntax">) = </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::declare_variable_by_name</span><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"};\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3_1" class="paragraph-anchor"></a><b>&#167;3.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Define a constant for the self position in the globals array</span><span class="named-paragraph-number">3.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_ids_and_maxima_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"#define "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cnm.html#SP5" class="function-link"><span class="function-syntax">CNamespace::mangle_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"self"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" 0\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-cgv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_2" class="paragraph-anchor"></a><b>&#167;3.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Define a constant for this position in the globals array</span><span class="named-paragraph-number">3.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_predeclarations_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"#define i7_var_%S %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"#define "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cnm.html#SP5" class="function-link"><span class="function-syntax">CNamespace::mangle_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %d\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-cgv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_3" class="paragraph-anchor"></a><b>&#167;3.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add the initial value for self to the globals array</span><span class="named-paragraph-number">3.3</span></span><span class="comment-syntax"> =</span>
</p>
<span class="plain-syntax"> </span><span class="identifier-syntax">C_var_count</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP11" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax">, </span><span class="string-syntax">", "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">) </span><a href="2-cg.html#SP16" class="function-link"><span class="function-syntax">CodeGen::pair</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">VAL1_VAR_IFLD</span><span class="plain-syntax">], </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">VAL2_VAR_IFLD</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax">, </span><span class="string-syntax">"0"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP11" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">C_var_vals</span><span class="plain-syntax">, </span><span class="string-syntax">" /* %S */\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::evaluate_variable</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">CGlobals::evaluate_variable</span></span>:<br/><a href="5-cgv.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_reference</span><span class="plain-syntax">) {</span>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_globals_array_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"proc-&gt;state.variables[i7_var_%S]"</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" 0 /* self */\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-cgv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_4" class="paragraph-anchor"></a><b>&#167;3.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Add the initial value to the globals array</span><span class="named-paragraph-number">3.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_globals_array_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">", "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">var_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP16" class="function-link"><span class="function-syntax">CodeGen::pair</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">VAL1_VAR_IFLD</span><span class="plain-syntax">], </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">VAL2_VAR_IFLD</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"0"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" /* %S */\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-cgv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_5" class="paragraph-anchor"></a><b>&#167;3.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Define a more legible constant for self to the header target</span><span class="named-paragraph-number">3.5</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="5-com.html#SP4" class="function-link"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"self"</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-cgv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP3_6" class="paragraph-anchor"></a><b>&#167;3.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Define a more legible constant for the header target</span><span class="named-paragraph-number">3.6</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Metadata::read_optional_textual</span><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::Packages::container</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">definition</span><span class="plain-syntax">), </span><span class="identifier-syntax">I</span><span class="string-syntax">"^name"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP4" class="function-link"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP4" class="function-link"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">N</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-cgv.html#SP3">&#167;3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Within a process <span class="extract"><span class="extract-syntax">proc</span></span>, the current value of variable <span class="extract"><span class="extract-syntax">i</span></span> is <span class="extract"><span class="extract-syntax">proc-&gt;state.variables[i]</span></span>.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CGlobals::evaluate_variable</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">CGlobals::evaluate_variable</span></span>:<br/><a href="5-cgv.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_reference</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"proc-&gt;state.variables["</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cnm.html#SP5" class="function-link"><span class="function-syntax">CNamespace::mangle_variable</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"]"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="Extracts-displayed-code all-displayed-code code-font">
<span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_read_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">);</span>
<span class="Extracts-identifier-syntax">void</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_write_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">val</span><span class="Extracts-plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This is part of the extract file inform7_clib.h.</li></ul>
<pre class="Extracts-displayed-code all-displayed-code code-font">
<span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_read_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">) {</span>
<span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">return</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">-&gt;</span><span class="Extracts-identifier-syntax">state</span><span class="Extracts-plain-syntax">.</span><span class="Extracts-identifier-syntax">variables</span><span class="Extracts-plain-syntax">[</span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">];</span>
<span class="Extracts-plain-syntax">}</span>
<span class="Extracts-identifier-syntax">void</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_write_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">val</span><span class="Extracts-plain-syntax">) {</span>
<span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">-&gt;</span><span class="Extracts-identifier-syntax">state</span><span class="Extracts-plain-syntax">.</span><span class="Extracts-identifier-syntax">variables</span><span class="Extracts-plain-syntax">[</span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">] = </span><span class="Extracts-identifier-syntax">val</span><span class="Extracts-plain-syntax">;</span>
<span class="Extracts-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is part of the extract file inform7_clib.c.</li></ul>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-crf.html">&#10094;</a></li><li class="progresschapter"><a href="1-fm.html">1</a></li><li class="progresschapter"><a href="2-cg.html">2</a></li><li class="progresschapter"><a href="3-fti.html">3</a></li><li class="progresschapter"><a href="4-fi6.html">4</a></li><li class="progresscurrentchapter">5</li><li class="progresssection"><a href="5-fnc.html">fnc</a></li><li class="progresssection"><a href="5-cnm.html">cnm</a></li><li class="progresssection"><a href="5-crf.html">crf</a></li><li class="progresscurrent">cgv</li><li class="progresssection"><a href="5-cmm.html">cmm</a></li><li class="progresssection"><a href="5-cas.html">cas</a></li><li class="progresssection"><a href="5-cpc.html">cpc</a></li><li class="progresssection"><a href="5-car.html">car</a></li><li class="progresssection"><a href="5-ccn.html">ccn</a></li><li class="progresssection"><a href="5-com.html">com</a></li><li class="progresssection"><a href="5-cfm.html">cfm</a></li><li class="progresssection"><a href="5-clt.html">clt</a></li><li class="progresssection"><a href="5-cim.html">cim</a></li><li class="progresssection"><a href="5-cuf.html">cuf</a></li><li class="progressnext"><a href="5-cmm.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -78,7 +78,7 @@ function togglePopup(material_id) {
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::initialise</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">CNamespace::initialise</span></span>:<br/>Final C - <a href="5-fnc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">MANGLE_IDENTIFIER_MTID</span><span class="plain-syntax">, </span><a href="5-cnm.html#SP3" class="function-link"><span class="function-syntax">CNamespace::mangle</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_CONSTANT_MTID</span><span class="plain-syntax">, </span><a href="5-cnm.html#SP6" class="function-link"><span class="function-syntax">CNamespace::declare_constant</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_CONSTANT_MTID</span><span class="plain-syntax">, </span><a href="5-cnm.html#SP7" class="function-link"><span class="function-syntax">CNamespace::declare_constant</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>A fundamental decision we have to make here is what namespace of identifiers
@ -110,7 +110,7 @@ sparingly in Inter, and these can never arise.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::mangle</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CNamespace::mangle</span></span>:<br/><a href="5-cnm.html#SP1">&#167;1</a>, <a href="5-cnm.html#SP6">&#167;6</a><br/>C Memory Model - <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP11_3">&#167;11.3</a>, <a href="5-cmm.html#SP15">&#167;15</a><br/>C Object Model - <a href="5-com.html#SP1_3">&#167;1.3</a>, <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP8">&#167;8</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::mangle</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CNamespace::mangle</span></span>:<br/><a href="5-cnm.html#SP1">&#167;1</a>, <a href="5-cnm.html#SP7">&#167;7</a><br/>C Memory Model - <a href="5-cmm.html#SP11_2">&#167;11.2</a>, <a href="5-cmm.html#SP11_3">&#167;11.3</a>, <a href="5-cmm.html#SP15">&#167;15</a><br/>C Object Model - <a href="5-com.html#SP1_3">&#167;1.3</a>, <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP8">&#167;8</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::get_first_char</span><span class="plain-syntax">(</span><span class="identifier-syntax">identifier</span><span class="plain-syntax">) == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"i7_ss_"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">)</span>
@ -136,7 +136,18 @@ example:
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT</span><span class="plain-syntax">(</span><span class="identifier-syntax">Str::get</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Local variable names have to be handled slightly differently. This is because
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Global variable names are similarly mangled:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> howmayyou i7_var_howmayyou</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::mangle_variable</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">CNamespace::mangle_variable</span></span>:<br/>C Global Variables - <a href="5-cgv.html#SP3_1">&#167;3.1</a>, <a href="5-cgv.html#SP3_2">&#167;3.2</a>, <a href="5-cgv.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">var</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"i7_var_%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">var</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>Local variable names have to be handled slightly differently. This is because
Inter frequently makes use of local variables whose identifiers are also used
for some global construct. Of course, C also allows for this: for example &mdash;
</p>
@ -181,8 +192,8 @@ to begin with <span class="extract"><span class="extract-syntax">local_</span></
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::fix_locals</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">CNamespace::fix_locals</span></span>:<br/>Final C - <a href="5-fnc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">, </span><a href="5-cnm.html#SP5" class="function-link"><span class="function-syntax">CNamespace::sweep_for_locals</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">LOCAL_IST</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::fix_locals</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">CNamespace::fix_locals</span></span>:<br/>Final C - <a href="5-fnc.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">, </span><a href="5-cnm.html#SP6" class="function-link"><span class="function-syntax">CNamespace::sweep_for_locals</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">LOCAL_IST</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::sweep_for_locals</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
@ -195,12 +206,12 @@ to begin with <span class="extract"><span class="extract-syntax">local_</span></
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>Constants in Inter are indeed directly converted to <span class="extract"><span class="extract-syntax">#define</span></span>d constants in C,
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Constants in Inter are indeed directly converted to <span class="extract"><span class="extract-syntax">#define</span></span>d constants in C,
but with their names of course mangled:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::declare_constant</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">CNamespace::declare_constant</span></span>:<br/><a href="5-cnm.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CNamespace::declare_constant</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">CNamespace::declare_constant</span></span>:<br/><a href="5-cnm.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">const_s</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">form</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_layered</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_constants_I7CGS</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::Constant::constant_depth</span><span class="plain-syntax">(</span><span class="identifier-syntax">const_s</span><span class="plain-syntax">));</span>

View file

@ -495,7 +495,7 @@ defining this as a constant equal to its ID.
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></span>:<br/>C Global Variables - <a href="5-cgv.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">CObjectModel::define_header_constant_for_variable</span></span>:<br/>C Global Variables - <a href="5-cgv.html#SP3_5">&#167;3.5</a>, <a href="5-cgv.html#SP3_6">&#167;3.6</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">var_name</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">id</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">c_variable_symbols_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP12" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>

View file

@ -68,6 +68,22 @@
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b></p>
<pre class="Extracts-displayed-code all-displayed-code code-font">
<span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_read_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">);</span>
<span class="Extracts-identifier-syntax">void</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_write_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">val</span><span class="Extracts-plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This is part of the extract file inform7_clib.h.</li></ul>
<pre class="Extracts-displayed-code all-displayed-code code-font">
<span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_read_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">) {</span>
<span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">return</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">-&gt;</span><span class="Extracts-identifier-syntax">state</span><span class="Extracts-plain-syntax">.</span><span class="Extracts-identifier-syntax">variables</span><span class="Extracts-plain-syntax">[</span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">];</span>
<span class="Extracts-plain-syntax">}</span>
<span class="Extracts-identifier-syntax">void</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_write_variable</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">val</span><span class="Extracts-plain-syntax">) {</span>
<span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">-&gt;</span><span class="Extracts-identifier-syntax">state</span><span class="Extracts-plain-syntax">.</span><span class="Extracts-identifier-syntax">variables</span><span class="Extracts-plain-syntax">[</span><span class="Extracts-identifier-syntax">var_id</span><span class="Extracts-plain-syntax">] = </span><span class="Extracts-identifier-syntax">val</span><span class="Extracts-plain-syntax">;</span>
<span class="Extracts-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is part of the extract file inform7_clib.c.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="Extracts-displayed-code all-displayed-code code-font">
<span class="Extracts-identifier-syntax">char</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">i7_read_string</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">S</span><span class="Extracts-plain-syntax">);</span>
<span class="Extracts-identifier-syntax">void</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">i7_write_string</span><span class="Extracts-plain-syntax">(</span><span class="Extracts-identifier-syntax">i7process_t</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">proc</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">i7word_t</span><span class="Extracts-plain-syntax"> </span><span class="Extracts-identifier-syntax">S</span><span class="Extracts-plain-syntax">, </span><span class="Extracts-identifier-syntax">char</span><span class="Extracts-plain-syntax"> *</span><span class="Extracts-identifier-syntax">A</span><span class="Extracts-plain-syntax">);</span>
@ -128,7 +144,7 @@
<span class="Extracts-plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This is part of the extract file inform7_clib.c.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="Extracts-displayed-code all-displayed-code code-font">
<span class="Extracts-plain-syntax">#</span><span class="Extracts-identifier-syntax">endif</span>

View file

@ -183,6 +183,7 @@ code can interface with it. Both are divided into segments. The main file thus:
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">C_generation_function_model_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">fndata</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">C_generation_object_model_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">objdata</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">C_generation_literals_model_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">litdata</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">C_generation_variables_data</span><span class="plain-syntax"> </span><span class="identifier-syntax">vardata</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">C_generation_data</span><span class="plain-syntax">;</span>
@ -213,12 +214,12 @@ manage the process.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-fnc.html#SP5_2" class="named-paragraph-link"><span class="named-paragraph">Compile the Clib header inclusion and some clang pragmas</span><span class="named-paragraph-number">5.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-fnc.html#SP5_3" class="named-paragraph-link"><span class="named-paragraph">Compile the Clib code inclusion</span><span class="named-paragraph-number">5.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-cnm.html#SP5" class="function-link"><span class="function-syntax">CNamespace::fix_locals</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cnm.html#SP6" class="function-link"><span class="function-syntax">CNamespace::fix_locals</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cmm.html#SP3" class="function-link"><span class="function-syntax">CMemoryModel::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cfm.html#SP1" class="function-link"><span class="function-syntax">CFunctionModel::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP1" class="function-link"><span class="function-syntax">CObjectModel::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-clt.html#SP1" class="function-link"><span class="function-syntax">CLiteralsModel::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cgv.html#SP1" class="function-link"><span class="function-syntax">CGlobals::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cgv.html#SP2" class="function-link"><span class="function-syntax">CGlobals::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cas.html#SP1" class="function-link"><span class="function-syntax">CAssembly::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cim.html#SP1" class="function-link"><span class="function-syntax">CInputOutputModel::begin</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
@ -281,7 +282,7 @@ manage the process.
<span class="plain-syntax"> </span><a href="5-cfm.html#SP1" class="function-link"><span class="function-syntax">CFunctionModel::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP1" class="function-link"><span class="function-syntax">CObjectModel::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-clt.html#SP1" class="function-link"><span class="function-syntax">CLiteralsModel::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cgv.html#SP1" class="function-link"><span class="function-syntax">CGlobals::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cgv.html#SP2" class="function-link"><span class="function-syntax">CGlobals::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cas.html#SP1" class="function-link"><span class="function-syntax">CAssembly::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cim.html#SP1" class="function-link"><span class="function-syntax">CInputOutputModel::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-cmm.html#SP4" class="function-link"><span class="function-syntax">CMemoryModel::end</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">); </span><span class="comment-syntax"> must be last to end</span>

View file

@ -1,24 +1,24 @@
100.0% in inform7 run
55.3% in compilation to Inter
39.8% in //Sequence::undertake_queued_tasks//
3.5% in //MajorNodes::pre_pass//
55.1% in compilation to Inter
39.7% in //Sequence::undertake_queued_tasks//
3.4% in //MajorNodes::pre_pass//
2.6% in //MajorNodes::pass_1//
2.0% in //RTPhrasebook::compile_entries//
1.3% in //ImperativeDefinitions::assess_all//
1.0% in //RTKindConstructors::compile//
1.2% in //RTKindConstructors::compile//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //MajorNodes::pass_2//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //Sequence::undertake_queued_tasks//
0.4% in //World::stage_V//
0.1% in //CompletionModule::compile//
0.2% in //CompletionModule::compile//
0.1% in //InferenceSubjects::emit_all//
0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
2.1% not specifically accounted for
42.7% in running Inter pipeline
12.1% in step preparation
1.8% not specifically accounted for
42.9% in running Inter pipeline
12.2% in step preparation
9.7% in inter step 7/16: consolidate-text
7.9% in inter step 2/16: link
6.4% in inter step 16/16: generate inform6 -> auto.inf

View file

@ -90,12 +90,6 @@ void i7_fatal_exit(i7process_t *proc) {
void i7_benign_exit(i7process_t *proc) {
longjmp(proc->execution_env, 2);
}
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id) {
return proc->state.variables[var_id];
}
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val) {
proc->state.variables[var_id] = val;
}
i7byte_t i7_initial_memory[];
void i7_initialise_state(i7process_t *proc) {
if (proc->state.memory != NULL) free(proc->state.memory);
@ -1713,6 +1707,12 @@ void i7_print_box(i7process_t *proc, i7word_t x) {
i7word_t fn_i7_mgl_pending_boxed_quotation(i7process_t *proc) {
return 0;
}
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id) {
return proc->state.variables[var_id];
}
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val) {
proc->state.variables[var_id] = val;
}
i7word_t fn_i7_mgl_TEXT_TY_Transmute(i7process_t *proc, i7word_t i7_mgl_local_txt);
i7word_t fn_i7_mgl_BlkValueRead(i7process_t *proc, i7word_t i7_mgl_local_from, i7word_t i7_mgl_local_pos, i7word_t i7_mgl_local_do_not_indirect, i7word_t i7_mgl_local_long_block, i7word_t i7_mgl_local_chunk_size_in_bytes, i7word_t i7_mgl_local_header_size_in_bytes, i7word_t i7_mgl_local_flags, i7word_t i7_mgl_local_entry_size_in_bytes, i7word_t i7_mgl_local_seek_byte_position);
i7word_t fn_i7_mgl_BlkValueWrite(i7process_t *proc, i7word_t i7_mgl_local_to, i7word_t i7_mgl_local_pos, i7word_t i7_mgl_local_val, i7word_t i7_mgl_local_do_not_indirect, i7word_t i7_mgl_local_long_block, i7word_t i7_mgl_local_chunk_size_in_bytes, i7word_t i7_mgl_local_header_size_in_bytes, i7word_t i7_mgl_local_flags, i7word_t i7_mgl_local_entry_size_in_bytes, i7word_t i7_mgl_local_seek_byte_position);

View file

@ -68,8 +68,6 @@ void i7_initializer(i7process_t *proc); /* part of the compiled story, not infor
#define i7_lvalue_POSTINC 5
#define i7_lvalue_SETBIT 6
#define i7_lvalue_CLEARBIT 7
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id);
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val);
void i7_initialise_state(i7process_t *proc);
void i7_copy_state(i7process_t *proc, i7state_t *to, i7state_t *from);
void i7_destroy_state(i7process_t *proc, i7state_t *s);
@ -449,6 +447,8 @@ void i7_print_name(i7process_t *proc, i7word_t x);
void i7_print_object(i7process_t *proc, i7word_t x);
void i7_print_box(i7process_t *proc, i7word_t x);
void i7_read(i7process_t *proc, i7word_t x);
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id);
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val);
char *i7_read_string(i7process_t *proc, i7word_t S);
void i7_write_string(i7process_t *proc, i7word_t S, char *A);
i7word_t *i7_read_list(i7process_t *proc, i7word_t S, int *N);

View file

@ -2,88 +2,122 @@
Global variables translated to C.
@h Setting up the model.
=
@ =
void CGlobals::initialise(code_generator *cgt) {
METHOD_ADD(cgt, DECLARE_VARIABLES_MTID, CGlobals::declare_variables);
METHOD_ADD(cgt, EVALUATE_VARIABLE_MTID, CGlobals::evaluate_variable);
}
int C_var_count = 1;
text_stream *C_var_vals = NULL;
typedef struct C_generation_variables_data {
int no_variables;
} C_generation_variables_data;
void CGlobals::initialise_data(code_generation *gen) {
C_var_count = 1;
C_var_vals = Str::new();
C_GEN_DATA(vardata.no_variables) = 1;
}
@ The basic scheme is this: the global Inter variables are going to have
their values stored in an array, so to identify which variable you are reading
or writing, you need an index (i.e., position) in that array.
The main thing we need to compile is a (static) array of initial values for
these variables, so that a new process can be initialised. But we must also
define constants to refer to their positions in the array.
=
void CGlobals::begin(code_generation *gen) {
}
void CGlobals::end(code_generation *gen) {
segmentation_pos saved = CodeGen::select(gen, c_ids_and_maxima_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("#define i7_no_variables %d\n", C_var_count);
WRITE("#define i7_var_self 0\n");
WRITE("i7word_t i7_initial_variable_values[];\n");
CodeGen::deselect(gen, saved);
saved = CodeGen::select(gen, c_globals_array_I7CGS);
OUT = CodeGen::current(gen);
WRITE("i7word_t i7_initial_variable_values[] = { 0 %S };\n", C_var_vals);
WRITE("#define i7_no_variables %d\n", C_GEN_DATA(vardata.no_variables));
WRITE("i7word_t i7_initial_variable_values[i7_no_variables];\n");
CodeGen::deselect(gen, saved);
}
@
@ We will assign the global variables unique index numbers 0, 1, 2, ..., with
the special variable |self| given index 0. Note that |self| always exists,
but has no Inter declaration node.
=
void CGlobals::declare_variables(code_generator *cgt, code_generation *gen, linked_list *L) {
segmentation_pos saved = CodeGen::select(gen, c_globals_array_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("i7word_t i7_initial_variable_values[i7_no_variables] = {\n");
@<Define a constant for the self position in the globals array@>;
@<Add the initial value for self to the globals array@>;
@<Define a more legible constant for self to the header target@>;
int N = 1;
inter_symbol *var_name;
LOOP_OVER_LINKED_LIST(var_name, inter_symbol, L) {
inter_tree_node *P = var_name->definition;
CGlobals::declare_variable_by_name(gen, Inter::Symbols::name(var_name), P);
text_stream *name = Metadata::read_optional_textual(Inter::Packages::container(var_name->definition), I"^name");
if (name)
CObjectModel::define_header_constant_for_variable(gen, name, C_var_count - 1);
else
CObjectModel::define_header_constant_for_variable(gen, Inter::Symbols::name(var_name), C_var_count - 1);
text_stream *identifier = Inter::Symbols::name(var_name);
@<Define a constant for this position in the globals array@>;
@<Add the initial value to the globals array@>;
@<Define a more legible constant for the header target@>;
N++;
}
C_GEN_DATA(vardata.no_variables) = N;
WRITE("};\n");
CodeGen::deselect(gen, saved);
}
void CGlobals::declare_variable_by_name(code_generation *gen, text_stream *name,
inter_tree_node *P) {
segmentation_pos saved = CodeGen::select(gen, c_predeclarations_I7CGS);
@<Define a constant for the self position in the globals array@> =
segmentation_pos saved = CodeGen::select(gen, c_ids_and_maxima_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("#define i7_var_%S %d\n", name, C_var_count);
WRITE("#define ");
CNamespace::mangle_variable(OUT, I"self");
WRITE(" 0\n");
CodeGen::deselect(gen, saved);
C_var_count++;
CodeGen::select_temporary(gen, C_var_vals);
WRITE_TO(C_var_vals, ", ");
if (P) CodeGen::pair(gen, P, P->W.data[VAL1_VAR_IFLD], P->W.data[VAL2_VAR_IFLD]);
else WRITE_TO(C_var_vals, "0");
CodeGen::deselect_temporary(gen);
WRITE_TO(C_var_vals, " /* %S */\n", name);
}
void CGlobals::evaluate_variable(code_generator *cgt, code_generation *gen, inter_symbol *var_name, int as_reference) {
@<Define a constant for this position in the globals array@> =
segmentation_pos saved = CodeGen::select(gen, c_predeclarations_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE("proc->state.variables[i7_var_%S]", Inter::Symbols::name(var_name));
}
@
WRITE("#define ");
CNamespace::mangle_variable(OUT, identifier);
WRITE(" %d\n", N);
CodeGen::deselect(gen, saved);
= (text to inform7_clib.h)
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id);
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val);
=
@<Add the initial value for self to the globals array@> =
segmentation_pos saved = CodeGen::select(gen, c_globals_array_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE(" 0 /* self */\n");
CodeGen::deselect(gen, saved);
@<Add the initial value to the globals array@> =
segmentation_pos saved = CodeGen::select(gen, c_globals_array_I7CGS);
text_stream *OUT = CodeGen::current(gen);
WRITE(", ");
if (var_name->definition) {
inter_tree_node *P = var_name->definition;
CodeGen::pair(gen, P, P->W.data[VAL1_VAR_IFLD], P->W.data[VAL2_VAR_IFLD]);
} else {
WRITE("0");
}
WRITE(" /* %S */\n", identifier);
CodeGen::deselect(gen, saved);
@<Define a more legible constant for self to the header target@> =
CObjectModel::define_header_constant_for_variable(gen, I"self", 0);
@<Define a more legible constant for the header target@> =
text_stream *name = Metadata::read_optional_textual(
Inter::Packages::container(var_name->definition), I"^name");
if (name)
CObjectModel::define_header_constant_for_variable(gen, name, N);
else
CObjectModel::define_header_constant_for_variable(gen, identifier, N);
@ Within a process |proc|, the current value of variable |i| is |proc->state.variables[i]|.
= (text to inform7_clib.c)
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id) {
return proc->state.variables[var_id];
}
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val) {
proc->state.variables[var_id] = val;
}
=
void CGlobals::evaluate_variable(code_generator *cgt, code_generation *gen,
inter_symbol *var_name, int as_reference) {
text_stream *OUT = CodeGen::current(gen);
WRITE("proc->state.variables[");
CNamespace::mangle_variable(OUT, Inter::Symbols::name(var_name));
WRITE("]");
}

View file

@ -57,6 +57,16 @@ void CNamespace::mangle_opcode(code_generator *cgt, OUTPUT_STREAM, text_stream *
PUT(Str::get(pos));
}
@ Global variable names are similarly mangled:
= (text)
howmayyou i7_var_howmayyou
=
=
void CNamespace::mangle_variable(OUTPUT_STREAM, text_stream *var) {
WRITE("i7_var_%S", var);
}
@ Local variable names have to be handled slightly differently. This is because
Inter frequently makes use of local variables whose identifiers are also used
for some global construct. Of course, C also allows for this: for example --

View file

@ -4,6 +4,22 @@ Rounding out the C library with a few functions intended for external code to us
@
= (text to inform7_clib.h)
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id);
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val);
=
= (text to inform7_clib.c)
i7word_t i7_read_variable(i7process_t *proc, i7word_t var_id) {
return proc->state.variables[var_id];
}
void i7_write_variable(i7process_t *proc, i7word_t var_id, i7word_t val) {
proc->state.variables[var_id] = val;
}
=
@
= (text to inform7_clib.h)
char *i7_read_string(i7process_t *proc, i7word_t S);
void i7_write_string(i7process_t *proc, i7word_t S, char *A);

View file

@ -107,6 +107,7 @@ typedef struct C_generation_data {
struct C_generation_function_model_data fndata;
struct C_generation_object_model_data objdata;
struct C_generation_literals_model_data litdata;
struct C_generation_variables_data vardata;
CLASS_DEFINITION
} C_generation_data;