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

Tentative movement of property storage policy into assembly

This commit is contained in:
Graham Nelson 2021-10-04 23:35:07 +01:00
parent db3b345654
commit 8c553d6565
12 changed files with 574 additions and 481 deletions

View file

@ -303,41 +303,40 @@ it doesn't mean it actually does have.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">WhetherProvides</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax"> </span><span class="identifier-syntax">issue_rtp</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">K</span><span class="plain-syntax"> ~= </span><span class="identifier-syntax">OBJECT_TY</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">obj</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">1</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">obj</span><span class="plain-syntax"> &gt; </span><span class="identifier-syntax">value_ranges</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">K</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">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_BADVALUEPROPERTY</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">holder</span><span class="plain-syntax"> = </span><span class="identifier-syntax">value_property_holders</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">K</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">holder</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">holder</span><span class="plain-syntax"> </span><span class="reserved-syntax">provides</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax">)) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">ProvidesProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax"> </span><span class="identifier-syntax">issue_rtp</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">OBJECT_TY</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">ScanPropertyMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">PermissionFound</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">obj</span><span class="plain-syntax"> </span><span class="reserved-syntax">provides</span><span class="plain-syntax"> </span><span class="identifier-syntax">KD_Count</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">obj</span><span class="plain-syntax">.</span><span class="identifier-syntax">KD_Count</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</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">a</span><span class="plain-syntax"> = </span><span class="identifier-syntax">l</span><span class="plain-syntax">*2;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ScanPropertyMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">KindHierarchy</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">a</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">PermissionFound</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindHierarchy</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">a</span><span class="plain-syntax">+1);</span>
<span class="plain-syntax"> }</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">obj</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_PROPOFNOTHING</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</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">ScanPropertyMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">K0_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">PermissionFound</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">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_UNPROVIDED</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</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="reserved-syntax">metaclass</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">) ~= </span><span class="identifier-syntax">Object</span><span class="plain-syntax">) </span><span class="reserved-syntax">rfalse</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">q</span><span class="plain-syntax">&lt;0) </span><span class="identifier-syntax">q</span><span class="plain-syntax"> = ~</span><span class="identifier-syntax">q</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">ScanPropertyMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">PermissionFound</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">obj</span><span class="plain-syntax"> </span><span class="reserved-syntax">provides</span><span class="plain-syntax"> </span><span class="identifier-syntax">KD_Count</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">obj</span><span class="plain-syntax">.</span><span class="identifier-syntax">KD_Count</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">l</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">a</span><span class="plain-syntax"> = </span><span class="identifier-syntax">l</span><span class="plain-syntax">*2;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ScanPropertyMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">KindHierarchy</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">a</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">PermissionFound</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">l</span><span class="plain-syntax"> = </span><span class="identifier-syntax">KindHierarchy</span><span class="plain-syntax">--&gt;(</span><span class="identifier-syntax">a</span><span class="plain-syntax">+1);</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">ScanPropertyMetadata</span><span class="plain-syntax">(</span><span class="identifier-syntax">K0_kind</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">)) </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">PermissionFound</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">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_UNPROVIDED</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">PermissionFound</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">q</span><span class="plain-syntax">--&gt;2) </span><span class="reserved-syntax">rtrue</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">obj</span><span class="plain-syntax"> </span><span class="reserved-syntax">provides</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</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">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_UNSET</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">provides_gprop</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> </span><span class="identifier-syntax">q</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</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">a</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">;</span>
<span class="comment-syntax">if (K ~= OBJECT_TY) {</span>
<span class="comment-syntax"> if ((obj &gt;= 1) &amp;&amp; (obj &lt;= value_ranges--&gt;K)) {</span>
<span class="comment-syntax"> holder = value_property_holders--&gt;K;</span>
<span class="comment-syntax"> if ((holder) &amp;&amp; (holder provides q)) rtrue;</span>
<span class="comment-syntax"> }</span>
<span class="comment-syntax">} else {</span>
<span class="comment-syntax"> if ((obj) &amp;&amp; (metaclass(obj) == Object)) {</span>
<span class="comment-syntax"> if (q--&gt;0 == 2) rtrue;</span>
<span class="comment-syntax"> if (obj provides q) rtrue;</span>
<span class="comment-syntax"> }</span>
<span class="comment-syntax">}</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">issue_rtp</span><span class="plain-syntax">) </span><span class="identifier-syntax">RunTimeProblem</span><span class="plain-syntax">(</span><span class="identifier-syntax">RTP_UNSET</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">q</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">rfalse</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">PrintPropertyName</span><span class="plain-syntax"> </span><span class="identifier-syntax">p</span><span class="plain-syntax"> </span><span class="identifier-syntax">textual</span><span class="plain-syntax">;</span>
@ -375,18 +374,20 @@ the one which the player is on.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">GProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">-</span><span class="identifier-syntax">err</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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">OBJECT_TY</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">pr</span><span class="plain-syntax">--&gt;0 == </span><span class="constant-syntax">2</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">V</span><span class="plain-syntax"> </span><span class="reserved-syntax">has</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">) </span><span class="reserved-syntax">rtrue</span><span class="plain-syntax">; </span><span class="reserved-syntax">rfalse</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">pr</span><span class="plain-syntax"> == </span><span class="identifier-syntax">door_to</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</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">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">holder</span><span class="plain-syntax"> = </span><span class="identifier-syntax">value_property_holders</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">K</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">holder</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax">)--&gt;(</span><span class="identifier-syntax">V</span><span class="plain-syntax">+</span><span class="identifier-syntax">COL_HSIZE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">[ </span><span class="identifier-syntax">GProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">err</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">ProvidesProperty</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">-</span><span class="identifier-syntax">err</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">read_gprop</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</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">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">;</span>
<span class="comment-syntax"> if (K == OBJECT_TY) {</span>
<span class="comment-syntax"> if (pr--&gt;0 == 2) {</span>
<span class="comment-syntax"> if (V has pr) rtrue; rfalse;</span>
<span class="comment-syntax"> }</span>
<span class="comment-syntax"> if (pr == door_to) return V.pr();</span>
<span class="comment-syntax"> return V.pr;</span>
<span class="comment-syntax"> } else {</span>
<span class="comment-syntax"> holder = value_property_holders--&gt;K;</span>
<span class="comment-syntax"> return (holder.pr)--&gt;(V+COL_HSIZE);</span>
<span class="comment-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>
@ -398,17 +399,18 @@ converted from an rvalue to an lvalue.
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">[ </span><span class="identifier-syntax">WriteGProperty</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax"> </span><span class="identifier-syntax">holder</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">WhetherProvides</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-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">K</span><span class="plain-syntax"> == </span><span class="identifier-syntax">OBJECT_TY</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">pr</span><span class="plain-syntax">--&gt;0 == </span><span class="constant-syntax">2</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">val</span><span class="plain-syntax">) </span><span class="reserved-syntax">give</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax">; </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">give</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> ~</span><span class="identifier-syntax">pr</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax"> = </span><span class="identifier-syntax">val</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="identifier-syntax">holder</span><span class="plain-syntax"> = </span><span class="identifier-syntax">value_property_holders</span><span class="plain-syntax">--&gt;</span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">holder</span><span class="plain-syntax">.</span><span class="identifier-syntax">pr</span><span class="plain-syntax">)--&gt;(</span><span class="identifier-syntax">V</span><span class="plain-syntax">+</span><span class="identifier-syntax">COL_HSIZE</span><span class="plain-syntax">) = </span><span class="identifier-syntax">val</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">ProvidesProperty</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">V</span><span class="plain-syntax">, </span><span class="identifier-syntax">pr</span><span class="plain-syntax">, </span><span class="reserved-syntax">true</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> @</span><span class="identifier-syntax">write_gprop</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax"> </span><span class="identifier-syntax">V</span><span class="plain-syntax"> </span><span class="identifier-syntax">pr</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">;</span>
<span class="comment-syntax"> if (K == OBJECT_TY) {</span>
<span class="comment-syntax"> if (pr--&gt;0 == 2) {</span>
<span class="comment-syntax"> if (val) give V pr; else give V ~pr;</span>
<span class="comment-syntax"> } else {</span>
<span class="comment-syntax"> V.pr = val;</span>
<span class="comment-syntax"> }</span>
<span class="comment-syntax"> } else {</span>
<span class="comment-syntax"> holder = value_property_holders--&gt;K;</span>
<span class="comment-syntax"> (holder.pr)--&gt;(V+COL_HSIZE) = val;</span>
<span class="comment-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">];</span>
</pre>

