1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-28 21:14:57 +03:00

Further struggles to understand attribute allocation

This commit is contained in:
Graham Nelson 2021-09-28 00:03:31 +01:00
parent e81b4326f5
commit fcf8c552ab
21 changed files with 1322 additions and 1413 deletions

View file

@ -1,6 +1,6 @@
# Inform 7
v10.1.0-alpha.1+6T37 'Krypton' (27 September 2021)
v10.1.0-alpha.1+6T38 'Krypton' (28 September 2021)
## About Inform 7

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 27 September 2021
Build Number: 6T37
Build Date: 28 September 2021
Build Number: 6T38

View file

@ -79,8 +79,6 @@ before it is known how they will be used.
<span class="plain-syntax"> </span><span class="identifier-syntax">Submain</span><span class="plain-syntax">();</span>
<span class="plain-syntax">];</span>
<span class="reserved-syntax">Constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">FBNA_PROP_NUMBER</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MAX_POSITIVE_NUMBER</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">INITIALISE_MEMORY_R</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">TARGET_GLULX</span><span class="plain-syntax">; </span><span class="identifier-syntax">VM_PreInitialise</span><span class="plain-syntax">(); #</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">LanguageInitialise</span><span class="plain-syntax">; </span><span class="identifier-syntax">LanguageInitialise</span><span class="plain-syntax">(); #</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>

View file