View file

@ -334,7 +334,7 @@ but for now about 10 layers is plenty.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</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 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">&#167;10</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#SP14">&#167;14</a><br/>C Object Model - <a href="5-com.html#SP1_3">&#167;1.3</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_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#SP9">&#167;9</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::select</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">CodeGen::select</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP7">&#167;7</a>, <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP10">&#167;10</a>, <a href="4-fi6.html#SP11">&#167;11</a><br/>Final C - <a href="5-fnc.html#SP5">&#167;5</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">&#167;10</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#SP14">&#167;14</a><br/>C Object Model - <a href="5-com.html#SP1_3">&#167;1.3</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_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#SP9">&#167;9</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="2-cg.html#SP9" class="function-link"><span class="function-syntax">CodeGen::select_layered</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
@ -351,7 +351,7 @@ but for now about 10 layers is plenty.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">previous_pos</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::deselect</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP7">&#167;7</a>, <a href="4-fi6.html#SP8">&#167;8</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 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#SP14">&#167;14</a><br/>C Object Model - <a href="5-com.html#SP1_3">&#167;1.3</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_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#SP9">&#167;9</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::deselect</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">CodeGen::deselect</span></span>:<br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP7">&#167;7</a>, <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP11">&#167;11</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 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#SP14">&#167;14</a><br/>C Object Model - <a href="5-com.html#SP1_3">&#167;1.3</a>, <a href="5-com.html#SP2">&#167;2</a>, <a href="5-com.html#SP3">&#167;3</a>, <a href="5-com.html#SP4">&#167;4</a>, <a href="5-com.html#SP7">&#167;7</a>, <a href="5-com.html#SP1_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#SP9">&#167;9</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;1</a><br/>C Literals - <a href="5-clt.html#SP1">&#167;1</a>, <a href="5-clt.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="reserved-syntax">segmentation_pos</span><span class="plain-syntax"> </span><span class="identifier-syntax">saved</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">temporarily_diverted</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"poorly timed deselection"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">segmentation</span><span class="plain-syntax">.</span><span class="element-syntax">pos</span><span class="plain-syntax"> = </span><span class="identifier-syntax">saved</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -361,13 +361,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#SP1_2_2_1_1">&#167;1.2.2.1.1</a>, <a href="2-vo.html#SP2_3_4_1_1">&#167;2.3.4.1.1</a>, <a href="2-vo.html#SP8">&#167;8</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_2_2_1_1">&#167;1.2.2.1.1</a>, <a href="2-vo.html#SP2_3_4_1_1">&#167;2.3.4.1.1</a>, <a href="2-vo.html#SP8">&#167;8</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP9_1">&#167;9.1</a>, <a href="4-fi6.html#SP9_2">&#167;9.2</a>, <a href="4-fi6.html#SP9_3">&#167;9.3</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#SP1_2_2_1_1">&#167;1.2.2.1.1</a>, <a href="2-vo.html#SP2_3_4_1_1">&#167;2.3.4.1.1</a>, <a href="2-vo.html#SP8">&#167;8</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_2_2_1_1">&#167;1.2.2.1.1</a>, <a href="2-vo.html#SP2_3_4_1_1">&#167;2.3.4.1.1</a>, <a href="2-vo.html#SP8">&#167;8</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP9_1">&#167;9.1</a>, <a href="4-fi6.html#SP9_2">&#167;9.2</a>, <a href="4-fi6.html#SP9_3">&#167;9.3</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>
@ -377,7 +377,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#SP8">&#167;8</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP3_4">&#167;3.4</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#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#SP9">&#167;9</a>, <a href="5-com.html#SP10">&#167;10</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#SP8">&#167;8</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP3">&#167;3</a>, <a href="4-fi6.html#SP3_4">&#167;3.4</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>, <a href="4-fi6.html#SP11">&#167;11</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#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#SP9">&#167;9</a>, <a href="5-com.html#SP10">&#167;10</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>
@ -453,7 +453,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_3_4_1_1">&#167;2.3.4.1.1</a>, <a href="2-vo.html#SP8">&#167;8</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#SP2_3_4_1_1">&#167;2.3.4.1.1</a>, <a href="2-vo.html#SP8">&#167;8</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#SP10">&#167;10</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 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="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#SP10">&#167;10</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>

View file

@ -254,7 +254,7 @@ well the entire tree by the end.
<span class="definition-keyword">define</span> <span class="constant-syntax">VNODE_ALLC</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">) </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">)</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Vanilla::node</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Vanilla::node</span></span>:<br/><a href="2-tvg.html#SP1_9">&#167;1.9</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP3_4">&#167;3.4</a>, <a href="4-fi6.html#SP3_6">&#167;3.6</a>, <a href="4-fi6.html#SP3_14">&#167;3.14</a>, <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP9">&#167;9</a><br/>C References - <a href="5-crf.html#SP2">&#167;2</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Program Control - <a href="5-cpc.html#SP1_1">&#167;1.1</a>, <a href="5-cpc.html#SP1_8">&#167;1.8</a>, <a href="5-cpc.html#SP2">&#167;2</a><br/>C Conditions - <a href="5-ccn.html#SP2">&#167;2</a>, <a href="5-ccn.html#SP2_1">&#167;2.1</a>, <a href="5-ccn.html#SP2_2">&#167;2.2</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;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">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">Vanilla::node</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Vanilla::node</span></span>:<br/><a href="2-tvg.html#SP1_9">&#167;1.9</a><br/>Generating Inform 6 - <a href="4-fi6.html#SP3_4">&#167;3.4</a>, <a href="4-fi6.html#SP3_6">&#167;3.6</a>, <a href="4-fi6.html#SP3_14">&#167;3.14</a>, <a href="4-fi6.html#SP8">&#167;8</a>, <a href="4-fi6.html#SP9">&#167;9</a>, <a href="4-fi6.html#SP9_1">&#167;9.1</a>, <a href="4-fi6.html#SP9_2">&#167;9.2</a>, <a href="4-fi6.html#SP9_3">&#167;9.3</a><br/>C References - <a href="5-crf.html#SP2">&#167;2</a><br/>C Assembly - <a href="5-cas.html#SP3">&#167;3</a><br/>C Program Control - <a href="5-cpc.html#SP1_1">&#167;1.1</a>, <a href="5-cpc.html#SP1_8">&#167;1.8</a>, <a href="5-cpc.html#SP2">&#167;2</a><br/>C Conditions - <a href="5-ccn.html#SP2">&#167;2</a>, <a href="5-ccn.html#SP2_1">&#167;2.1</a>, <a href="5-ccn.html#SP2_2">&#167;2.2</a><br/>C Function Model - <a href="5-cfm.html#SP1">&#167;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">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="reserved-syntax">switch</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">ID_IFLD</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">CONSTANT_IST:</span><span class="plain-syntax"> </span><a href="2-vc.html#SP1" class="function-link"><span class="function-syntax">VanillaConstants::constant</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>

View file

@ -146,15 +146,15 @@ function togglePopup(material_id) {
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">EVALUATE_LABEL_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP8" class="function-link"><span class="function-syntax">I6Target::evaluate_label</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">INVOKE_FUNCTION_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP9" class="function-link"><span class="function-syntax">I6Target::invoke_function</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">INVOKE_OPCODE_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP9" class="function-link"><span class="function-syntax">I6Target::invoke_opcode</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">BEGIN_ARRAY_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP9" class="function-link"><span class="function-syntax">I6Target::begin_array</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRY_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP9" class="function-link"><span class="function-syntax">I6Target::array_entry</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_LITERAL_SYMBOL_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP9" class="function-link"><span class="function-syntax">I6Target::compile_literal_symbol</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRIES_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::array_entries</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">END_ARRAY_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::end_array</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">BEGIN_ARRAY_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::begin_array</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRY_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::array_entry</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">COMPILE_LITERAL_SYMBOL_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::compile_literal_symbol</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">ARRAY_ENTRIES_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP11" class="function-link"><span class="function-syntax">I6Target::array_entries</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">END_ARRAY_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP11" class="function-link"><span class="function-syntax">I6Target::end_array</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">OFFER_PRAGMA_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP3" class="function-link"><span class="function-syntax">I6Target::offer_pragma</span></a><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">END_GENERATION_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP3" class="function-link"><span class="function-syntax">I6Target::end_generation</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">PSEUDO_OBJECT_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::pseudo_object</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">NEW_ACTION_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::new_action</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">PSEUDO_OBJECT_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP11" class="function-link"><span class="function-syntax">I6Target::pseudo_object</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</span><span class="plain-syntax">, </span><span class="constant-syntax">NEW_ACTION_MTID</span><span class="plain-syntax">, </span><a href="4-fi6.html#SP11" class="function-link"><span class="function-syntax">I6Target::new_action</span></a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inform6_target</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cgt</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
@ -1405,6 +1405,9 @@ or implement assembly-language operations like <span class="extract"><span class
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">opcode</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">operand_count</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> **</span><span class="identifier-syntax">operands</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">label</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">label_sense</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">void_context</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#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="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">opcode</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"@provides_gprop"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="4-fi6.html#SP9_1" class="named-paragraph-link"><span class="named-paragraph">Invoke special provides_gprop</span><span class="named-paragraph-number">9.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">opcode</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"@read_gprop"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="4-fi6.html#SP9_2" class="named-paragraph-link"><span class="named-paragraph">Invoke special read_gprop</span><span class="named-paragraph-number">9.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">opcode</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"@write_gprop"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="4-fi6.html#SP9_3" class="named-paragraph-link"><span class="named-paragraph">Invoke special write_gprop</span><span class="named-paragraph-number">9.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">opcode</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">opc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">opc</span><span class="plain-syntax"> &lt; </span><span class="identifier-syntax">operand_count</span><span class="plain-syntax">; </span><span class="identifier-syntax">opc</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" "</span><span class="plain-syntax">);</span>
@ -1417,7 +1420,133 @@ or implement assembly-language operations like <span class="extract"><span class
<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">void_context</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9_1" class="paragraph-anchor"></a><b>&#167;9.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Invoke special provides_gprop</span><span class="named-paragraph-number">9.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">obj</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">p</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">val</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[2]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[3]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"if (%S == OBJECT_TY) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if ((%S) &amp;&amp; (metaclass(%S) == Object)) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if ((%S--&gt;0 == 2) || (%S provides %S--&gt;1)) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S = 1;\n"</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" } else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S = 0;\n"</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" }\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" } else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S = 0;\n"</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" }\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"} else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if ((%S &gt;= 1) &amp;&amp; (%S &lt;= value_ranges--&gt;%S)) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" holder = value_property_holders--&gt;%S;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if ((holder) &amp;&amp; (holder provides %S--&gt;1)) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S = 1;\n"</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" } else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S = 0;\n"</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" }\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" } else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S = 0;\n"</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" }\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"}\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</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">DISCARD_TEXT</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">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-fi6.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_2" class="paragraph-anchor"></a><b>&#167;9.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Invoke special read_gprop</span><span class="named-paragraph-number">9.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">obj</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">p</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[2]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"if (%S == OBJECT_TY) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if (%S--&gt;0 == 2) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if (%S has %S--&gt;1) rtrue; rfalse;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" }\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if (%S == door_to) return (%S--&gt;1).%S();\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" return %S.(%S--&gt;1);\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"} else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" holder = value_property_holders--&gt;%S;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" return (holder.(%S--&gt;1))--&gt;(%S+COL_HSIZE);\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"}\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-fi6.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP9_3" class="paragraph-anchor"></a><b>&#167;9.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Invoke special write_gprop</span><span class="named-paragraph-number">9.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</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">obj</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">p</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">val</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[2]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::select_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tvg.html#SP2" class="function-link"><span class="function-syntax">Vanilla::node</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">operands</span><span class="plain-syntax">[3]);</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP10" class="function-link"><span class="function-syntax">CodeGen::deselect_temporary</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"if (%S == OBJECT_TY) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if (%S--&gt;0 == 2) {\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" if (%S) give %S %S--&gt;1; else give %S ~(%S--&gt;1);\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">val</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" } else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" %S.(%S--&gt;1) = %S;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</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="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" }\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"} else {\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">" ((value_property_holders--&gt;%S).(%S--&gt;1))--&gt;(%S+COL_HSIZE) = %S;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">obj</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">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"}\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</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">DISCARD_TEXT</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">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="4-fi6.html#SP9">&#167;9</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b></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">I6Target::begin_array</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">I6Target::begin_array</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">array_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">if</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">choice</span><span class="plain-syntax"> = </span><span class="constant-syntax">early_matter_I7CGS</span><span class="plain-syntax">;</span>
@ -1466,7 +1595,7 @@ or implement assembly-language operations like <span class="extract"><span class
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">aliased</span><span class="plain-syntax"> == </span><span class="identifier-syntax">verb_directive_creature_symbol</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"creature"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">aliased</span><span class="plain-syntax"> == </span><span class="identifier-syntax">verb_directive_topic_symbol</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"topic"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">aliased</span><span class="plain-syntax"> == </span><span class="identifier-syntax">verb_directive_multiexcept_symbol</span><span class="plain-syntax">) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"multiexcept"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="4-fi6.html#SP9" class="function-link"><span class="function-syntax">I6Target::compile_literal_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</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">else</span><span class="plain-syntax"> </span><a href="4-fi6.html#SP10" class="function-link"><span class="function-syntax">I6Target::compile_literal_symbol</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">cgt</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="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><a href="2-cg.html#SP15" class="function-link"><span class="function-syntax">CodeGen::pair</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">val1</span><span class="plain-syntax">, </span><span class="identifier-syntax">val2</span><span class="plain-syntax">);</span>
@ -1496,7 +1625,7 @@ or implement assembly-language operations like <span class="extract"><span class
<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">S</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Alternatively, we can just specify how many entries there will be: they will
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>Alternatively, we can just specify how many entries there will be: they will
then be initialised to 0.
</p>

View file

@ -126,7 +126,7 @@ package already supplied:
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">prn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">prop_package</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTProperties::iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">RTProperties::iname</span></span>:<br/><a href="5-prp.html#SP5">&#167;5</a>, <a href="5-prp.html#SP7">&#167;7</a>, <a href="5-prp.html#SP7_4">&#167;7.4</a>, <a href="5-prp.html#SP9">&#167;9</a>, <a href="5-prp.html#SP10_1">&#167;10.1</a>, <a href="5-prp.html#SP10_2">&#167;10.2</a><br/>Emit - <a href="2-emt.html#SP17">&#167;17</a>, <a href="2-emt.html#SP18">&#167;18</a><br/>Emit Code - <a href="2-ec.html#SP8">&#167;8</a><br/>Instance Counting - <a href="2-ic.html#SP4">&#167;4</a><br/>Showme Command - <a href="2-sc.html#SP6_1">&#167;6.1</a>, <a href="2-sc.html#SP6_1_1">&#167;6.1.1</a>, <a href="2-sc.html#SP6_1_1_1">&#167;6.1.1.1</a>, <a href="2-sc.html#SP6_2">&#167;6.2</a><br/>Scene Instances - <a href="5-si.html#SP6_1">&#167;6.1</a><br/>Relations - <a href="5-rlt.html#SP7_3_3">&#167;7.3.3</a><br/>Command Grammar Tokens - <a href="7-cgt.html#SP1_2_4">&#167;1.2.4</a>, <a href="7-cgt.html#SP1_2_6">&#167;1.2.6</a>, <a href="7-cgt.html#SP1_2_7">&#167;1.2.7</a>, <a href="7-cgt.html#SP1_2_10_2_1">&#167;1.2.10.2.1</a>, <a href="7-cgt.html#SP1_2_10_2_2">&#167;1.2.10.2.2</a><br/>Parse Name Properties - <a href="7-pnp.html#SP4_3_1">&#167;4.3.1</a>, <a href="7-pnp.html#SP6_2">&#167;6.2</a>, <a href="7-pnp.html#SP8">&#167;8</a>, <a href="7-pnp.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="function-syntax">RTProperties::iname</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">RTProperties::iname</span></span>:<br/><a href="5-prp.html#SP5">&#167;5</a>, <a href="5-prp.html#SP7">&#167;7</a>, <a href="5-prp.html#SP7_4">&#167;7.4</a>, <a href="5-prp.html#SP9">&#167;9</a>, <a href="5-prp.html#SP10">&#167;10</a><br/>Emit - <a href="2-emt.html#SP17">&#167;17</a>, <a href="2-emt.html#SP18">&#167;18</a><br/>Emit Code - <a href="2-ec.html#SP8">&#167;8</a><br/>Instance Counting - <a href="2-ic.html#SP4">&#167;4</a><br/>Showme Command - <a href="2-sc.html#SP6_1">&#167;6.1</a>, <a href="2-sc.html#SP6_1_1">&#167;6.1.1</a>, <a href="2-sc.html#SP6_1_1_1">&#167;6.1.1.1</a>, <a href="2-sc.html#SP6_2">&#167;6.2</a><br/>Scene Instances - <a href="5-si.html#SP6_1">&#167;6.1</a><br/>Relations - <a href="5-rlt.html#SP7_3_3">&#167;7.3.3</a><br/>Command Grammar Tokens - <a href="7-cgt.html#SP1_2_4">&#167;1.2.4</a>, <a href="7-cgt.html#SP1_2_6">&#167;1.2.6</a>, <a href="7-cgt.html#SP1_2_7">&#167;1.2.7</a>, <a href="7-cgt.html#SP1_2_10_2_1">&#167;1.2.10.2.1</a>, <a href="7-cgt.html#SP1_2_10_2_2">&#167;1.2.10.2.2</a><br/>Parse Name Properties - <a href="7-pnp.html#SP4_3_1">&#167;4.3.1</a>, <a href="7-pnp.html#SP6_2">&#167;6.2</a>, <a href="7-pnp.html#SP8">&#167;8</a>, <a href="7-pnp.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</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">prn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to find iname for null property"</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">Properties::is_either_or</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">)) &amp;&amp; (</span><span class="identifier-syntax">prn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">store_in_negation</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">EitherOrProperties::get_negation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
@ -188,7 +188,7 @@ kit, we'll have to use that one.
</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">RTProperties::stored_in_negation</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">RTProperties::stored_in_negation</span></span>:<br/><a href="5-prp.html#SP10_1">&#167;10.1</a>, <a href="5-prp.html#SP10_2">&#167;10.2</a><br/>Emit Code - <a href="2-ec.html#SP8">&#167;8</a><br/>Showme Command - <a href="2-sc.html#SP6_2">&#167;6.2</a><br/>Property Values - <a href="6-pv.html#SP2_2_1">&#167;2.2.1</a><br/>Parse Name Properties - <a href="7-pnp.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">RTProperties::stored_in_negation</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">RTProperties::stored_in_negation</span></span>:<br/><a href="5-prp.html#SP10">&#167;10</a><br/>Emit Code - <a href="2-ec.html#SP8">&#167;8</a><br/>Showme Command - <a href="2-sc.html#SP6_2">&#167;6.2</a><br/>Property Values - <a href="6-pv.html#SP2_2_1">&#167;2.2.1</a><br/>Parse Name Properties - <a href="7-pnp.html#SP7">&#167;7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</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">prn</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">prn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">either_or_data</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">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"non-EO property"</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">prn</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="identifier-syntax">store_in_negation</span><span class="plain-syntax">;</span>
@ -367,89 +367,46 @@ and its analogue for writing, <span class="extract"><span class="extract-syntax"
<span class="plain-syntax"> </span><span class="reserved-syntax">return</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="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Either-or properties are trickier, though only because they use a different
pair of functions at runtime for EO properties of objects than for EO properties
of anything else:
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. </b>Either-or properties work analogously, though note that on reading, <span class="extract"><span class="extract-syntax">GProperty</span></span>
is called slightly differently so that objects are allowed access to read (though
not write) either/or properties which they do not possess. The result is always
<span class="extract"><span class="extract-syntax">false</span></span>, but run-time errors do not occur. (This all goes back to the way
attributes were handled on the Z-machine VM, but is an assumption made by some
of the kit code inherited from early days of Inform, and does no actual harm.)
</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">RTProperties::write_either_or_schemas</span><span class="plain-syntax">(</span><span class="identifier-syntax">adjective_meaning</span><span class="plain-syntax"> *</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</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">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeaningDomains::get_kind</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</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">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-prp.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Set the schemata for an either/or property adjective with objects as domain</span><span class="named-paragraph-number">10.1</span></a></span>
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="5-prp.html#SP10_2" class="named-paragraph-link"><span class="named-paragraph">Set the schemata for an either/or property adjective with some other domain</span><span class="named-paragraph-number">10.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-prp.html#SP4" class="function-link"><span class="function-syntax">RTProperties::stored_in_negation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">neg</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EitherOrProperties::get_negation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(%k, *1, %n, 1) == false"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n, 0)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n, 1)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(%k, *1, %n, 1)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n, 1)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n, 0)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10_1" class="paragraph-anchor"></a><b>&#167;10.1. </b>The "objects" domain is not really very different, but it's the one used
overwhelmingly most often, so we will call the relevant routines directly rather
than accessing them via the unifying routines <span class="extract"><span class="extract-syntax">GProperty</span></span> and <span class="extract"><span class="extract-syntax">WriteGProperty</span></span> &mdash;
which would work just as well, but more slowly.
</p>
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set the schemata for an either/or property adjective with objects as domain</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-prp.html#SP4" class="function-link"><span class="function-syntax">RTProperties::stored_in_negation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">neg</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EitherOrProperties::get_negation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(OBJECT_TY, *1, %n, true) == false"</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">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 0)"</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">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 1)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_name</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(OBJECT_TY, *1, %n, true)"</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">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 1)"</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">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(OBJECT_TY, *1, %n, 0)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-prp.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP10_2" class="paragraph-anchor"></a><b>&#167;10.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Set the schemata for an either/or property adjective with some other domain</span><span class="named-paragraph-number">10.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="5-prp.html#SP4" class="function-link"><span class="function-syntax">RTProperties::stored_in_negation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">neg</span><span class="plain-syntax"> = </span><span class="identifier-syntax">EitherOrProperties::get_negation</span><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(%k, *1, %n) == false"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n, true)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">neg</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">TEST_ATOM_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"GProperty(%k, *1, %n)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_TRUE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n, true)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sch</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AdjectiveMeanings::make_schema</span><span class="plain-syntax">(</span><span class="identifier-syntax">am</span><span class="plain-syntax">, </span><span class="identifier-syntax">NOW_ATOM_FALSE_TASK</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">sch</span><span class="plain-syntax">, </span><span class="string-syntax">"WriteGProperty(%k, *1, %n)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><a href="5-prp.html#SP2" class="function-link"><span class="function-syntax">RTProperties::iname</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prn</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-prp.html#SP10">&#167;10</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>And finally, provision of a property can be tested at runtime with the
following schemas:
</p>
@ -468,7 +425,7 @@ following schemas:
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Kinds::Behaviour::is_object</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">PK</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Cinders::kind_of_term</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">pt1</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">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">PK</span><span class="plain-syntax">) == </span><span class="identifier-syntax">CON_property</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">schema</span><span class="plain-syntax">, </span><span class="string-syntax">"WhetherProvides(%k, *1, *2)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">schema</span><span class="plain-syntax">, </span><span class="string-syntax">"ProvidesProperty(%k, *1, *2)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</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">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
@ -484,7 +441,7 @@ of object the left operand is, we can only test property provision at run-time:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">schema</span><span class="plain-syntax">, </span><span class="string-syntax">"WhetherProvides(%k, *1, *2)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Calculus::Schemas::modify</span><span class="plain-syntax">(</span><span class="identifier-syntax">asch</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">schema</span><span class="plain-syntax">, </span><span class="string-syntax">"ProvidesProperty(%k, *1, *2)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="5-prp.html#SP11">&#167;11</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP11_2" class="paragraph-anchor"></a><b>&#167;11.2. </b>For all other kinds, type-checking is strong enough that we can prove the

View file

@ -1,6 +1,6 @@
Total memory consumption was 394323K = 385 MB
Total memory consumption was 394317K = 385 MB
60.6% was used for 2004452 objects, in 372321 frames in 299 x 800K = 239200K = 233 MB:
60.6% was used for 2004468 objects, in 372337 frames in 299 x 800K = 239200K = 233 MB:
10.3% inter_tree_node_array 58 x 8192 = 475136 objects, 41813824 bytes
7.2% text_stream_array 5187 x 100 = 518700 objects, 29213184 bytes
@ -13,7 +13,7 @@ Total memory consumption was 394323K = 385 MB
0.8% inter_name_array 69 x 1000 = 69000 objects, 3314208 bytes
0.6% kind_array 68 x 1000 = 68000 objects, 2722176 bytes
0.5% inter_name_generator_array 53 x 1000 = 53000 objects, 2121696 bytes
0.5% inter_schema_token 14185 objects, 2042640 bytes
0.5% inter_schema_token 14197 objects, 2044368 bytes
0.4% inter_package 26565 objects, 1912680 bytes
0.4% package_request 21137 objects, 1860056 bytes
0.4% vocabulary_entry_array 161 x 100 = 16100 objects, 1808352 bytes
@ -30,7 +30,7 @@ Total memory consumption was 394323K = 385 MB
0.2% ptoken 8382 objects, 871728 bytes
0.2% grammatical_usage 3611 objects, 866640 bytes
0.2% individual_form 2561 objects, 860496 bytes
0.2% inter_schema_node 8905 objects, 854880 bytes
0.2% inter_schema_node 8909 objects, 855264 bytes
0.1% unary_predicate_array 16 x 1000 = 16000 objects, 640512 bytes
0.1% local_variable_array 47 x 100 = 4700 objects, 452704 bytes
---- scan_directory 94 objects, 388032 bytes
@ -238,7 +238,7 @@ Total memory consumption was 394323K = 385 MB
39.3% was used for memory not allocated for objects:
20.5% text stream storage 82882584 bytes in 536688 claims
20.5% text stream storage 82876796 bytes in 536689 claims
4.5% dictionary storage 18271744 bytes in 33265 claims
---- sorting 736 bytes in 3 claims
1.7% source text 7200000 bytes in 3 claims
@ -246,8 +246,8 @@ Total memory consumption was 394323K = 385 MB
---- documentation fragments 262144 bytes in 1 claim
---- linguistic stock array 81920 bytes in 2 claims
---- small word set array 105600 bytes in 22 claims
1.0% inter symbols storage 4175072 bytes in 27677 claims
4.1% inter bytecode storage 16802732 bytes in 14 claims
1.0% inter symbols storage 4174576 bytes in 27676 claims
4.1% inter bytecode storage 16802744 bytes in 14 claims
4.0% inter links storage 16174208 bytes in 266 claims
---- inter tree location list storage 191232 bytes in 32 claims
0.4% instance-of-kind counting 1695204 bytes in 1 claim
@ -256,5 +256,5 @@ Total memory consumption was 394323K = 385 MB
---- code generation workspace for objects 4128 bytes in 4 claims
---- emitter array storage 161792 bytes in 2062 claims
18.4% was overhead - 74415928 bytes = 72671K = 70 MB
18.4% was overhead - 74413816 bytes = 72669K = 70 MB

View file

@ -1,11 +1,11 @@
100.0% in inform7 run
55.0% in compilation to Inter
39.5% in //Sequence::undertake_queued_tasks//
55.1% in compilation to Inter
39.6% in //Sequence::undertake_queued_tasks//
3.5% in //MajorNodes::pre_pass//
2.6% in //MajorNodes::pass_1//
2.1% in //RTPhrasebook::compile_entries//
1.4% in //ImperativeDefinitions::assess_all//
1.1% in //RTKindConstructors::compile//
2.5% in //MajorNodes::pass_1//
2.0% in //RTPhrasebook::compile_entries//
1.3% in //ImperativeDefinitions::assess_all//
1.2% in //RTKindConstructors::compile//
0.4% in //ImperativeDefinitions::compile_first_block//
0.4% in //MajorNodes::pass_2//
0.4% in //Sequence::undertake_queued_tasks//
@ -16,22 +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.6% not specifically accounted for
43.1% in running Inter pipeline
12.4% in step preparation
1.8% not specifically accounted for
42.9% in running Inter pipeline
12.5% in step preparation
9.6% in inter step 7/16: consolidate-text
7.8% in inter step 2/16: link
6.8% in inter step 16/16: generate inform6 -> auto.inf
8.0% in inter step 2/16: link
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.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 4/16: parse-linked-matter
0.1% in inter step 5/16: resolve-conditional-compilation
2.7% not specifically accounted for
1.7% in supervisor
0.2% not specifically accounted for
2.4% not specifically accounted for
1.6% in supervisor
0.3% not specifically accounted for

View file

@ -260,41 +260,40 @@ have the property in question at an I6 level -- having permission to have
it doesn't mean it actually does have.
=
[ WhetherProvides K obj q issue_rtp a l holder;
if (K ~= OBJECT_TY) {
if ((obj < 1) || (obj > value_ranges-->K)) {
if (issue_rtp) RunTimeProblem(RTP_BADVALUEPROPERTY);
rfalse;
} else {
holder = value_property_holders-->K;
if ((holder) && (holder provides q)) rtrue;
[ ProvidesProperty K obj q issue_rtp a l holder;
if (K == OBJECT_TY) {
if (ScanPropertyMetadata(obj, q, 4)) jump PermissionFound;
if (obj provides KD_Count) {
l = obj.KD_Count;
while (l > 0) {
a = l*2;
if (ScanPropertyMetadata(KindHierarchy-->a, q, 4)) jump PermissionFound;
l = KindHierarchy-->(a+1);
}
}
}
if (obj == 0) {
if (issue_rtp) RunTimeProblem(RTP_PROPOFNOTHING, 0, q);
if (ScanPropertyMetadata(K0_kind, q, 4)) jump PermissionFound;
if (issue_rtp) RunTimeProblem(RTP_UNPROVIDED, obj, q);
rfalse;
}
if (metaclass(obj) ~= Object) rfalse;
if (q<0) q = ~q;
if (ScanPropertyMetadata(obj, q, 4)) jump PermissionFound;
if (obj provides KD_Count) {
l = obj.KD_Count;
while (l > 0) {
a = l*2;
if (ScanPropertyMetadata(KindHierarchy-->a, q, 4)) jump PermissionFound;
l = KindHierarchy-->(a+1);
}
}
if (ScanPropertyMetadata(K0_kind, q, 4)) jump PermissionFound;
if (issue_rtp) RunTimeProblem(RTP_UNPROVIDED, obj, q);
rfalse;
.PermissionFound;
if (q-->2) rtrue;
if (obj provides q) rtrue;
if (issue_rtp) RunTimeProblem(RTP_UNSET, obj, q);
rfalse;
@provides_gprop K obj q a;
if (a) rtrue;
! if (K ~= OBJECT_TY) {
! if ((obj >= 1) && (obj <= value_ranges-->K)) {
! holder = value_property_holders-->K;
! if ((holder) && (holder provides q)) rtrue;
! }
! } else {
! if ((obj) && (metaclass(obj) == Object)) {
! if (q-->0 == 2) rtrue;
! if (obj provides q) rtrue;
! }
! }
if (issue_rtp) RunTimeProblem(RTP_UNSET, obj, q);
rfalse;
];
[ PrintPropertyName p textual;
@ -331,18 +330,20 @@ this enables it to be an I6 routine returning the other side of the door from
the one which the player is on.
=
[ GProperty K V pr err holder;
if (WhetherProvides(K, V, pr, 1-err)) {
if (K == OBJECT_TY) {
if (pr-->0 == 2) {
if (V has pr) rtrue; rfalse;
}
if (pr == door_to) return V.pr();
return V.pr;
} else {
holder = value_property_holders-->K;
return (holder.pr)-->(V+COL_HSIZE);
}
[ GProperty K V pr err holder val;
if (ProvidesProperty(K, V, pr, 1-err)) {
@read_gprop K V pr val;
return val;
! if (K == OBJECT_TY) {
! if (pr-->0 == 2) {
! if (V has pr) rtrue; rfalse;
! }
! if (pr == door_to) return V.pr();
! return V.pr;
! } else {
! holder = value_property_holders-->K;
! return (holder.pr)-->(V+COL_HSIZE);
! }
}
return 0;
];
@ -354,17 +355,18 @@ converted from an rvalue to an lvalue.
=
[ WriteGProperty K V pr val holder;
if (WhetherProvides(K, V, pr, true)) {
if (K == OBJECT_TY) {
if (pr-->0 == 2) {
if (val) give V pr; else give V ~pr;
} else {
V.pr = val;
}
} else {
holder = value_property_holders-->K;
(holder.pr)-->(V+COL_HSIZE) = val;
}
if (ProvidesProperty(K, V, pr, true)) {
@write_gprop K V pr val;
! if (K == OBJECT_TY) {
! if (pr-->0 == 2) {
! if (val) give V pr; else give V ~pr;
! } else {
! V.pr = val;
! }
! } else {
! holder = value_property_holders-->K;
! (holder.pr)-->(V+COL_HSIZE) = val;
! }
}
];

View file

@ -6545,9 +6545,9 @@ package main _plain
symbol public misc #dictionary_table
symbol public misc #grammar_table
symbol public misc __assembly_sp `sp`
symbol public misc KindHierarchy
symbol public misc value_ranges
symbol public misc value_property_holders
symbol public misc KindHierarchy
constant String K_unchecked = 0 __veneer=1
constant Routine K_unchecked = 0 __veneer=1
constant self K_unchecked = 0 __veneer=1
@ -6558,9 +6558,9 @@ package main _plain
constant #dictionary_table K_unchecked = 0 __veneer=1
constant #grammar_table K_unchecked = 0 __veneer=1
constant __assembly_sp K_unchecked = 0 __veneer=1
constant KindHierarchy K_unchecked = 0 __veneer=1
constant value_ranges K_unchecked = 0 __veneer=1
constant value_property_holders K_unchecked = 0 __veneer=1
constant KindHierarchy K_unchecked = 0 __veneer=1
package basic_inform_by_graham_nelson _module
symbol private misc ^category `^category_U1`
symbol external misc K_typeless_int --> /main/generic/kinds/K_typeless_int
@ -39392,11 +39392,9 @@ package main _plain
symbol socket misc RunTimeError --> /main/connectors/RunTimeError
symbol socket misc ArgumentTypeFailed --> /main/connectors/ArgumentTypeFailed
symbol socket misc CheckKindReturned --> /main/connectors/CheckKindReturned
symbol socket misc WhetherProvides --> /main/connectors/WhetherProvides
symbol socket misc ProvidesProperty --> /main/connectors/ProvidesProperty
symbol socket misc PrintPropertyName --> /main/connectors/PrintPropertyName
symbol socket misc ScanPropertyMetadata --> /main/connectors/ScanPropertyMetadata
symbol socket misc GetEitherOrProperty --> /main/connectors/GetEitherOrProperty
symbol socket misc SetEitherOrProperty --> /main/connectors/SetEitherOrProperty
symbol socket misc GProperty --> /main/connectors/GProperty
symbol socket misc WriteGProperty --> /main/connectors/WriteGProperty
symbol socket misc PROPERTY_TY_Say --> /main/connectors/PROPERTY_TY_Say
@ -97061,10 +97059,10 @@ package main _plain
inv !return
val K_unchecked V
constant CheckKindReturned K_unchecked_function = CheckKindReturned_B __assimilated=1
package WhetherProvides_fn _function
symbol public misc WhetherProvides
package ProvidesProperty_fn _function
symbol public misc ProvidesProperty
symbol external misc K_unchecked_function --> /main/generic/kinds/K_unchecked_function
package WhetherProvides_B _code
package ProvidesProperty_B _code
symbol private misc K
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol private misc obj
@ -97074,19 +97072,17 @@ package main _plain
symbol private misc l
symbol private misc holder
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc value_ranges --> /main/veneer/value_ranges
symbol external misc RunTimeProblem --> /main/BasicInformKit/functions/RunTimeProblem_fn/RunTimeProblem
symbol external misc RTP_BADVALUEPROPERTY --> /main/BasicInformKit/constants/RTP_BADVALUEPROPERTY_con/RTP_BADVALUEPROPERTY
symbol external misc value_property_holders --> /main/veneer/value_property_holders
symbol external misc RTP_PROPOFNOTHING --> /main/BasicInformKit/constants/RTP_PROPOFNOTHING_con/RTP_PROPOFNOTHING
symbol external misc metaclass --> /main/veneer/metaclass
symbol external misc Object --> /main/veneer/Object
symbol external misc ScanPropertyMetadata --> /main/BasicInformKit/functions/ScanPropertyMetadata_fn/ScanPropertyMetadata
symbol private label .PermissionFound
symbol external misc KD_Count --> /main/BasicInformKit/properties/KD_Count_prop/KD_Count
symbol external misc KindHierarchy --> /main/veneer/KindHierarchy
symbol external misc plug_00165 --> /main/generic/kinds/kind1/K_object
symbol external misc RunTimeProblem --> /main/BasicInformKit/functions/RunTimeProblem_fn/RunTimeProblem
symbol external misc RTP_UNPROVIDED --> /main/BasicInformKit/constants/RTP_UNPROVIDED_con/RTP_UNPROVIDED
symbol external misc value_ranges --> /main/veneer/value_ranges
symbol external misc value_property_holders --> /main/veneer/value_property_holders
symbol external misc metaclass --> /main/veneer/metaclass
symbol external misc Object --> /main/veneer/Object
symbol external misc RTP_UNSET --> /main/BasicInformKit/constants/RTP_UNSET_con/RTP_UNSET
local K K_unchecked
local obj K_unchecked
@ -97097,26 +97093,91 @@ package main _plain
local holder K_unchecked
code
inv !if
inv !eq
val K_unchecked K
val K_unchecked OBJECT_TY
code
inv !if
inv ScanPropertyMetadata
val K_unchecked obj
val K_unchecked q
val K_unchecked 4
code
inv !jump
lab .PermissionFound
inv !if
inv !provides
val K_unchecked obj
val K_unchecked KD_Count
code
inv !store
reference
val K_unchecked l
inv !propertyvalue
val K_unchecked obj
val K_unchecked KD_Count
inv !while
inv !gt
val K_unchecked l
val K_unchecked 0
code
inv !store
reference
val K_unchecked a
inv !times
val K_unchecked l
val K_unchecked 2
inv !if
inv ScanPropertyMetadata
inv !lookup
val K_unchecked KindHierarchy
val K_unchecked a
val K_unchecked q
val K_unchecked 4
code
inv !jump
lab .PermissionFound
inv !store
reference
val K_unchecked l
inv !lookup
val K_unchecked KindHierarchy
inv !plus
val K_unchecked a
val K_unchecked 1
inv !if
inv ScanPropertyMetadata
val K_unchecked K_object
val K_unchecked q
val K_unchecked 4
code
inv !jump
lab .PermissionFound
inv !if
val K_unchecked issue_rtp
code
inv RunTimeProblem
val K_unchecked RTP_UNPROVIDED
val K_unchecked obj
val K_unchecked q
inv !return
val K_unchecked 0
.PermissionFound
inv !ifelse
inv !ne
val K_unchecked K
val K_unchecked OBJECT_TY
code
inv !ifelse
inv !or
inv !lt
inv !if
inv !and
inv !ge
val K_unchecked obj
val K_unchecked 1
inv !gt
inv !le
val K_unchecked obj
inv !lookup
val K_unchecked value_ranges
val K_unchecked K
code
inv !if
val K_unchecked issue_rtp
code
inv RunTimeProblem
val K_unchecked RTP_BADVALUEPROPERTY
code
inv !store
reference
@ -97133,120 +97194,31 @@ package main _plain
code
inv !return
val K_unchecked 1
inv !return
val K_unchecked 0
inv !if
inv !eq
val K_unchecked obj
val K_unchecked 0
code
inv !if
val K_unchecked issue_rtp
code
inv RunTimeProblem
val K_unchecked RTP_PROPOFNOTHING
val K_unchecked 0
val K_unchecked q
inv !return
val K_unchecked 0
inv !if
inv !ne
inv metaclass
val K_unchecked obj
val K_unchecked Object
code
inv !return
val K_unchecked 0
inv !if
inv !lt
val K_unchecked q
val K_unchecked 0
code
inv !store
reference
val K_unchecked q
inv !bitwisenot
val K_unchecked q
inv !if
inv ScanPropertyMetadata
val K_unchecked obj
val K_unchecked q
val K_unchecked 4
code
inv !jump
lab .PermissionFound
inv !if
inv !provides
val K_unchecked obj
val K_unchecked KD_Count
code
inv !store
reference
val K_unchecked l
inv !propertyvalue
inv !and
val K_unchecked obj
val K_unchecked KD_Count
inv !while
inv !gt
val K_unchecked l
val K_unchecked 0
inv !eq
inv metaclass
val K_unchecked obj
val K_unchecked Object
code
inv !store
reference
val K_unchecked a
inv !times
val K_unchecked l
val K_unchecked 2
inv !if
inv ScanPropertyMetadata
inv !eq
inv !lookup
val K_unchecked KindHierarchy
val K_unchecked a
val K_unchecked q
val K_unchecked 4
val K_unchecked q
val K_unchecked 0
val K_unchecked 2
code
inv !jump
lab .PermissionFound
inv !store
reference
val K_unchecked l
inv !lookup
val K_unchecked KindHierarchy
inv !plus
val K_unchecked a
inv !return
val K_unchecked 1
inv !if
inv !provides
val K_unchecked obj
val K_unchecked q
code
inv !return
val K_unchecked 1
inv !if
inv ScanPropertyMetadata
val K_unchecked K_object
val K_unchecked q
val K_unchecked 4
code
inv !jump
lab .PermissionFound
inv !if
val K_unchecked issue_rtp
code
inv RunTimeProblem
val K_unchecked RTP_UNPROVIDED
val K_unchecked obj
val K_unchecked q
inv !return
val K_unchecked 0
.PermissionFound
inv !if
inv !lookup
val K_unchecked q
val K_unchecked 2
code
inv !return
val K_unchecked 1
inv !if
inv !provides
val K_unchecked obj
val K_unchecked q
code
inv !return
val K_unchecked 1
inv !if
val K_unchecked issue_rtp
code
@ -97256,7 +97228,7 @@ package main _plain
val K_unchecked q
inv !return
val K_unchecked 0
constant WhetherProvides K_unchecked_function = WhetherProvides_B __assimilated=1
constant ProvidesProperty K_unchecked_function = ProvidesProperty_B __assimilated=1
package PrintPropertyName_fn _function
symbol public misc PrintPropertyName
symbol external misc K_unchecked_function --> /main/generic/kinds/K_unchecked_function
@ -97326,56 +97298,6 @@ package main _plain
inv !return
val K_unchecked 0
constant ScanPropertyMetadata K_unchecked_function = ScanPropertyMetadata_B __assimilated=1
package GetEitherOrProperty_fn _function
symbol public misc GetEitherOrProperty
symbol external misc K_unchecked_function --> /main/generic/kinds/K_unchecked_function
package GetEitherOrProperty_B _code
symbol private misc o
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol private misc p
symbol external misc GProperty --> /main/BasicInformKit/functions/GProperty_fn/GProperty
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
local o K_unchecked
local p K_unchecked
code
inv !return
inv GProperty
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 1
constant GetEitherOrProperty K_unchecked_function = GetEitherOrProperty_B __assimilated=1
package SetEitherOrProperty_fn _function
symbol public misc SetEitherOrProperty
symbol external misc K_unchecked_function --> /main/generic/kinds/K_unchecked_function
package SetEitherOrProperty_B _code
symbol private misc o
symbol external misc K_unchecked --> /main/generic/kinds/K_unchecked
symbol private misc p
symbol private misc negate
symbol private misc adj
symbol external misc WriteGProperty --> /main/BasicInformKit/functions/WriteGProperty_fn/WriteGProperty
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
local o K_unchecked
local p K_unchecked
local negate K_unchecked
local adj K_unchecked
code
inv !ifelse
val K_unchecked negate
code
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 0
code
inv WriteGProperty
val K_unchecked OBJECT_TY
val K_unchecked o
val K_unchecked p
val K_unchecked 1
constant SetEitherOrProperty K_unchecked_function = SetEitherOrProperty_B __assimilated=1
package GProperty_fn _function
symbol public misc GProperty
symbol external misc K_unchecked_function --> /main/generic/kinds/K_unchecked_function
@ -97386,7 +97308,7 @@ package main _plain
symbol private misc pr
symbol private misc err
symbol private misc holder
symbol external misc WhetherProvides --> /main/BasicInformKit/functions/WhetherProvides_fn/WhetherProvides
symbol external misc ProvidesProperty --> /main/BasicInformKit/functions/ProvidesProperty_fn/ProvidesProperty
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc door_to --> /main/BasicInformKit/properties/door_to_prop/door_to
symbol external misc value_property_holders --> /main/veneer/value_property_holders
@ -97398,7 +97320,7 @@ package main _plain
local holder K_unchecked
code
inv !if
inv WhetherProvides
inv ProvidesProperty
val K_unchecked K
val K_unchecked V
val K_unchecked pr
@ -97468,7 +97390,7 @@ package main _plain
symbol private misc pr
symbol private misc val
symbol private misc holder
symbol external misc WhetherProvides --> /main/BasicInformKit/functions/WhetherProvides_fn/WhetherProvides
symbol external misc ProvidesProperty --> /main/BasicInformKit/functions/ProvidesProperty_fn/ProvidesProperty
symbol external misc plug_00140 --> /main/generic/kinds/kind1/OBJECT_TY
symbol external misc value_property_holders --> /main/veneer/value_property_holders
symbol external misc COL_HSIZE --> /main/BasicInformKit/constants/COL_HSIZE_con/COL_HSIZE
@ -97479,7 +97401,7 @@ package main _plain
local holder K_unchecked
code
inv !if
inv WhetherProvides
inv ProvidesProperty
val K_unchecked K
val K_unchecked V
val K_unchecked pr

View file

@ -268,79 +268,45 @@ int RTProperties::set_property_value_schema(annotated_i6_schema *asch, property
return TRUE;
}
@ Either-or properties are trickier, though only because they use a different
pair of functions at runtime for EO properties of objects than for EO properties
of anything else:
@ Either-or properties work analogously, though note that on reading, |GProperty|
is called slightly differently so that objects are allowed access to read (though
not write) either/or properties which they do not possess. The result is always
|false|, but run-time errors do not occur. (This all goes back to the way
attributes were handled on the Z-machine VM, but is an assumption made by some
of the kit code inherited from early days of Inform, and does no actual harm.)
=
void RTProperties::write_either_or_schemas(adjective_meaning *am, property *prn, int T) {
kind *K = AdjectiveMeaningDomains::get_kind(am);
if (Kinds::Behaviour::is_object(K))
@<Set the schemata for an either/or property adjective with objects as domain@>
else
@<Set the schemata for an either/or property adjective with some other domain@>;
if (RTProperties::stored_in_negation(prn)) {
property *neg = EitherOrProperties::get_negation(prn);
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GProperty(%k, *1, %n, 1) == false", K,
RTProperties::iname(neg));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n, 0)", K,
RTProperties::iname(neg));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n, 1)", K,
RTProperties::iname(neg));
} else {
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GProperty(%k, *1, %n, 1)", K,
RTProperties::iname(prn));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n, 1)", K,
RTProperties::iname(prn));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n, 0)", K,
RTProperties::iname(prn));
}
}
@ The "objects" domain is not really very different, but it's the one used
overwhelmingly most often, so we will call the relevant routines directly rather
than accessing them via the unifying routines |GProperty| and |WriteGProperty| --
which would work just as well, but more slowly.
@<Set the schemata for an either/or property adjective with objects as domain@> =
if (RTProperties::stored_in_negation(prn)) {
property *neg = EitherOrProperties::get_negation(prn);
inter_name *identifier = RTProperties::iname(neg);
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GProperty(OBJECT_TY, *1, %n, true) == false", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 0)", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 1)", identifier);
} else {
inter_name *identifier = RTProperties::iname(prn);
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GProperty(OBJECT_TY, *1, %n, true)", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 1)", identifier);
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(OBJECT_TY, *1, %n, 0)", identifier);
}
@<Set the schemata for an either/or property adjective with some other domain@> =
if (RTProperties::stored_in_negation(prn)) {
property *neg = EitherOrProperties::get_negation(prn);
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GProperty(%k, *1, %n) == false", K,
RTProperties::iname(neg));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n)", K,
RTProperties::iname(neg));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n, true)", K,
RTProperties::iname(neg));
} else {
i6_schema *sch = AdjectiveMeanings::make_schema(am, TEST_ATOM_TASK);
Calculus::Schemas::modify(sch, "GProperty(%k, *1, %n)", K,
RTProperties::iname(prn));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_TRUE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n, true)", K,
RTProperties::iname(prn));
sch = AdjectiveMeanings::make_schema(am, NOW_ATOM_FALSE_TASK);
Calculus::Schemas::modify(sch, "WriteGProperty(%k, *1, %n)", K,
RTProperties::iname(prn));
}
@ And finally, provision of a property can be tested at runtime with the
following schemas:
@ -358,7 +324,7 @@ int RTProperties::test_provision_schema(annotated_i6_schema *asch) {
} else if (Kinds::Behaviour::is_object(K)) {
kind *PK = Cinders::kind_of_term(asch->pt1);
if (Kinds::get_construct(PK) == CON_property) {
Calculus::Schemas::modify(asch->schema, "WhetherProvides(%k, *1, *2)", K);
Calculus::Schemas::modify(asch->schema, "ProvidesProperty(%k, *1, *2)", K);
return TRUE;
}
}
@ -370,7 +336,7 @@ int RTProperties::test_provision_schema(annotated_i6_schema *asch) {
of object the left operand is, we can only test property provision at run-time:
@<Compile a run-time test of property provision@> =
Calculus::Schemas::modify(asch->schema, "WhetherProvides(%k, *1, *2)", K);
Calculus::Schemas::modify(asch->schema, "ProvidesProperty(%k, *1, *2)", K);
@ For all other kinds, type-checking is strong enough that we can prove the
answer now.

View file

@ -1219,6 +1219,9 @@ void I6Target::invoke_opcode(code_generator *cgt, code_generation *gen,
text_stream *opcode, int operand_count, inter_tree_node **operands,
inter_tree_node *label, int label_sense, int void_context) {
text_stream *OUT = CodeGen::current(gen);
if (Str::eq(opcode, I"@provides_gprop")) @<Invoke special provides_gprop@>;
if (Str::eq(opcode, I"@read_gprop")) @<Invoke special read_gprop@>;
if (Str::eq(opcode, I"@write_gprop")) @<Invoke special write_gprop@>;
WRITE("%S", opcode);
for (int opc = 0; opc < operand_count; opc++) {
WRITE(" ");
@ -1232,6 +1235,118 @@ void I6Target::invoke_opcode(code_generator *cgt, code_generation *gen,
if (void_context) WRITE(";\n");
}
@<Invoke special provides_gprop@> =
TEMPORARY_TEXT(K)
TEMPORARY_TEXT(obj)
TEMPORARY_TEXT(p)
TEMPORARY_TEXT(val)
CodeGen::select_temporary(gen, K);
Vanilla::node(gen, operands[0]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, obj);
Vanilla::node(gen, operands[1]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, p);
Vanilla::node(gen, operands[2]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, val);
Vanilla::node(gen, operands[3]);
CodeGen::deselect_temporary(gen);
WRITE("if (%S == OBJECT_TY) {\n", K);
WRITE(" if ((%S) && (metaclass(%S) == Object)) {\n", obj, obj);
WRITE(" if ((%S-->0 == 2) || (%S provides %S-->1)) {\n", p, obj, p);
WRITE(" %S = 1;\n", val);
WRITE(" } else {\n");
WRITE(" %S = 0;\n", val);
WRITE(" }\n");
WRITE(" } else {\n");
WRITE(" %S = 0;\n", val);
WRITE(" }\n");
WRITE("} else {\n");
WRITE(" if ((%S >= 1) && (%S <= value_ranges-->%S)) {\n", obj, obj, K);
WRITE(" holder = value_property_holders-->%S;\n", K);
WRITE(" if ((holder) && (holder provides %S-->1)) {\n", p);
WRITE(" %S = 1;\n", val);
WRITE(" } else {\n");
WRITE(" %S = 0;\n", val);
WRITE(" }\n");
WRITE(" } else {\n");
WRITE(" %S = 0;\n", val);
WRITE(" }\n");
WRITE("}\n");
DISCARD_TEXT(K)
DISCARD_TEXT(obj)
DISCARD_TEXT(p)
DISCARD_TEXT(val)
return;
@<Invoke special read_gprop@> =
TEMPORARY_TEXT(K)
TEMPORARY_TEXT(obj)
TEMPORARY_TEXT(p)
CodeGen::select_temporary(gen, K);
Vanilla::node(gen, operands[0]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, obj);
Vanilla::node(gen, operands[1]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, p);
Vanilla::node(gen, operands[2]);
CodeGen::deselect_temporary(gen);
WRITE("if (%S == OBJECT_TY) {\n", K);
WRITE(" if (%S-->0 == 2) {\n", p);
WRITE(" if (%S has %S-->1) rtrue; rfalse;\n", obj, p);
WRITE(" }\n");
WRITE(" if (%S == door_to) return (%S-->1).%S();\n", p, obj, p);
WRITE(" return %S.(%S-->1);\n", obj, p);
WRITE("} else {\n");
WRITE(" holder = value_property_holders-->%S;\n", K);
WRITE(" return (holder.(%S-->1))-->(%S+COL_HSIZE);\n", p, obj);
WRITE("}\n");
DISCARD_TEXT(K)
DISCARD_TEXT(obj)
DISCARD_TEXT(p)
return;
@<Invoke special write_gprop@> =
TEMPORARY_TEXT(K)
TEMPORARY_TEXT(obj)
TEMPORARY_TEXT(p)
TEMPORARY_TEXT(val)
CodeGen::select_temporary(gen, K);
Vanilla::node(gen, operands[0]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, obj);
Vanilla::node(gen, operands[1]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, p);
Vanilla::node(gen, operands[2]);
CodeGen::deselect_temporary(gen);
CodeGen::select_temporary(gen, val);
Vanilla::node(gen, operands[3]);
CodeGen::deselect_temporary(gen);
WRITE("if (%S == OBJECT_TY) {\n", K);
WRITE(" if (%S-->0 == 2) {\n", p);
WRITE(" if (%S) give %S %S-->1; else give %S ~(%S-->1);\n", val, obj, p, obj, p);
WRITE(" } else {\n");
WRITE(" %S.(%S-->1) = %S;\n", obj, p, val);
WRITE(" }\n");
WRITE("} else {\n");
WRITE(" ((value_property_holders-->%S).(%S-->1))-->(%S+COL_HSIZE) = %S;\n", K, p, obj, val);
WRITE("}\n");
DISCARD_TEXT(K)
DISCARD_TEXT(obj)
DISCARD_TEXT(p)
DISCARD_TEXT(val)
return;
@ =
int I6Target::begin_array(code_generator *cgt, code_generation *gen, text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format, segmentation_pos *saved) {
if (saved) {
int choice = early_matter_I7CGS;