@ -124,7 +124,8 @@ object.
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">literal_text_mode</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">global_variables</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text_literals</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">properties</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">assimilated_properties</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">unassimilated_properties</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instances</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kinds</span><span class="plain-syntax">;</span>
@ -148,7 +149,8 @@ object.
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">literal_text_mode</span><span class="plain-syntax"> = </span><span class="constant-syntax">REGULAR_LTM</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">global_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</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">text_literals</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">text_literal_holder</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">properties</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree_node</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">assimilated_properties</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</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">unassimilated_properties</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</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">instances</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree_node</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">kinds</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NEW_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree_node</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">;</span>
@ -353,13 +355,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('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select_temporary</span></span>:<br/><a href="2-cg.html#SP3">&#167;3</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a>, <a href="2-vo.html#SP6_8_5_1_1">&#167;6.8.5.1.1</a>, <a href="2-vo.html#SP6_11_1">&#167;6.11.1</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></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('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select_temporary</span></span>:<br/><a href="2-cg.html#SP3">&#167;3</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_9_5_1_1">&#167;1.9.5.1.1</a>, <a href="2-vo.html#SP1_12_1">&#167;1.12.1</a>, <a href="2-vo.html#SP7">&#167;7</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></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('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect_temporary</span></span>:<br/><a href="2-cg.html#SP3">&#167;3</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a>, <a href="2-vo.html#SP6_8_5_1_1">&#167;6.8.5.1.1</a>, <a href="2-vo.html#SP6_11_1">&#167;6.11.1</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></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('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect_temporary</span></span>:<br/><a href="2-cg.html#SP3">&#167;3</a><br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_9_5_1_1">&#167;1.9.5.1.1</a>, <a href="2-vo.html#SP1_12_1">&#167;1.12.1</a>, <a href="2-vo.html#SP7">&#167;7</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></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>
@ -369,7 +371,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('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">CodeGen::current</span></span>:<br/><a href="2-cg.html#SP15_1">&#167;15.1</a><br/>The Vanilla Generator - <a href="2-tvg.html#SP3">&#167;3</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP4">&#167;4</a>, <a href="4-fi6.html#SP5">&#167;5</a>, <a href="4-fi6.html#SP6">&#167;6</a>, <a href="4-fi6.html#SP7">&#167;7</a>, <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP9">&#167;9</a>, <a href="4-fi6.html#SP10">&#167;10</a><br/>Final C - <a href="5-fnc.html#SP5">&#167;5</a><br/>C Namespace - <a href="5-cnm.html#SP3">&#167;3</a><br/>C References - <a href="5-crf.html#SP4">&#167;4</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#SP10_2">&#167;10.2</a>, <a href="5-cmm.html#SP11">&#167;11</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP14">&#167;14</a>, <a href="5-cmm.html#SP15">&#167;15</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_3">&#167;1.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#SP8">&#167;8</a>, <a href="5-com.html#SP1_4">&#167;1.4</a>, <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP10">&#167;10</a>, <a href="5-com.html#SP11">&#167;11</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('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">CodeGen::current</span></span>:<br/><a href="2-cg.html#SP15_1">&#167;15.1</a><br/>The Vanilla Generator - <a href="2-tvg.html#SP3">&#167;3</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP7">&#167;7</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP4">&#167;4</a>, <a href="4-fi6.html#SP5">&#167;5</a>, <a href="4-fi6.html#SP6">&#167;6</a>, <a href="4-fi6.html#SP7">&#167;7</a>, <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP9">&#167;9</a>, <a href="4-fi6.html#SP10">&#167;10</a><br/>Final C - <a href="5-fnc.html#SP5">&#167;5</a><br/>C Namespace - <a href="5-cnm.html#SP3">&#167;3</a><br/>C References - <a href="5-crf.html#SP4">&#167;4</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#SP10_2">&#167;10.2</a>, <a href="5-cmm.html#SP11">&#167;11</a>, <a href="5-cmm.html#SP12">&#167;12</a>, <a href="5-cmm.html#SP14">&#167;14</a>, <a href="5-cmm.html#SP15">&#167;15</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_3">&#167;1.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#SP8">&#167;8</a>, <a href="5-com.html#SP1_4">&#167;1.4</a>, <a href="5-com.html#SP1_5">&#167;1.5</a>, <a href="5-com.html#SP1_6">&#167;1.6</a>, <a href="5-com.html#SP10">&#167;10</a>, <a href="5-com.html#SP11">&#167;11</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>
@ -422,15 +424,15 @@ what we've worked on so far.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::marked</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">CodeGen::marked</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_8_4">&#167;6.8.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::marked</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">CodeGen::marked</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_9_4">&#167;1.9.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symb_name</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">Inter::Symbols::get_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRAVERSE_MARK_BIT</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::mark</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">CodeGen::mark</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_8_4">&#167;6.8.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::mark</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">CodeGen::mark</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_9_4">&#167;1.9.4</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::Symbols::set_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRAVERSE_MARK_BIT</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::unmark</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">CodeGen::unmark</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_8">&#167;6.8</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::unmark</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">CodeGen::unmark</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_9">&#167;1.9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Inter::Symbols::clear_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">symb_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRAVERSE_MARK_BIT</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -445,7 +447,7 @@ extracted from some Inter instruction.
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="2-cg.html#SP15_1" class="named-paragraph-link"><span class="named-paragraph">Generate from a value pair</span><span class="named-paragraph-number">15.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('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">CodeGen::pair</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.7</a>, <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a>, <a href="2-vo.html#SP6_8_5_1_1">&#167;6.8.5.1.1</a><br/>Vanilla Code - <a href="2-vc2.html#SP4">&#167;4</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP9">&#167;9</a><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">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('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">CodeGen::pair</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.7</a>, <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_9_5_1_1">&#167;1.9.5.1.1</a>, <a href="2-vo.html#SP7">&#167;7</a><br/>Vanilla Code - <a href="2-vc2.html#SP4">&#167;4</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP9">&#167;9</a><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">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#SP15_1" class="named-paragraph-link"><span class="named-paragraph">Generate from a value pair</span><span class="named-paragraph-number">15.1</span></a></span><span class="plain-syntax">;</span>

View file

@ -233,7 +233,7 @@ I6 code. Still, all pragmas are offered to all generators.
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">MANGLE_IDENTIFIER_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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><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">Generators::mangle</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">Generators::mangle</span></span>:<br/><a href="2-cg2.html#SP15">&#167;15</a>, <a href="2-cg2.html#SP18">&#167;18</a><br/>Vanilla Objects - <a href="2-vo.html#SP5_6">&#167;5.6</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP9">&#167;9</a><br/>C Memory Model - <a href="5-cmm.html#SP12">&#167;12</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">OUT</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">Generators::mangle</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">Generators::mangle</span></span>:<br/><a href="2-cg2.html#SP15">&#167;15</a>, <a href="2-cg2.html#SP18">&#167;18</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP9">&#167;9</a><br/>C Memory Model - <a href="5-cmm.html#SP12">&#167;12</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">OUT</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="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">MANGLE_IDENTIFIER_MTID</span><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>
</pre>
@ -268,7 +268,7 @@ I6 code. Still, all pragmas are offered to all generators.
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">COMPILE_LITERAL_TEXT_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">escape_mode</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::compile_literal_text</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">Generators::compile_literal_text</span></span>:<br/>Code Generation - <a href="2-cg.html#SP15_1">&#167;15.1</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP6_11_1">&#167;6.11.1</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">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">escape_mode</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::compile_literal_text</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">Generators::compile_literal_text</span></span>:<br/>Code Generation - <a href="2-cg.html#SP15_1">&#167;15.1</a><br/>Vanilla Constants - <a href="2-vc.html#SP2">&#167;2</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_12_1">&#167;1.12.1</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">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">escape_mode</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_LITERAL_TEXT_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">escape_mode</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -278,12 +278,12 @@ I6 code. Still, all pragmas are offered to all generators.
<span class="definition-keyword">enum</span> <span class="constant-syntax">DECLARE_ATTRIBUTE_MTID</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">prop_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">prop_name</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_ATTRIBUTE_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">prop_name</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_property</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_property</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_1">&#167;6.1</a>, <a href="2-vo.html#SP6_12">&#167;6.12</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_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">used</span><span class="plain-syntax">);</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_property</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_property</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_4">&#167;1.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="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_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">Generators::declare_attribute</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_attribute</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP5_5">&#167;5.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_attribute</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_attribute</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_4_1">&#167;1.4.1</a><br/>Generating Inform 6 - <a href="4-fi6.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_ATTRIBUTE_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -341,35 +341,35 @@ I6 code. Still, all pragmas are offered to all generators.
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_CLASS_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">super_class</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="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">END_CLASS_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">class_name</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">Generators::declare_class</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_class</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_8_1">&#167;6.8.1</a>, <a href="2-vo.html#SP6_9">&#167;6.9</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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">super_class</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">Generators::declare_class</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_class</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_9_1">&#167;1.9.1</a>, <a href="2-vo.html#SP1_10">&#167;1.10</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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">super_class</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="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_CLASS_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">super_class</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">Generators::end_class</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Generators::end_class</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_8_1">&#167;6.8.1</a>, <a href="2-vo.html#SP6_9">&#167;6.9</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">class_name</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">Generators::end_class</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Generators::end_class</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_9_1">&#167;1.9.1</a>, <a href="2-vo.html#SP1_10">&#167;1.10</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">class_name</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="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">END_CLASS_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">class_name</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">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_INSTANCE_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">acount</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">is_dir</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="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">END_INSTANCE_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</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">Generators::declare_instance</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">Generators::declare_instance</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a>, <a href="2-vo.html#SP6_5">&#167;6.5</a>, <a href="2-vo.html#SP6_8">&#167;6.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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">acount</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">is_dir</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">Generators::declare_instance</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">Generators::declare_instance</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_6">&#167;1.6</a>, <a href="2-vo.html#SP1_9">&#167;1.9</a>, <a href="2-vo.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">acount</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">is_dir</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="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_INSTANCE_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">printed_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">acount</span><span class="plain-syntax">, </span><span class="identifier-syntax">is_dir</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">Generators::end_instance</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">Generators::end_instance</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a>, <a href="2-vo.html#SP6_5">&#167;6.5</a>, <a href="2-vo.html#SP6_8">&#167;6.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">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</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">Generators::end_instance</span><button class="popup" onclick="togglePopup('usagePopup24')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup24">Usage of <span class="code-font"><span class="function-syntax">Generators::end_instance</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_6">&#167;1.6</a>, <a href="2-vo.html#SP1_9">&#167;1.9</a>, <a href="2-vo.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</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="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">END_INSTANCE_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">class_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">instance_name</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">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_VALUE_INSTANCE_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_value_instance</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_value_instance</span></span>:<br/>Vanilla Objects - <a href="2-vo.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">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_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="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_value_instance</span><button class="popup" onclick="togglePopup('usagePopup25')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup25">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_value_instance</span></span>:<br/>Vanilla Objects - <a href="2-vo.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">printed_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">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_VALUE_INSTANCE_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">instance_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">printed_name</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">INT_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">OPTIMISE_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::optimise_property_value</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">Generators::optimise_property_value</span></span>:<br/>Vanilla Objects - <a href="2-vo.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">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::optimise_property_value</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">Generators::optimise_property_value</span></span>:<br/>Vanilla Objects - <a href="2-vo.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="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</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">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">INT_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">rv</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">OPTIMISE_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">X</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">rv</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">ASSIGN_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">property_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::assign_property</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">Generators::assign_property</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a>, <a href="2-vo.html#SP6_5">&#167;6.5</a>, <a href="2-vo.html#SP6_8">&#167;6.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">property_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::assign_property</span><button class="popup" onclick="togglePopup('usagePopup27')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup27">Usage of <span class="code-font"><span class="function-syntax">Generators::assign_property</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_6">&#167;1.6</a>, <a href="2-vo.html#SP1_9">&#167;1.9</a>, <a href="2-vo.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">property_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">ASSIGN_PROPERTY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">as_att</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">Generators::assign_mangled_property</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">Generators::assign_mangled_property</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_8_4">&#167;6.8.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">property_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::assign_mangled_property</span><button class="popup" onclick="togglePopup('usagePopup28')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup28">Usage of <span class="code-font"><span class="function-syntax">Generators::assign_mangled_property</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_9_4">&#167;1.9.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="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">property_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">mangled</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-cg2.html#SP8" class="function-link"><span class="function-syntax">Generators::mangle</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">mangled</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg2.html#SP15" class="function-link"><span class="function-syntax">Generators::assign_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">mangled</span><span class="plain-syntax">, </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">);</span>
@ -377,7 +377,7 @@ I6 code. Still, all pragmas are offered to all generators.
<span class="plain-syntax">}</span>
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">PROPERTY_OFFSET_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">property_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::property_offset</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">Generators::property_offset</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_11">&#167;6.11</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">property_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::property_offset</span><button class="popup" onclick="togglePopup('usagePopup29')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup29">Usage of <span class="code-font"><span class="function-syntax">Generators::property_offset</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_12">&#167;1.12</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">property_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">PROPERTY_OFFSET_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -388,10 +388,11 @@ I6 code. Still, all pragmas are offered to all generators.
<span class="definition-keyword">define</span> <span class="constant-syntax">COMPUTED_GDCFORM</span><span class="plain-syntax"> </span><span class="constant-syntax">2</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">LITERAL_TEXT_GDCFORM</span><span class="plain-syntax"> </span><span class="constant-syntax">3</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">RAW_GDCFORM</span><span class="plain-syntax"> </span><span class="constant-syntax">4</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MANGLED_GDCFORM</span><span class="plain-syntax"> </span><span class="constant-syntax">5</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">DECLARE_CONSTANT_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">const_name</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">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ifndef_me</span><span class="plain-syntax">)</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_constant</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_constant</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a>, <a href="2-vc.html#SP1_9">&#167;1.9</a>, <a href="2-vc.html#SP3">&#167;3</a><br/>Vanilla Objects - <a href="2-vo.html#SP5_6">&#167;5.6</a>, <a href="2-vo.html#SP6_1">&#167;6.1</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP8">&#167;8</a><br/>C Object Model - <a href="5-com.html#SP3">&#167;3</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">const_name</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">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ifndef_me</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::declare_constant</span><button class="popup" onclick="togglePopup('usagePopup30')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup30">Usage of <span class="code-font"><span class="function-syntax">Generators::declare_constant</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_8">&#167;1.8</a>, <a href="2-vc.html#SP1_9">&#167;1.9</a>, <a href="2-vc.html#SP3">&#167;3</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_4">&#167;1.4</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP8">&#167;8</a><br/>C Object Model - <a href="5-com.html#SP3">&#167;3</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">const_name</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">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ifndef_me</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">DECLARE_CONSTANT_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">const_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">const_s</span><span class="plain-syntax">, </span><span class="identifier-syntax">form</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">ifndef_me</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
@ -434,18 +435,18 @@ I6 code. Still, all pragmas are offered to all generators.
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">ARRAY_ENTRIES_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">how_many</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plus_ips</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">COMPILE_LITERAL_SYMBOL_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">aliased</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">VOID_METHOD_TYPE</span><span class="plain-syntax">(</span><span class="constant-syntax">END_ARRAY_MTID</span><span class="plain-syntax">, </span><span class="reserved-syntax">code_generator</span><span class="plain-syntax"> *</span><span class="identifier-syntax">generator</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::begin_array</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">Generators::begin_array</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_5">&#167;1.5</a>, <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP6_7">&#167;6.7</a>, <a href="2-vo.html#SP6_8_3">&#167;6.8.3</a>, <a href="2-vo.html#SP6_8_5_1">&#167;6.8.5.1</a>, <a href="2-vo.html#SP6_11">&#167;6.11</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">const_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">array_s</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</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">int</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::begin_array</span><button class="popup" onclick="togglePopup('usagePopup33')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup33">Usage of <span class="code-font"><span class="function-syntax">Generators::begin_array</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_5">&#167;1.5</a>, <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_8">&#167;1.8</a>, <a href="2-vo.html#SP1_9_3">&#167;1.9.3</a>, <a href="2-vo.html#SP1_9_5_1">&#167;1.9.5.1</a>, <a href="2-vo.html#SP1_12">&#167;1.12</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">const_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">array_s</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">INT_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">rv</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">BEGIN_ARRAY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">const_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">array_s</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">rv</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">Generators::array_entry</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">Generators::array_entry</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_5">&#167;1.5</a>, <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP6_7">&#167;6.7</a>, <a href="2-vo.html#SP6_8_3">&#167;6.8.3</a>, <a href="2-vo.html#SP6_8_5_1">&#167;6.8.5.1</a>, <a href="2-vo.html#SP6_8_5_1_1">&#167;6.8.5.1.1</a>, <a href="2-vo.html#SP6_11_1">&#167;6.11.1</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">entry</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::array_entry</span><button class="popup" onclick="togglePopup('usagePopup34')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup34">Usage of <span class="code-font"><span class="function-syntax">Generators::array_entry</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_5">&#167;1.5</a>, <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_8">&#167;1.8</a>, <a href="2-vo.html#SP1_9_3">&#167;1.9.3</a>, <a href="2-vo.html#SP1_9_5_1">&#167;1.9.5.1</a>, <a href="2-vo.html#SP1_9_5_1_1">&#167;1.9.5.1.1</a>, <a href="2-vo.html#SP1_12_1">&#167;1.12.1</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">entry</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">entry</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</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">Generators::array_entries</span><button class="popup" onclick="togglePopup('usagePopup35')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup35">Usage of <span class="code-font"><span class="function-syntax">Generators::array_entries</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_7">&#167;1.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">how_many</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">plus_ips</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRIES_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">how_many</span><span class="plain-syntax">, </span><span class="identifier-syntax">plus_ips</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</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">Generators::mangled_array_entry</span><button class="popup" onclick="togglePopup('usagePopup36')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup36">Usage of <span class="code-font"><span class="function-syntax">Generators::mangled_array_entry</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP6_7">&#167;6.7</a>, <a href="2-vo.html#SP6_8_3">&#167;6.8.3</a>, <a href="2-vo.html#SP6_11">&#167;6.11</a>, <a href="2-vo.html#SP6_11_2_1">&#167;6.11.2.1</a>, <a href="2-vo.html#SP6_11_2_2">&#167;6.11.2.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">entry</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Generators::mangled_array_entry</span><button class="popup" onclick="togglePopup('usagePopup36')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup36">Usage of <span class="code-font"><span class="function-syntax">Generators::mangled_array_entry</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP1_8">&#167;1.8</a>, <a href="2-vo.html#SP1_9_3">&#167;1.9.3</a>, <a href="2-vo.html#SP1_12">&#167;1.12</a>, <a href="2-vo.html#SP1_12_2_1">&#167;1.12.2.1</a>, <a href="2-vo.html#SP1_12_2_2">&#167;1.12.2.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">entry</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">mangled</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-cg2.html#SP8" class="function-link"><span class="function-syntax">Generators::mangle</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">mangled</span><span class="plain-syntax">, </span><span class="identifier-syntax">entry</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">mangled</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</span><span class="plain-syntax">);</span>
@ -455,7 +456,7 @@ I6 code. Still, all pragmas are offered to all generators.
<span class="plain-syntax"> </span><span class="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_LITERAL_SYMBOL_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">aliased</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">Generators::end_array</span><button class="popup" onclick="togglePopup('usagePopup38')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup38">Usage of <span class="code-font"><span class="function-syntax">Generators::end_array</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_5">&#167;1.5</a>, <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP6_7">&#167;6.7</a>, <a href="2-vo.html#SP6_8_3">&#167;6.8.3</a>, <a href="2-vo.html#SP6_8_5_1">&#167;6.8.5.1</a>, <a href="2-vo.html#SP6_11">&#167;6.11</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">format</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">Generators::end_array</span><button class="popup" onclick="togglePopup('usagePopup38')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup38">Usage of <span class="code-font"><span class="function-syntax">Generators::end_array</span></span>:<br/>Vanilla Constants - <a href="2-vc.html#SP1_5">&#167;1.5</a>, <a href="2-vc.html#SP1_7">&#167;1.7</a><br/>Vanilla Objects - <a href="2-vo.html#SP1_8">&#167;1.8</a>, <a href="2-vo.html#SP1_9_3">&#167;1.9.3</a>, <a href="2-vo.html#SP1_9_5_1">&#167;1.9.5.1</a>, <a href="2-vo.html#SP1_12">&#167;1.12</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">format</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="identifier-syntax">VOID_METHOD_CALL</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">generator</span><span class="plain-syntax">, </span><span class="constant-syntax">END_ARRAY_MTID</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="identifier-syntax">saved</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>

View file

@ -139,7 +139,14 @@ be sent <span class="extract"><span class="extract-syntax">END_GENERATION_MTID</
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_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">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">global_variables</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_IST:</span><span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">properties</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">PROPERTY_IST:</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">prop_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbolsTables::symbol_from_frame_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">DEFN_PROP_IFLD</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">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSIMILATED_IANN</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">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">assimilated_properties</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">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">unassimilated_properties</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INSTANCE_IST:</span><span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">instances</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">KIND_IST:</span><span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax">, </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">kinds</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
@ -211,7 +218,7 @@ functions, and calls <a href="2-tvg.html#SP2" class="internal">Vanilla::node</a>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><a href="2-vc.html#SP3" class="function-link"><span class="function-syntax">VanillaConstants::consolidate</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="2-vo.html#SP6" class="function-link"><span class="function-syntax">VanillaObjects::consolidate</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="2-vo.html#SP1" class="function-link"><span class="function-syntax">VanillaObjects::generate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="2-tvg.html#SP1">&#167;1</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>The function <a href="2-tvg.html#SP2" class="internal">Vanilla::node</a> is a sort of handle-any-node function, and is
@ -291,7 +298,7 @@ generated name. So a splat is not quite generator-independent after all.
<span class="plain-syntax"> </span><a href="2-tvg.html#SP3" class="function-link"><span class="function-syntax">Vanilla::splat_matter</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="plain-syntax">, </span><span class="identifier-syntax">S</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">Vanilla::splat_matter</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Vanilla::splat_matter</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Vanilla::splat_matter</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Vanilla::splat_matter</span></span>:<br/>Vanilla Objects - <a href="2-vo.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</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">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</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">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="identifier-syntax">L</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::get_at</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">);</span>

View file

@ -264,6 +264,13 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><a href="2-cg2.html#SP10" class="function-link"><span class="function-syntax">Generators::compile_literal_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">MANGLED_GDCFORM:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::len</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="2-cg2.html#SP8" class="function-link"><span class="function-syntax">Generators::mangle</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">OUT</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">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-cg2.html#SP10" class="function-link"><span class="function-syntax">Generators::compile_literal_number</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">DATA_GDCFORM:</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">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">DATA_CONST_IFLD</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">val2</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">DATA_CONST_IFLD</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">];</span>

File diff suppressed because it is too large Load diff

View file

@ -765,18 +765,30 @@ trick called "stubbing", these being "stub definitions".)
</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">I6Target::declare_property</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">I6Target::declare_property</span></span>:<br/><a href="4-fi6.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="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">prop_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">I6Target::declare_property</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">I6Target::declare_property</span></span>:<br/><a href="4-fi6.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="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">prop_name</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">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_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">used</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#SP9" 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">predeclarations_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><a href="2-cg.html#SP11" 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="string-syntax">"Property %S;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP9" 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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSIMILATED_IANN</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::get_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ATTRIBUTE_MARK_BIT</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</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#SP9" 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">predeclarations_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><a href="2-cg.html#SP11" 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="string-syntax">"Property %S;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP9" 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="plain-syntax"> } </span><span class="reserved-syntax">else</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#SP9" 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">code_at_eof_I7CGS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><a href="2-cg.html#SP11" 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="string-syntax">"#ifndef %S; Constant %S = 0; #endif;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP9" 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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::get_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ATTRIBUTE_MARK_BIT</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">translated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</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">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">EXPLICIT_ATTRIBUTE_IANN</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">translated</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSIMILATED_IANN</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">translated</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSIMILATED_IANN</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">translated</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="2-cg2.html#SP12" class="function-link"><span class="function-syntax">Generators::declare_attribute</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">prop_name</span><span class="plain-syntax">));</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">I6Target::declare_attribute</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">I6Target::declare_attribute</span></span>:<br/><a href="4-fi6.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="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">prop_name</span><span class="plain-syntax">) {</span>

View file

@ -136,7 +136,7 @@ function togglePopup(material_id) {
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CObjectModel::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">CObjectModel::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><a href="5-com.html#SP1" class="function-link"><span class="function-syntax">CObjectModel::initialise_data</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="named-paragraph-container code-font"><a href="5-com.html#SP1_5" class="named-paragraph-link"><span class="named-paragraph">Begin the initialiser function</span><span class="named-paragraph-number">1.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</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">"value_range"</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</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">"value_range"</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</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::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">CObjectModel::end</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>
@ -491,16 +491,24 @@ that references to it will not fail to compile.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CObjectModel::declare_property</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">CObjectModel::declare_property</span></span>:<br/><a href="5-com.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">prop_name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used</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">prop_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">attr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</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">Inter::Symbols::get_flag</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ATTRIBUTE_MARK_BIT</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">translated</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</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">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">EXPLICIT_ATTRIBUTE_IANN</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">translated</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSIMILATED_IANN</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">translated</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">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ASSIMILATED_IANN</span><span class="plain-syntax">) &gt;= </span><span class="constant-syntax">0</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">translated</span><span class="plain-syntax"> == </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">)) </span><span class="identifier-syntax">attr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</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">Inter::Symbols::name</span><span class="plain-syntax">(</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cp</span><span class="plain-syntax"> = </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</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">used</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cp</span><span class="plain-syntax"> = </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</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">attr</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">pname</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">prop_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">pname</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_property</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">pname</span><span class="plain-syntax">, </span><span class="identifier-syntax">cp</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">id</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::declare_attribute</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">CObjectModel::declare_attribute</span></span>:<br/><a href="5-com.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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">prop_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. </b>Property IDs count upwards from 0 in declaration order, though they really
@ -515,7 +523,7 @@ only need to be unique, so the order is not significant.
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">C_property</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="function-syntax">CObjectModel::property_by_name</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">CObjectModel::property_by_name</span></span>:<br/><a href="5-com.html#SP1">&#167;1</a>, <a href="5-com.html#SP6">&#167;6</a>, <a href="5-com.html#SP10">&#167;10</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">name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">used</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">attr</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="function-syntax">CObjectModel::property_by_name</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">CObjectModel::property_by_name</span></span>:<br/><a href="5-com.html#SP1">&#167;1</a>, <a href="5-com.html#SP6">&#167;6</a>, <a href="5-com.html#SP10">&#167;10</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">name</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">attr</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">dictionary</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C_GEN_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">objdata</span><span class="plain-syntax">.</span><span class="element-syntax">declared_properties</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cp</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">Dictionaries::find</span><span class="plain-syntax">(</span><span class="identifier-syntax">D</span><span class="plain-syntax">, </span><span class="identifier-syntax">name</span><span class="plain-syntax">) == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
@ -670,7 +678,7 @@ the next owner is declared.
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CObjectModel::assign_property</span><button class="popup" onclick="togglePopup('usagePopup26')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup26">Usage of <span class="code-font"><span class="function-syntax">CObjectModel::assign_property</span></span>:<br/><a href="5-com.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">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">property_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="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_att</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_property_owner</span><span class="plain-syntax"> *</span><span class="identifier-syntax">owner</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C_GEN_DATA</span><span class="plain-syntax">(</span><span class="identifier-syntax">objdata</span><span class="plain-syntax">.</span><span class="element-syntax">current_owner</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><a href="5-com.html#SP7" class="function-link"><span class="function-syntax">CObjectModel::property_by_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">property_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">C_pv_pair</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pair</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">C_pv_pair</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pair</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">prop</span><span class="plain-syntax"> = </span><span class="identifier-syntax">prop</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pair</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">val</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>

View file

@ -1,10 +1,10 @@
Total memory consumption was 394932K = 386 MB
Total memory consumption was 394930K = 386 MB
60.7% was used for 2000361 objects, in 371224 frames in 300 x 800K = 240000K = 234 MB:
60.7% was used for 1999362 objects, in 371224 frames in 300 x 800K = 240000K = 234 MB:
10.3% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
7.1% text_stream_array 5166 x 100 = 516600 objects, 29094912 bytes
4.2% linked_list 30858 objects, 17280480 bytes
4.2% linked_list 30859 objects, 17281040 bytes
3.9% inter_symbol_array 139 x 1024 = 142336 objects, 15946080 bytes
2.5% parse_node 129365 objects, 10349200 bytes
1.8% verb_conjugation 160 objects, 7425280 bytes
@ -63,8 +63,8 @@ Total memory consumption was 394932K = 386 MB
---- spatial_data 670 objects, 64320 bytes
---- kind_macro_definition 9 objects, 62280 bytes
---- booking 860 objects, 61920 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- actions_rcd_data 1880 objects, 60160 bytes
---- scenes_rcd_data 1880 objects, 60160 bytes
---- command_grammar 130 objects, 58240 bytes
---- kind_constructor 77 objects, 57904 bytes
---- table 7 objects, 56672 bytes
@ -85,7 +85,6 @@ Total memory consumption was 394932K = 386 MB
---- production_list 617 objects, 34552 bytes
---- regions_data 670 objects, 32160 bytes
---- counting_data 670 objects, 32160 bytes
---- linked_list_item_array 2 x 1000 = 2000 objects, 32064 bytes
---- HTML_tag_array 1 x 1000 objects, 32032 bytes
---- property_permission 96 objects, 31488 bytes
---- stack_frame_box 304 objects, 29184 bytes
@ -105,6 +104,7 @@ Total memory consumption was 394932K = 386 MB
---- understanding_reference_array 2 x 100 = 200 objects, 16064 bytes
---- to_phrase_request 59 objects, 16048 bytes
---- action_name_list_array 1 x 1000 objects, 16032 bytes
---- linked_list_item_array 1 x 1000 objects, 16032 bytes
---- match_avinue_array 1 x 1000 objects, 16032 bytes
---- adjective 137 objects, 15344 bytes
---- booking_list 407 objects, 13024 bytes
@ -142,10 +142,10 @@ Total memory consumption was 394932K = 386 MB
---- use_option 29 objects, 2552 bytes
---- parentage_inference_data 79 objects, 2528 bytes
---- part_of_inference_data 79 objects, 2528 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- kind_constructor_instance_array 1 x 100 objects, 2432 bytes
---- equation_symbol 30 objects, 2400 bytes
---- kind_constructor_casting_rule_array 1 x 100 objects, 2432 bytes
---- inter_construct 30 objects, 2400 bytes
---- equation_symbol 30 objects, 2400 bytes
---- pipeline_step 16 objects, 2304 bytes
---- semver_range 22 objects, 2288 bytes
---- scene 1 object, 2096 bytes
@ -167,8 +167,8 @@ Total memory consumption was 394932K = 386 MB
---- runtime_kind_structure 13 objects, 1040 bytes
---- quantifier 16 objects, 1024 bytes
---- pipeline_stage 21 objects, 1008 bytes
---- named_rulebook_outcome 15 objects, 960 bytes
---- submodule_identity 30 objects, 960 bytes
---- named_rulebook_outcome 15 objects, 960 bytes
---- inbuild_requirement 22 objects, 880 bytes
---- control_structure_phrase 12 objects, 864 bytes
---- cached_understanding 21 objects, 840 bytes
@ -177,11 +177,11 @@ Total memory consumption was 394932K = 386 MB
---- internal_test 15 objects, 720 bytes
---- inform_language 6 objects, 672 bytes
---- I6T_intervention 8 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- relation_guard 5 objects, 640 bytes
---- inter_warehouse_room 10 objects, 640 bytes
---- inbuild_search_result 15 objects, 600 bytes
---- rulebook_outcome 17 objects, 544 bytes
---- code_generation 1 object, 528 bytes
---- code_generation 1 object, 536 bytes
---- small_word_set 11 objects, 528 bytes
---- inform_kit 5 objects, 520 bytes
---- implication 13 objects, 520 bytes
@ -189,8 +189,8 @@ Total memory consumption was 394932K = 386 MB
---- inference_family 11 objects, 440 bytes
---- i6_memory_setting 13 objects, 416 bytes
---- module_package 10 objects, 400 bytes
---- article_usage 8 objects, 384 bytes
---- bp_family 12 objects, 384 bytes
---- article_usage 8 objects, 384 bytes
---- source_file 5 objects, 360 bytes
---- inbuild_genre 7 objects, 336 bytes
---- door_dir_notice 5 objects, 320 bytes
@ -199,20 +199,20 @@ Total memory consumption was 394932K = 386 MB
---- tree_inventory 1 object, 312 bytes
---- build_step 4 objects, 288 bytes
---- up_family 9 objects, 288 bytes
---- contents_entry 7 objects, 280 bytes
---- door_to_notice 5 objects, 280 bytes
---- compilation_unit 5 objects, 280 bytes
---- contents_entry 7 objects, 280 bytes
---- explicit_bp_data 5 objects, 280 bytes
---- door_to_notice 5 objects, 280 bytes
---- verb_usage_tier 5 objects, 240 bytes
---- adjective_meaning_family 7 objects, 224 bytes
---- test_scenario 1 object, 216 bytes
---- release_instructions 1 object, 208 bytes
---- build_skill 5 objects, 200 bytes
---- code_generator 5 objects, 200 bytes
---- kit_dependency 4 objects, 192 bytes
---- inform_project 1 object, 192 bytes
---- plural_dictionary_entry 4 objects, 192 bytes
---- kit_dependency 4 objects, 192 bytes
---- inform_pipeline 3 objects, 192 bytes
---- inform_project 1 object, 192 bytes
---- kov_value_stick 3 objects, 168 bytes
---- link_instruction 4 objects, 160 bytes
---- inter_architecture 4 objects, 160 bytes
@ -253,8 +253,8 @@ Total memory consumption was 394932K = 386 MB
0.4% instance-of-kind counting 1695204 bytes in 1 claim
---- compilation workspace for objects 21856 bytes in 25 claims
---- lists for type-checking invocations 16000 bytes in 1 claim
---- code generation workspace for objects 6096 bytes in 6 claims
---- code generation workspace for objects 4128 bytes in 4 claims
---- emitter array storage 161792 bytes in 2062 claims
18.7% was overhead - 75681392 bytes = 73907K = 72 MB
18.7% was overhead - 75696856 bytes = 73922K = 72 MB

View file

@ -1,10 +1,10 @@
100.0% in inform7 run
54.8% in compilation to Inter
39.5% in //Sequence::undertake_queued_tasks//
3.4% in //MajorNodes::pre_pass//
55.1% in compilation to Inter
39.8% in //Sequence::undertake_queued_tasks//
3.5% in //MajorNodes::pre_pass//
2.5% in //MajorNodes::pass_1//
2.0% in //RTPhrasebook::compile_entries//
1.3% in //ImperativeDefinitions::assess_all//
2.1% in //RTPhrasebook::compile_entries//
1.4% in //ImperativeDefinitions::assess_all//
1.1% in //RTKindConstructors::compile//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //MajorNodes::pass_2//
@ -16,23 +16,22 @@
0.1% in //RTKindConstructors::compile_permissions//
0.1% in //Task::make_built_in_kind_constructors//
0.1% in //World::stages_II_and_III//
1.8% not specifically accounted for
43.1% in running Inter pipeline
12.4% in step preparation
9.6% in inter step 7/16: consolidate-text
1.5% not specifically accounted for
42.8% in running Inter pipeline
12.5% 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
6.5% in inter step 16/16: generate inform6 -> auto.inf
1.5% in inter step 11/16: make-identifiers-unique
0.4% in inter step 12/16: reconcile-verbs
0.4% in inter step 6/16: assimilate
0.2% in inter step 10/16: detect-indirect-calls
0.2% in inter step 14/16: eliminate-redundant-operations
0.2% in inter step 6/16: assimilate
0.2% in inter step 8/16: resolve-external-symbols
0.2% in inter step 9/16: inspect-plugs
0.1% in inter step 10/16: detect-indirect-calls
0.1% in inter step 13/16: eliminate-redundant-labels
0.1% in inter step 3/16: merge-template <- none
0.1% in inter step 4/16: parse-linked-matter
0.1% in inter step 5/16: resolve-conditional-compilation
2.6% not specifically accounted for
2.4% not specifically accounted for
1.6% in supervisor
0.3% not specifically accounted for

View file

@ -38,8 +38,6 @@ before it is known how they will be used.
Submain();
];
Constant FBNA_PROP_NUMBER = MAX_POSITIVE_NUMBER;
[ INITIALISE_MEMORY_R;
#ifdef TARGET_GLULX; VM_PreInitialise(); #Endif;
#Ifdef LanguageInitialise; LanguageInitialise(); #Endif;

View file

@ -34795,7 +34795,7 @@ package main _plain
constant KIT_CONFIGURATION_BITMAP K_typeless_int = 0
constant KIT_CONFIGURATION_LOOKMODE K_typeless_int = 2
constant I7_VERSION_NUMBER K_typeless_string = "10.1.0"
constant I7_FULL_VERSION_NUMBER K_typeless_string = "10.1.0-alpha.1+6T36"
constant I7_FULL_VERSION_NUMBER K_typeless_string = "10.1.0-alpha.1+6T37"
constant ^virtual_machine K_typeless_string = "C/32d/v1/no-main"
constant ^virtual_machine_icon K_typeless_string = "vm_glulx.png"
constant ^language_elements_used K_typeless_string = "core, naming, instance counting, glulx external files"

View file

@ -49,7 +49,8 @@ typedef struct code_generation {
int literal_text_mode;
struct linked_list *global_variables;
struct linked_list *text_literals;
struct linked_list *properties;
struct linked_list *assimilated_properties;
struct linked_list *unassimilated_properties;
struct linked_list *instances;
struct linked_list *kinds;
@ -73,7 +74,8 @@ code_generation *CodeGen::new_generation(filename *F, text_stream *T, inter_tree
gen->literal_text_mode = REGULAR_LTM;
gen->global_variables = NEW_LINKED_LIST(inter_symbol);
gen->text_literals = NEW_LINKED_LIST(text_literal_holder);
gen->properties = NEW_LINKED_LIST(inter_tree_node);
gen->assimilated_properties = NEW_LINKED_LIST(inter_symbol);
gen->unassimilated_properties = NEW_LINKED_LIST(inter_symbol);
gen->instances = NEW_LINKED_LIST(inter_tree_node);
gen->kinds = NEW_LINKED_LIST(inter_tree_node);
return gen;

View file

@ -199,10 +199,10 @@ void Generators::compile_literal_text(code_generation *gen, text_stream *S, int
@e DECLARE_ATTRIBUTE_MTID
=
VOID_METHOD_TYPE(DECLARE_PROPERTY_MTID, code_generator *generator, code_generation *gen, inter_symbol *prop_name, int used)
VOID_METHOD_TYPE(DECLARE_PROPERTY_MTID, code_generator *generator, code_generation *gen, inter_symbol *prop_name)
VOID_METHOD_TYPE(DECLARE_ATTRIBUTE_MTID, code_generator *generator, code_generation *gen, text_stream *prop_name)
void Generators::declare_property(code_generation *gen, inter_symbol *prop_name, int used) {
VOID_METHOD_CALL(gen->generator, DECLARE_PROPERTY_MTID, gen, prop_name, used);
void Generators::declare_property(code_generation *gen, inter_symbol *prop_name) {
VOID_METHOD_CALL(gen->generator, DECLARE_PROPERTY_MTID, gen, prop_name);
}
void Generators::declare_attribute(code_generation *gen, text_stream *prop_name) {
VOID_METHOD_CALL(gen->generator, DECLARE_ATTRIBUTE_MTID, gen, prop_name);
@ -310,6 +310,7 @@ void Generators::property_offset(code_generation *gen, text_stream *property_nam
@d COMPUTED_GDCFORM 2
@d LITERAL_TEXT_GDCFORM 3
@d RAW_GDCFORM 4
@d MANGLED_GDCFORM 5
=
VOID_METHOD_TYPE(DECLARE_CONSTANT_MTID, code_generator *generator, code_generation *gen, text_stream *const_name, inter_symbol *const_s, int form, inter_tree_node *P, text_stream *val, int ifndef_me)

View file

@ -51,7 +51,14 @@ void Vanilla::gather_up(inter_tree *I, inter_tree_node *P, void *state) {
ADD_TO_LINKED_LIST(var_name, inter_symbol, gen->global_variables);
break;
}
case PROPERTY_IST: ADD_TO_LINKED_LIST(P, inter_tree_node, gen->properties); break;
case PROPERTY_IST: {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_PROP_IFLD);
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) == 1)
ADD_TO_LINKED_LIST(prop_name, inter_symbol, gen->assimilated_properties);
else
ADD_TO_LINKED_LIST(prop_name, inter_symbol, gen->unassimilated_properties);
break;
}
case INSTANCE_IST: ADD_TO_LINKED_LIST(P, inter_tree_node, gen->instances); break;
case KIND_IST: ADD_TO_LINKED_LIST(P, inter_tree_node, gen->kinds); break;
}
@ -110,7 +117,7 @@ void Vanilla::iterate(inter_tree *I, inter_tree_node *P, void *state) {
@<Consolidate@> =
VanillaConstants::consolidate(gen);
VanillaObjects::consolidate(gen);
VanillaObjects::generate(gen);
@ The function //Vanilla::node// is a sort of handle-any-node function, and is
the main way we iterate through the Inter tree.

View file

@ -156,6 +156,13 @@ void VanillaConstants::definition_value(code_generation *gen, int form, inter_tr
Generators::compile_literal_number(gen, 1, FALSE);
}
break;
case MANGLED_GDCFORM:
if (Str::len(val) > 0) {
Generators::mangle(gen, OUT, val);
} else {
Generators::compile_literal_number(gen, 1, FALSE);
}
break;
case DATA_GDCFORM: {
inter_ti val1 = P->W.data[DATA_CONST_IFLD];
inter_ti val2 = P->W.data[DATA_CONST_IFLD + 1];

View file

@ -2,164 +2,100 @@
How the vanilla code generation strategy handles instances, kinds, and properties.
@
@ The object model of objects, kinds, properties and their values is made all
at once, towards the end of code generation, when the following function is
called exactly once.
=
typedef struct kov_value_stick {
struct inter_symbol *prop;
struct inter_symbol *kind_name;
struct text_stream *identifier;
struct inter_tree_node *node;
CLASS_DEFINITION
} kov_value_stick;
@h Instances.
=
void VanillaObjects::instance(code_generation *gen, inter_tree_node *P) {
inter_symbol *inst_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_INST_IFLD);
inter_symbol *inst_kind = InterSymbolsTables::symbol_from_frame_data(P, KIND_INST_IFLD);
if (Inter::Kind::is_a(inst_kind, object_kind_symbol)) {
int c = Inter::Symbols::read_annotation(inst_name, ARROW_COUNT_IANN);
if (c < 0) c = 0;
int is_dir = Inter::Kind::is_a(inst_kind, direction_kind_symbol);
segmentation_pos saved;
Generators::declare_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name),
Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), c, is_dir, &saved);
VanillaObjects::append(gen, inst_name);
inter_node_list *FL =
Inode::ID_to_frame_list(P,
Inter::Instance::properties_list(inst_name));
VanillaObjects::plist(gen, FL);
Generators::end_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), saved);
} else {
inter_ti val1 = P->W.data[VAL1_INST_IFLD];
inter_ti val2 = P->W.data[VAL2_INST_IFLD];
int defined = TRUE;
if (val1 == UNDEF_IVAL) defined = FALSE;
TEMPORARY_TEXT(val)
if (defined) WRITE_TO(val, "%d", val2);
Generators::declare_value_instance(gen, Inter::Symbols::name(inst_name),
Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), val);
DISCARD_TEXT(val)
}
}
void VanillaObjects::plist(code_generation *gen, inter_node_list *FL) {
if (FL == NULL) internal_error("no properties list");
inter_tree_node *X;
LOOP_THROUGH_INTER_NODE_LIST(X, FL) {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(X, PROP_PVAL_IFLD);
if (prop_name == NULL) internal_error("no property");
text_stream *call_it = Inter::Symbols::name(prop_name);
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT)) {
if ((X->W.data[DVAL1_PVAL_IFLD] == LITERAL_IVAL) &&
(X->W.data[DVAL2_PVAL_IFLD] == 0)) {
Generators::assign_property(gen, call_it, I"0", TRUE);
} else {
Generators::assign_property(gen, call_it, I"1", TRUE);
}
} else {
TEMPORARY_TEXT(OUT)
CodeGen::select_temporary(gen, OUT);
if (Generators::optimise_property_value(gen, prop_name, X) == FALSE) {
CodeGen::pair(gen, X,
X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD]);
}
CodeGen::deselect_temporary(gen);
Generators::assign_property(gen, call_it, OUT, FALSE);
DISCARD_TEXT(OUT)
}
}
}
void VanillaObjects::append(code_generation *gen, inter_symbol *symb) {
text_stream *OUT = CodeGen::current(gen);
void VanillaObjects::generate(code_generation *gen) {
inter_tree *I = gen->from;
text_stream *S = Inter::Symbols::read_annotation_t(symb, I, APPEND_IANN);
if (Str::len(S) == 0) return;
WRITE(" ");
Vanilla::splat_matter(OUT, I, S);
inter_symbol **kinds_in_source_order = NULL;
inter_symbol **kinds_in_declaration_order = NULL;
@<Make a list of kinds in source order@>;
@<Make a list of kinds in declaration order@>;
inter_symbol **instances_in_declaration_order = NULL;
@<Make a list of instances in declaration order@>;
if (LinkedLists::len(gen->unassimilated_properties) > 0) {
@<Declare and allocate properties@>;
@<Compile the property numberspace forcer@>;
@<Write Value Property Holder objects for each kind of value instance@>;
}
@<Annotate kinds of object with a sequence counter@>;
@<Write the KindHierarchy array@>;
@<Write an I6 Class definition for each kind of object@>;
@<Write an I6 Object definition for each object instance@>;
@<Write the property metadata array@>;
}
@<Make a list of kinds in source order@> =
if (LinkedLists::len(gen->kinds) > 0) {
kinds_in_source_order = (inter_symbol **)
(Memory::calloc(LinkedLists::len(gen->kinds), sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int i = 0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->kinds) {
inter_symbol *kind_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_KIND_IFLD);
kinds_in_source_order[i++] = kind_name;
}
qsort(kinds_in_source_order, (size_t) i, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols);
}
@h Representing instances in I6.
Partly for historical reasons, partly to squeeze performance out of the
virtual machines used in traditional parser IF, the I6 run-time
implementation of instances and their properties is complicated.
@<Make a list of kinds in declaration order@> =
if (LinkedLists::len(gen->kinds) > 0) {
kinds_in_declaration_order = (inter_symbol **)
(Memory::calloc(LinkedLists::len(gen->kinds), sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int i = 0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->kinds) {
inter_symbol *kind_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_KIND_IFLD);
kinds_in_declaration_order[i++] = kind_name;
}
qsort(kinds_in_declaration_order, (size_t) i, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols_decl);
}
The main complication is that there are two sorts of instance: objects,
such as doors and people, and everything else, such as scenes. The two
sorts are handled equally in Inter, but have completely different run-time
representations in I6:
@<Make a list of instances in declaration order@> =
if (LinkedLists::len(gen->instances) > 0) {
instances_in_declaration_order = (inter_symbol **)
(Memory::calloc(LinkedLists::len(gen->instances), sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int i=0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->instances) {
inter_symbol *inst_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_INST_IFLD);
instances_in_declaration_order[i++] = inst_name;
}
qsort(instances_in_declaration_order, (size_t) i, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols_decl);
}
(a) "Object instances" are instances of a kind which is a subkind, perhaps
indirectly, of "object". These are stored as I6 objects, and the I6 classes
of these objects correspond exactly to their I7 kinds (except that the kind
"object" itself is mapped to the I6 class "Class").
@<Declare and allocate properties@> =
inter_symbol *first_either_or_not_an_attribute = NULL;
int attribute_slots_used = 0;
(b) "Value instances" are instances of kinds which are not objects but can
nevertheless have properties. The scene "entire game" is a value instance; the
number 27 is not. Value instances are stored as enumerated constants. For
example, if there are scenes called "entire game", "Overture" and "Grand
Finale", then these are stored as the constants 1, 2, 3; and I6 constants are
defined to represent them.
inter_symbol *prop_name;
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->assimilated_properties)
@<Consider this property for attribute allocation@>;
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->unassimilated_properties)
@<Consider this property for attribute allocation@>;
@h Representing properties in I6.
Both sorts of instance can have properties; for example:
if (first_either_or_not_an_attribute == NULL)
Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, MANGLED_GDCFORM,
NULL, I"MAX_POSITIVE_NUMBER", FALSE);
else
Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, MANGLED_GDCFORM,
NULL, Inter::Symbols::name(first_either_or_not_an_attribute), FALSE);
>> A supporter has a number called carrying capacity.
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->assimilated_properties)
Generators::declare_property(gen, prop_name);
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->unassimilated_properties)
Generators::declare_property(gen, prop_name);
>> A scene has a number called completion score.
allows a property to be held by object instances (supporters) and value
instances (scenes). To the writer of I7 source text, no distinction between
these cases is visible, and the same is true of Inter code.
How to store these at run-time is not so straightforward. Speed and
compactness are unusually important here, and constraints imposed by the
virtual machine targeted by I6 add further complications.
(a) Properties of object instances are stored as either I6 properties or I6
attributes of their I6 objects. As far as possible, this is a direct mapping
from I7 instances and kinds onto I6 objects and classes. It is a little
bulkier in memory than using flat arrays, but the Glulx and Z-machine virtual
machines offer a very rapid lookup operation. Thus "the carrying capacity of
the player" can be compiled to the I6 expression |player.capacity|, which
compiles to a single short call to the I6 veneer -- and one which many
interpreters today have optimised out as a basic operation, taking only a
single VM clock cycle.
(b) The properties of value instances are stored in flat arrays called
"sticks", with each property having its own stick. For example, the property
"recurring" for a scene would have a stick holding three values, one each for
the three scenes. Sticks have the same run-time format as table columns and
this is not a coincidence, because some kinds of value instances are created
by table in I7, and this lets us use the table as a ready-made set of sticks.
But now we don't have run-time lookup mechanisms already provided for us, so
we will need to set up some metadata structures to make it possible to seek
property values for value instances quickly.
In practice, property access is slightly faster for object instances, and
property storage is slightly more compact for value instances, which is
probably the right bargain.
@h Properties.
Properties in I7 are of two sorts: either-or, which behave adjectivally,
such as "open"; and value, which behave as nouns, such as "carrying capacity".
We can distinguish these because the I7 compiler annotates the property name
symbols with the |EITHER_OR_IANN| flag. It also always gives either-or
properties the kind |K_truth_state|, but note that a few value properties
also have this kind, so the annotation is the only way to be sure.
Some either-or properties of object instances can be stored as I6
"attributes". This is memory-efficient and fast at run-time: but only a
limited number can be stored this way. Here we choose which.
=
void VanillaObjects::property(inter_tree *I, inter_symbol *prop_name, code_generation *gen, int *FBNA_found, int *attribute_slots_used) {
if (prop_name == NULL) internal_error("bad property");
@<Consider this property for attribute allocation@> =
if (Inter::Symbols::read_annotation(prop_name, EITHER_OR_IANN) >= 0) {
int translated = FALSE;
if (Inter::Symbols::read_annotation(prop_name, EXPLICIT_ATTRIBUTE_IANN) >= 0) translated = TRUE;
@ -169,16 +105,19 @@ void VanillaObjects::property(inter_tree *I, inter_symbol *prop_name, code_gener
@<Any either/or property which can belong to a value instance is ineligible@>;
@<An either/or property translated to an attribute declared in the I6 template must be chosen@>;
@<Otherwise give away attribute slots on a first-come-first-served basis@>;
if (make_attribute == TRUE) Inter::Symbols::set_flag(prop_name, ATTRIBUTE_MARK_BIT);
@<Check against the I7 compiler's beliefs@>;
if (make_attribute) {
@<Declare as an I6 attribute@>;
Inter::Symbols::set_flag(prop_name, ATTRIBUTE_MARK_BIT);
// if ((Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) ||
// (translated == FALSE))
// Generators::declare_attribute(gen, Inter::Symbols::name(prop_name));
} else {
@<Worry about the FBNA@>;
Inter::Symbols::clear_flag(prop_name, ATTRIBUTE_MARK_BIT);
if (first_either_or_not_an_attribute == NULL)
first_either_or_not_an_attribute = prop_name;
}
}
}
@ The dodge of using an attribute to store an either-or property won't work
for properties of value instances, because then the value-property-holder
@ -230,7 +169,7 @@ to be frequently used.
@<Otherwise give away attribute slots on a first-come-first-served basis@> =
if (make_attribute == NOT_APPLICABLE) {
if (*attribute_slots_used++ < ATTRIBUTE_SLOTS_TO_GIVE_AWAY)
if (attribute_slots_used++ < ATTRIBUTE_SLOTS_TO_GIVE_AWAY)
make_attribute = TRUE;
else
make_attribute = FALSE;
@ -250,22 +189,6 @@ check that here. (It tells us by marking the property name with the
internal_error("attribute allocation dispute");
}
@ A curiosity of I6 is that attributes must be declared before use, whereas
properties need not be. We generate suitable |Attribute| statements here.
Note that if the property has been translated onto an existing I6 name, then
we assume that's the name of an attribute already declared (for example
in the I6 template, or some extension), and we therefore do nothing.
@<Declare as an I6 attribute@> =
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) {
text_stream *A = Inter::Symbols::get_translate(prop_name);
if (A == NULL) A = Inter::Symbols::name(prop_name);
Generators::declare_attribute(gen, A);
} else {
if (translated == FALSE)
Generators::declare_attribute(gen, Inter::Symbols::name(prop_name));
}
@ The weak point in our scheme for making some either/or properties into
Attributes is that run-time code is going to need a fast way to determine
which, since they have to be accessed differently. We rely on the facts that
@ -284,165 +207,21 @@ This cutoff value |F| is customarily called FBNA, the "first boolean not
an attribute". (Perhaps she ought to be called FEONA.) The following
compiles an I6 constant for this value.
@<Worry about the FBNA@> =
if (*FBNA_found == FALSE) {
*FBNA_found = TRUE;
TEMPORARY_TEXT(val)
Generators::mangle(gen, val, Inter::Symbols::name(prop_name));
Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, val, FALSE);
DISCARD_TEXT(val)
}
@ It's unlikely, but just possible, that no FBNAs ever exist, so after the
above has been tried on all properties:
=
void VanillaObjects::consolidate(code_generation *gen) {
inter_tree *I = gen->from;
inter_symbol **all_props_in_source_order = NULL;
inter_symbol **props_in_source_order = NULL;
int no_unassimilated_properties = 0;
@<Make a list of properties in source order@>;
@<Compile the property numberspace forcer@>;
inter_symbol **kinds_in_source_order = NULL;
inter_symbol **kinds_in_declaration_order = NULL;
@<Make a list of kinds in source order@>;
inter_symbol **instances_in_declaration_order = NULL;
@<Make a list of instances in declaration order@>;
if (no_unassimilated_properties > 0) @<Write Value Property Holder objects for each kind of value instance@>;
@<Make a list of kinds in declaration order@>;
@<Annotate kinds of object with a sequence counter@>;
@<Write the KindHierarchy array@>;
@<Write an I6 Class definition for each kind of object@>;
@<Write an I6 Object definition for each object instance@>;
@<Write the property metadata array@>;
@<Stub the properties@>;
}
@<Make a list of properties in source order@> =
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->properties) {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_PROP_IFLD);
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) != 1)
no_unassimilated_properties++;
}
if (no_unassimilated_properties > 0) {
int FBNA_found = FALSE;
int attribute_slots_used = 0;
all_props_in_source_order = (inter_symbol **)
(Memory::calloc(no_unassimilated_properties, sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int c = 0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->properties) {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_PROP_IFLD);
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) != 1)
all_props_in_source_order[c++] = prop_name;
else
VanillaObjects::property(I, prop_name, gen, &FBNA_found, &attribute_slots_used);
}
qsort(all_props_in_source_order, (size_t) no_unassimilated_properties, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols);
for (int p=0; p<no_unassimilated_properties; p++) {
inter_symbol *prop_name = all_props_in_source_order[p];
VanillaObjects::property(I, prop_name, gen, &FBNA_found, &attribute_slots_used);
}
if (FBNA_found == FALSE)
Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, I"MAX_POSITIVE_NUMBER", FALSE);
}
if (no_unassimilated_properties > 0) {
props_in_source_order = (inter_symbol **)
(Memory::calloc(no_unassimilated_properties, sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int c = 0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->properties) {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_PROP_IFLD);
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) != 1)
props_in_source_order[c++] = prop_name;
}
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->properties) {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_PROP_IFLD);
if ((Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) == 1) &&
(Inter::Symbols::read_annotation(prop_name, ATTRIBUTE_IANN) != 1)) {
Generators::declare_property(gen, prop_name, TRUE);
}
}
}
@<Make a list of kinds in source order@> =
if (LinkedLists::len(gen->kinds) == 0) return;
kinds_in_source_order = (inter_symbol **)
(Memory::calloc(LinkedLists::len(gen->kinds), sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int i = 0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->kinds) {
inter_symbol *kind_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_KIND_IFLD);
kinds_in_source_order[i++] = kind_name;
}
qsort(kinds_in_source_order, (size_t) i, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols);
@<Make a list of kinds in declaration order@> =
kinds_in_declaration_order = (inter_symbol **)
(Memory::calloc(LinkedLists::len(gen->kinds), sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int i = 0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->kinds) {
inter_symbol *kind_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_KIND_IFLD);
kinds_in_declaration_order[i++] = kind_name;
}
qsort(kinds_in_declaration_order, (size_t) i, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols_decl);
@<Make a list of instances in declaration order@> =
if (LinkedLists::len(gen->instances) > 0) {
instances_in_declaration_order = (inter_symbol **)
(Memory::calloc(LinkedLists::len(gen->instances), sizeof(inter_symbol *), CODE_GENERATION_MREASON));
int i=0;
inter_tree_node *P;
LOOP_OVER_LINKED_LIST(P, inter_tree_node, gen->instances) {
inter_symbol *inst_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_INST_IFLD);
instances_in_declaration_order[i++] = inst_name;
}
qsort(instances_in_declaration_order, (size_t) i, sizeof(inter_symbol *),
VanillaObjects::compare_kind_symbols_decl);
}
@ But there's a snag. The above assumes that property values will have the
same ordering at run-time as their definition order here, but that isn't
necessarily true. The run-time ordering depends on how early in the I6
source code they appear, and that in turn depends on which objects have
which properties, and so on -- nothing we can rely on.
We finesse this by creating the following spurious object before the
class hierarchy and object tree are created: its properties are therefore
all new creations, and since we declare them in I7 creation order, they
are now allocated I6 property numbers in a sequence matching this. (We
don't care about the numbering of non-either/or properties, so we don't
bother to force them.)
@
@<Compile the property numberspace forcer@> =
if (no_unassimilated_properties > 0) {
segmentation_pos saved;
Generators::declare_instance(gen, I"Object", I"property_numberspace_forcer", NULL, -1, FALSE, &saved);
for (int p=0; p<no_unassimilated_properties; p++) {
inter_symbol *prop_name = props_in_source_order[p];
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT) == FALSE) {
inter_symbol *kind_name = Inter::Property::kind_of(prop_name);
if (kind_name == truth_state_kind_symbol) {
Generators::assign_property(gen, Inter::Symbols::name(prop_name), I"0", FALSE);
}
segmentation_pos saved;
Generators::declare_instance(gen, I"Object", I"property_numberspace_forcer", NULL, -1, FALSE, &saved);
inter_symbol *prop_name;
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->unassimilated_properties) {
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT) == FALSE) {
inter_symbol *kind_name = Inter::Property::kind_of(prop_name);
if (kind_name == truth_state_kind_symbol) {
Generators::assign_property(gen, Inter::Symbols::name(prop_name), I"0", FALSE);
}
}
Generators::end_instance(gen, I"Object", I"property_numberspace_forcer", saved);
}
Generators::end_instance(gen, I"Object", I"property_numberspace_forcer", saved);
@<Annotate kinds of object with a sequence counter@> =
inter_ti c = 1;
@ -535,10 +314,9 @@ take lightly in the Z-machine. But speed and flexibility are worth more.
WRITE_TO(N, "%d", Inter::Kind::instance_count(kind_name));
Generators::assign_property(gen, I"value_range", N, FALSE);
DISCARD_TEXT(N)
for (int p=0; p<no_unassimilated_properties; p++) {
inter_symbol *prop_name = props_in_source_order[p];
inter_symbol *prop_name;
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->unassimilated_properties)
CodeGen::unmark(prop_name);
}
inter_node_list *FL =
Inter::Warehouse::get_frame_list(InterTree::warehouse(I), Inter::Kind::permissions_list(kind_name));
@<Work through this frame list of permissions@>;
@ -767,12 +545,12 @@ The dummy value |-1| means that the relevant property has no metadata record,
though this won't happen for any property created by I7 source text.
@<Write the property metadata array@> =
if (no_unassimilated_properties > 0) {
if (LinkedLists::len(gen->unassimilated_properties) > 0) {
segmentation_pos saved;
Generators::begin_array(gen, I"property_metadata", NULL, NULL, WORD_ARRAY_FORMAT, &saved);
int pos = 0;
for (int p=0; p<no_unassimilated_properties; p++) {
inter_symbol *prop_name = props_in_source_order[p];
inter_symbol *prop_name;
LOOP_OVER_LINKED_LIST(prop_name, inter_symbol, gen->unassimilated_properties) {
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT))
Generators::property_offset(gen, Inter::Symbols::name(prop_name), pos, TRUE);
else
@ -813,8 +591,8 @@ number of objects, but we can live with that. $P$ does not in practice rise
linearly with the size of the source text, even though $N$ does.
@<Write a list of kinds or objects which are permitted to have this property@> =
for (int e=0; e<no_unassimilated_properties; e++) {
inter_symbol *eprop_name = props_in_source_order[e];
inter_symbol *eprop_name;
LOOP_OVER_LINKED_LIST(eprop_name, inter_symbol, gen->unassimilated_properties) {
if (Str::eq(Inter::Symbols::name(eprop_name), Inter::Symbols::name(prop_name))) {
inter_node_list *EVL =
Inter::Warehouse::get_frame_list(InterTree::warehouse(I),
@ -875,16 +653,6 @@ linearly with the size of the source text, even though $N$ does.
}
}
@
@<Stub the properties@> =
for (int p=0; p<no_unassimilated_properties; p++) {
inter_symbol *prop_name = props_in_source_order[p];
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) != 1) {
Generators::declare_property(gen, prop_name, FALSE);
}
}
@ =
int VanillaObjects::pnum(inter_symbol *prop_name) {
int N = Inter::Symbols::read_annotation(prop_name, SOURCE_ORDER_IANN);
@ -969,3 +737,161 @@ inter_ti VanillaObjects::kind_of_object_count(inter_symbol *kind_name) {
if (N >= 0) return (inter_ti) N;
return 0;
}
@
=
typedef struct kov_value_stick {
struct inter_symbol *prop;
struct inter_symbol *kind_name;
struct text_stream *identifier;
struct inter_tree_node *node;
CLASS_DEFINITION
} kov_value_stick;
@h Instances.
=
void VanillaObjects::instance(code_generation *gen, inter_tree_node *P) {
inter_symbol *inst_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_INST_IFLD);
inter_symbol *inst_kind = InterSymbolsTables::symbol_from_frame_data(P, KIND_INST_IFLD);
if (Inter::Kind::is_a(inst_kind, object_kind_symbol)) {
int c = Inter::Symbols::read_annotation(inst_name, ARROW_COUNT_IANN);
if (c < 0) c = 0;
int is_dir = Inter::Kind::is_a(inst_kind, direction_kind_symbol);
segmentation_pos saved;
Generators::declare_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name),
Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), c, is_dir, &saved);
VanillaObjects::append(gen, inst_name);
inter_node_list *FL =
Inode::ID_to_frame_list(P,
Inter::Instance::properties_list(inst_name));
VanillaObjects::plist(gen, FL);
Generators::end_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), saved);
} else {
inter_ti val1 = P->W.data[VAL1_INST_IFLD];
inter_ti val2 = P->W.data[VAL2_INST_IFLD];
int defined = TRUE;
if (val1 == UNDEF_IVAL) defined = FALSE;
TEMPORARY_TEXT(val)
if (defined) WRITE_TO(val, "%d", val2);
Generators::declare_value_instance(gen, Inter::Symbols::name(inst_name),
Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), val);
DISCARD_TEXT(val)
}
}
void VanillaObjects::plist(code_generation *gen, inter_node_list *FL) {
if (FL == NULL) internal_error("no properties list");
inter_tree_node *X;
LOOP_THROUGH_INTER_NODE_LIST(X, FL) {
inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(X, PROP_PVAL_IFLD);
if (prop_name == NULL) internal_error("no property");
text_stream *call_it = Inter::Symbols::name(prop_name);
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT)) {
if ((X->W.data[DVAL1_PVAL_IFLD] == LITERAL_IVAL) &&
(X->W.data[DVAL2_PVAL_IFLD] == 0)) {
Generators::assign_property(gen, call_it, I"0", TRUE);
} else {
Generators::assign_property(gen, call_it, I"1", TRUE);
}
} else {
TEMPORARY_TEXT(OUT)
CodeGen::select_temporary(gen, OUT);
if (Generators::optimise_property_value(gen, prop_name, X) == FALSE) {
CodeGen::pair(gen, X,
X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD]);
}
CodeGen::deselect_temporary(gen);
Generators::assign_property(gen, call_it, OUT, FALSE);
DISCARD_TEXT(OUT)
}
}
}
void VanillaObjects::append(code_generation *gen, inter_symbol *symb) {
text_stream *OUT = CodeGen::current(gen);
inter_tree *I = gen->from;
text_stream *S = Inter::Symbols::read_annotation_t(symb, I, APPEND_IANN);
if (Str::len(S) == 0) return;
WRITE(" ");
Vanilla::splat_matter(OUT, I, S);
}
@h Representing instances in I6.
Partly for historical reasons, partly to squeeze performance out of the
virtual machines used in traditional parser IF, the I6 run-time
implementation of instances and their properties is complicated.
The main complication is that there are two sorts of instance: objects,
such as doors and people, and everything else, such as scenes. The two
sorts are handled equally in Inter, but have completely different run-time
representations in I6:
(a) "Object instances" are instances of a kind which is a subkind, perhaps
indirectly, of "object". These are stored as I6 objects, and the I6 classes
of these objects correspond exactly to their I7 kinds (except that the kind
"object" itself is mapped to the I6 class "Class").
(b) "Value instances" are instances of kinds which are not objects but can
nevertheless have properties. The scene "entire game" is a value instance; the
number 27 is not. Value instances are stored as enumerated constants. For
example, if there are scenes called "entire game", "Overture" and "Grand
Finale", then these are stored as the constants 1, 2, 3; and I6 constants are
defined to represent them.
@h Representing properties in I6.
Both sorts of instance can have properties; for example:
>> A supporter has a number called carrying capacity.
>> A scene has a number called completion score.
allows a property to be held by object instances (supporters) and value
instances (scenes). To the writer of I7 source text, no distinction between
these cases is visible, and the same is true of Inter code.
How to store these at run-time is not so straightforward. Speed and
compactness are unusually important here, and constraints imposed by the
virtual machine targeted by I6 add further complications.
(a) Properties of object instances are stored as either I6 properties or I6
attributes of their I6 objects. As far as possible, this is a direct mapping
from I7 instances and kinds onto I6 objects and classes. It is a little
bulkier in memory than using flat arrays, but the Glulx and Z-machine virtual
machines offer a very rapid lookup operation. Thus "the carrying capacity of
the player" can be compiled to the I6 expression |player.capacity|, which
compiles to a single short call to the I6 veneer -- and one which many
interpreters today have optimised out as a basic operation, taking only a
single VM clock cycle.
(b) The properties of value instances are stored in flat arrays called
"sticks", with each property having its own stick. For example, the property
"recurring" for a scene would have a stick holding three values, one each for
the three scenes. Sticks have the same run-time format as table columns and
this is not a coincidence, because some kinds of value instances are created
by table in I7, and this lets us use the table as a ready-made set of sticks.
But now we don't have run-time lookup mechanisms already provided for us, so
we will need to set up some metadata structures to make it possible to seek
property values for value instances quickly.
In practice, property access is slightly faster for object instances, and
property storage is slightly more compact for value instances, which is
probably the right bargain.
@h Properties.
Properties in I7 are of two sorts: either-or, which behave adjectivally,
such as "open"; and value, which behave as nouns, such as "carrying capacity".
We can distinguish these because the I7 compiler annotates the property name
symbols with the |EITHER_OR_IANN| flag. It also always gives either-or
properties the kind |K_truth_state|, but note that a few value properties
also have this kind, so the annotation is the only way to be sure.
Some either-or properties of object instances can be stored as I6
"attributes". This is memory-efficient and fast at run-time: but only a
limited number can be stored this way. Here we choose which.
=

View file

@ -624,18 +624,30 @@ property names which don't exist as constant symbols with the harmless value
trick called "stubbing", these being "stub definitions".)
=
void I6Target::declare_property(code_generator *cgt, code_generation *gen,
inter_symbol *prop_name, int used) {
void I6Target::declare_property(code_generator *cgt, code_generation *gen, inter_symbol *prop_name) {
text_stream *name = Inter::Symbols::name(prop_name);
if (used) {
segmentation_pos saved = CodeGen::select(gen, predeclarations_I7CGS);
WRITE_TO(CodeGen::current(gen), "Property %S;\n", prop_name->symbol_name);
CodeGen::deselect(gen, saved);
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) == 1) {
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT) == 0) {
segmentation_pos saved = CodeGen::select(gen, predeclarations_I7CGS);
WRITE_TO(CodeGen::current(gen), "Property %S;\n", prop_name->symbol_name);
CodeGen::deselect(gen, saved);
}
} else {
segmentation_pos saved = CodeGen::select(gen, code_at_eof_I7CGS);
WRITE_TO(CodeGen::current(gen), "#ifndef %S; Constant %S = 0; #endif;\n", name, name);
CodeGen::deselect(gen, saved);
}
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT)) {
int translated = FALSE;
if (Inter::Symbols::read_annotation(prop_name, EXPLICIT_ATTRIBUTE_IANN) >= 0) translated = TRUE;
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) translated = TRUE;
if ((Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) ||
(translated == FALSE))
Generators::declare_attribute(gen, Inter::Symbols::name(prop_name));
}
}
void I6Target::declare_attribute(code_generator *cgt, code_generation *gen, text_stream *prop_name) {

View file

@ -62,7 +62,7 @@ void CObjectModel::initialise_data(code_generation *gen) {
void CObjectModel::begin(code_generation *gen) {
CObjectModel::initialise_data(gen);
@<Begin the initialiser function@>;
CObjectModel::property_by_name(gen, I"value_range", TRUE, FALSE);
CObjectModel::property_by_name(gen, I"value_range", FALSE);
}
void CObjectModel::end(code_generation *gen) {
@ -401,16 +401,24 @@ that references to it will not fail to compile.
=
void CObjectModel::declare_property(code_generator *cgt, code_generation *gen,
inter_symbol *prop_name, int used) {
inter_symbol *prop_name) {
int attr = FALSE;
if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT)) {
int translated = FALSE;
if (Inter::Symbols::read_annotation(prop_name, EXPLICIT_ATTRIBUTE_IANN) >= 0) translated = TRUE;
if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) translated = TRUE;
if ((Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) ||
(translated == FALSE)) attr = TRUE;
}
text_stream *name = Inter::Symbols::name(prop_name);
C_property *cp = CObjectModel::property_by_name(gen, name, used, FALSE);
C_property *cp = CObjectModel::property_by_name(gen, name, attr);
text_stream *pname = Metadata::read_optional_textual(Inter::Packages::container(prop_name->definition), I"^name");
if (pname)
CObjectModel::define_header_constant_for_property(gen, pname, cp->id);
}
void CObjectModel::declare_attribute(code_generator *cgt, code_generation *gen,
text_stream *prop_name) {
CObjectModel::property_by_name(gen, prop_name, TRUE, TRUE);
CObjectModel::property_by_name(gen, prop_name, TRUE);
}
@ Property IDs count upwards from 0 in declaration order, though they really
@ -424,7 +432,7 @@ typedef struct C_property {
CLASS_DEFINITION
} C_property;
C_property *CObjectModel::property_by_name(code_generation *gen, text_stream *name, int used, int attr) {
C_property *CObjectModel::property_by_name(code_generation *gen, text_stream *name, int attr) {
dictionary *D = C_GEN_DATA(objdata.declared_properties);
C_property *cp;
if (Dictionaries::find(D, name) == NULL) {
@ -558,7 +566,7 @@ typedef struct C_pv_pair {
void CObjectModel::assign_property(code_generator *cgt, code_generation *gen,
text_stream *property_name, text_stream *val, int as_att) {
C_property_owner *owner = C_GEN_DATA(objdata.current_owner);
C_property *prop = CObjectModel::property_by_name(gen, property_name, FALSE, FALSE);
C_property *prop = CObjectModel::property_by_name(gen, property_name, FALSE);
C_pv_pair *pair = CREATE(C_pv_pair);
pair->prop = prop;
pair->val = Str::duplicate(val);