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

Handled I6 message calls in Inter schema

This commit is contained in:
Graham Nelson 2019-05-02 08:41:06 +01:00
parent 54d6366fb5
commit e69fc2b4e4
17 changed files with 655 additions and 76 deletions

View file

@ -739,7 +739,7 @@
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rb_splat_count</span><span class="plain"> = 1;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::routine_body</span><span class="plain">(</span><span class="identifier">inter_reading_state</span><span class="plain"> *</span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">block_name</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">offset</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">body</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::is_whitespace</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">) &lt; 100) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">) &lt; 120) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"=======\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">Candidate (%S) len %d: '%S'\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">block_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">), </span><span class="identifier">body</span><span class="plain">);</span>
<span class="reserved">inter_schema</span><span class="plain"> *</span><span class="identifier">sch</span><span class="plain"> = </span><span class="functiontext">InterSchemas::from_text</span><span class="plain">(</span><span class="identifier">body</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, 0, </span><span class="identifier">NULL</span><span class="plain">);</span>

View file

@ -99,6 +99,14 @@
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">indirect3_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">indirect4_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">indirect5_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">message0_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">message1_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">message2_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">message3_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">callmessage0_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">callmessage1_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">callmessage2_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">callmessage3_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">propertyaddress_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">propertylength_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">provides_interp</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -199,6 +207,14 @@
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!indirect3"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">indirect3_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!indirect4"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">indirect4_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!indirect5"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">indirect5_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message0"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">message0_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message1"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">message1_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message2"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">message2_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message3"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">message3_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage0"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">callmessage0_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage1"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">callmessage1_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage2"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">callmessage2_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage3"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">callmessage3_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!propertyaddress"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">propertyaddress_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!propertylength"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">propertylength_interp</span><span class="plain">);</span>
<span class="functiontext">Primitives::emit_one</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">IRS</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!provides"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"val val -&gt; val"</span><span class="plain">, &amp;</span><span class="identifier">provides_interp</span><span class="plain">);</span>
@ -370,6 +386,14 @@
<span class="definitionkeyword">enum</span> <span class="constant">INDIRECT3_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">INDIRECT4_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">INDIRECT5_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">MESSAGE0_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">MESSAGE1_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">MESSAGE2_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">MESSAGE3_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">CALLMESSAGE0_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">CALLMESSAGE1_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">CALLMESSAGE2_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">CALLMESSAGE3_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">PROPERTYADDRESS_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">PROPERTYLENGTH_BIP</span>
<span class="definitionkeyword">enum</span> <span class="constant">PROVIDES_BIP</span>
@ -470,6 +494,14 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!indirect3"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">INDIRECT3_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!indirect4"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">INDIRECT4_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!indirect5"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">INDIRECT5_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message0"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">MESSAGE0_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message1"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">MESSAGE1_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message2"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">MESSAGE2_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!message3"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">MESSAGE3_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage0"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">CALLMESSAGE0_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage1"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">CALLMESSAGE1_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage2"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">CALLMESSAGE2_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!callmessage3"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">CALLMESSAGE3_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!propertyaddress"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!propertylength"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"!provides"</span><span class="plain">)) </span><span class="identifier">bip</span><span class="plain"> = </span><span class="constant">PROVIDES_BIP</span><span class="plain">;</span>

View file

@ -109,6 +109,8 @@ but the need to do this went away.)
<span class="definitionkeyword">enum</span> <span class="constant">ASSEMBLY_ISNT</span>
<span class="definitionkeyword">enum</span> <span class="constant">LABEL_ISNT</span>
<span class="definitionkeyword">enum</span> <span class="constant">CALL_ISNT</span>
<span class="definitionkeyword">enum</span> <span class="constant">MESSAGE_ISNT</span>
<span class="definitionkeyword">enum</span> <span class="constant">CALLMESSAGE_ISNT</span>
</pre>
<pre class="display">
@ -605,6 +607,12 @@ we go to some trouble here.
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALL_ISNT</span><span class="plain">:</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (call)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MESSAGE_ISNT</span><span class="plain">:</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (message)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALLMESSAGE_ISNT</span><span class="plain">:</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (call-message)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SUBEXPRESSION_ISNT</span><span class="plain">:</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"* (subexpression)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -1037,6 +1045,7 @@ out for the two extra syntaxes allowed, <code class="display"><span class="extra
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">" "</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0, -1));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">DQUOTED_TOKSTATE</span><span class="plain">:</span>
<span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">current_raw</span><span class="plain">);</span>
<span class="functiontext">InterSchemas::add_token</span><span class="plain">(</span><span class="identifier">sch</span><span class="plain">, </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">DQUOTED_ISTT</span><span class="plain">, </span><span class="identifier">current_raw</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0, -1));</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SQUOTED_TOKSTATE</span><span class="plain">:</span>
@ -1871,6 +1880,7 @@ these out at the start of each iteration.
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::strip_all_spacing</span><span class="plain">);</span>
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::debracket</span><span class="plain">);</span>
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::implied_return_values</span><span class="plain">);</span>
<span class="identifier">REPEATEDLY_APPLY</span><span class="plain">(</span><span class="functiontext">InterSchemas::message_calls</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
@ -2352,10 +2362,10 @@ these out at the start of each iteration.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::alternatecases</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">=</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">case_interp</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">case_interp</span><span class="plain">) &amp;&amp; (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">)) {</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">;</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) &amp;&amp; (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain">) &amp;&amp; (</span><span class="identifier">B</span><span class="plain">) &amp;&amp; (</span><span class="identifier">B</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">)) {</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;parent_schema</span><span class="plain">, </span><span class="constant">OPERATION_ISNT</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> = </span><span class="identifier">alternativecase_interp</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain"> = </span><span class="identifier">A</span><span class="plain">;</span>
@ -2453,12 +2463,7 @@ these out at the start of each iteration.
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) &amp;&amp; (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;ist_type</span><span class="plain"> == </span><span class="constant">WHITE_SPACE_ISTT</span><span class="plain">)) </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;next</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) &amp;&amp; (</span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;ist_type</span><span class="plain"> == </span><span class="constant">DQUOTED_ISTT</span><span class="plain">)) {</span>
<span class="identifier">subordinate_to</span><span class="plain"> = </span><span class="identifier">print_interp</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'^'</span><span class="plain">)</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'~'</span><span class="plain">)</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;expression_tokens</span><span class="plain">-</span><span class="element">&gt;reserved_word</span><span class="plain"> == </span><span class="constant">PRINTRET_I6RW</span><span class="plain">) {</span>
@ -2650,6 +2655,7 @@ these out at the start of each iteration.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dangle_text</span><span class="plain">) {</span>
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">&gt;expression_tokens</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_token</span><span class="plain">(</span><span class="constant">DQUOTED_ISTT</span><span class="plain">, </span><span class="identifier">dangle_text</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0, -1);</span>
<span class="identifier">new_isn</span><span class="plain">-</span><span class="element">&gt;expression_tokens</span><span class="plain">-</span><span class="element">&gt;owner</span><span class="plain"> = </span><span class="identifier">new_isn</span><span class="plain">;</span>
<span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">new_isn</span><span class="plain">-</span><span class="element">&gt;expression_tokens</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">operand2</span><span class="plain">) {</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">new_new_isn</span><span class="plain"> = </span><span class="functiontext">InterSchemas::new_node</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;parent_schema</span><span class="plain">, </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">);</span>
@ -3157,7 +3163,57 @@ these out at the start of each iteration.
<p class="endnote">The function InterSchemas::implied_return_values is used in <a href="#SP20_4">&#167;20.4</a>.</p>
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. Operators in I6. </b>The following routines return data which is essentially the content of the
<p class="inwebparagraph"><a id="SP30"></a><b>&#167;30. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSchemas::message_calls</span><span class="plain">(</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">par</span><span class="plain">, </span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">isn</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">prev</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">OPERATION_ISNT</span><span class="plain">) &amp;&amp; (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> == </span><span class="identifier">propertyvalue_interp</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">) &amp;&amp; (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">) &amp;&amp; (</span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">CALL_ISNT</span><span class="plain">)) {</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">obj</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">;</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">;</span>
<span class="reserved">inter_schema_node</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">;</span>
<span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> = </span><span class="constant">MESSAGE_ISNT</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_clarifier</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">obj</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain"> = </span><span class="identifier">message</span><span class="plain">; </span><span class="identifier">message</span><span class="plain">-</span><span class="element">&gt;parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">message</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain"> = </span><span class="identifier">args</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">message</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> == </span><span class="constant">EXPRESSION_ISNT</span><span class="plain">) {</span>
<span class="reserved">inter_schema_token</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">message</span><span class="plain">-</span><span class="element">&gt;expression_tokens</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">n</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"call"</span><span class="plain">))) {</span>
<span class="identifier">obj</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain"> = </span><span class="identifier">args</span><span class="plain">; </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;isn_type</span><span class="plain"> = </span><span class="constant">CALLMESSAGE_ISNT</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">args</span><span class="plain">) { </span><span class="identifier">args</span><span class="plain">-</span><span class="element">&gt;parent_node</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">; </span><span class="identifier">args</span><span class="plain"> = </span><span class="identifier">args</span><span class="plain">-</span><span class="element">&gt;next_node</span><span class="plain">; }</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">InterSchemas::message_calls</span><span class="plain">(</span><span class="identifier">isn</span><span class="plain">, </span><span class="identifier">isn</span><span class="plain">-</span><span class="element">&gt;child_node</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSchemas::message_calls is used in <a href="#SP20_4">&#167;20.4</a>.</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSchemas::de_escape_text</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">m</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">m</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'^'</span><span class="plain">)</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">n</span><span class="character">'</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="character">'~'</span><span class="plain">)</span>
<span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="character">'\</span><span class="plain">"</span><span class="character">'</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSchemas::de_escape_text is used in <a href="#SP20_2_2">&#167;20.2.2</a>, <a href="#SP26">&#167;26</a>.</p>
<p class="inwebparagraph"><a id="SP32"></a><b>&#167;32. Operators in I6. </b>The following routines return data which is essentially the content of the
table shown in section 6.2 of the Inform 6 Technical Manual: which operators
take precedence over which others, which are right or left associative,
which are prefix or postfix, and so on.
@ -3365,7 +3421,7 @@ which are prefix or postfix, and so on.
<p class="endnote">The function InterSchemas::right_associative is used in <a href="#SP28">&#167;28</a>.</p>
<p class="inwebparagraph"><a id="SP31"></a><b>&#167;31. Metadata on inter primitives. </b></p>
<p class="inwebparagraph"><a id="SP33"></a><b>&#167;33. Metadata on inter primitives. </b></p>
<pre class="display">

View file

@ -290,7 +290,7 @@
<p class="endnote">The function CodeGen::repo_list is used in <a href="#SP1">&#167;1</a>, 2/erm (<a href="2-erm.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::frame is used in <a href="#SP1">&#167;1</a>, <a href="#SP3">&#167;3</a>, <a href="#SP4">&#167;4</a>, <a href="#SP4_1">&#167;4.1</a>, <a href="#SP4_2">&#167;4.2</a>, <a href="#SP4_6">&#167;4.6</a>, <a href="#SP4_7">&#167;4.7</a>, <a href="#SP4_8">&#167;4.8</a>, <a href="#SP4_9">&#167;4.9</a>, <a href="#SP4_10">&#167;4.10</a>, <a href="#SP4_11">&#167;4.11</a>, <a href="#SP4_12">&#167;4.12</a>, <a href="#SP4_13">&#167;4.13</a>, <a href="#SP4_14">&#167;4.14</a>, <a href="#SP4_15">&#167;4.15</a>, <a href="#SP4_16">&#167;4.16</a>, <a href="#SP4_17">&#167;4.17</a>, <a href="#SP4_18">&#167;4.18</a>, <a href="#SP4_19">&#167;4.19</a>, <a href="#SP4_20">&#167;4.20</a>, <a href="#SP4_21">&#167;4.21</a>, <a href="#SP4_22">&#167;4.22</a>, <a href="#SP4_23">&#167;4.23</a>, <a href="#SP4_24">&#167;4.24</a>, <a href="#SP4_25">&#167;4.25</a>, <a href="#SP4_26">&#167;4.26</a>, <a href="#SP4_27">&#167;4.27</a>, <a href="#SP4_28">&#167;4.28</a>, <a href="#SP4_29">&#167;4.29</a>, <a href="#SP4_30">&#167;4.30</a>, <a href="#SP4_31">&#167;4.31</a>, <a href="#SP4_32">&#167;4.32</a>, <a href="#SP4_33">&#167;4.33</a>, <a href="#SP4_34">&#167;4.34</a>, <a href="#SP4_35">&#167;4.35</a>, <a href="#SP4_36">&#167;4.36</a>, <a href="#SP4_37">&#167;4.37</a>, <a href="#SP4_41">&#167;4.41</a>, <a href="#SP4_42">&#167;4.42</a>, <a href="#SP4_43">&#167;4.43</a>, <a href="#SP4_44">&#167;4.44</a>, <a href="#SP4_45">&#167;4.45</a>, <a href="#SP4_46">&#167;4.46</a>, <a href="#SP4_47">&#167;4.47</a>, <a href="#SP4_48">&#167;4.48</a>, <a href="#SP4_49">&#167;4.49</a>, <a href="#SP4_50">&#167;4.50</a>, <a href="#SP4_51">&#167;4.51</a>, <a href="#SP4_52">&#167;4.52</a>, <a href="#SP4_53">&#167;4.53</a>, <a href="#SP4_54">&#167;4.54</a>, <a href="#SP4_55">&#167;4.55</a>, <a href="#SP4_56">&#167;4.56</a>, <a href="#SP4_57">&#167;4.57</a>, <a href="#SP4_58">&#167;4.58</a>, <a href="#SP4_59">&#167;4.59</a>, <a href="#SP4_60">&#167;4.60</a>, <a href="#SP4_61">&#167;4.61</a>, <a href="#SP4_62">&#167;4.62</a>, <a href="#SP4_63">&#167;4.63</a>, <a href="#SP4_64">&#167;4.64</a>, <a href="#SP4_65">&#167;4.65</a>, <a href="#SP4_66">&#167;4.66</a>, <a href="#SP4_67">&#167;4.67</a>, <a href="#SP4_68">&#167;4.68</a>, <a href="#SP4_69">&#167;4.69</a>, <a href="#SP4_70">&#167;4.70</a>, <a href="#SP4_71">&#167;4.71</a>, <a href="#SP4_72">&#167;4.72</a>, <a href="#SP4_73">&#167;4.73</a>, <a href="#SP4_74">&#167;4.74</a>, <a href="#SP4_75">&#167;4.75</a>, <a href="#SP4_76">&#167;4.76</a>, <a href="#SP4_77">&#167;4.77</a>, <a href="#SP4_78">&#167;4.78</a>, <a href="#SP4_79">&#167;4.79</a>, <a href="#SP4_80">&#167;4.80</a>, <a href="#SP4_81">&#167;4.81</a>, <a href="#SP4_82">&#167;4.82</a>, <a href="#SP4_83">&#167;4.83</a>, <a href="#SP4_84">&#167;4.84</a>, <a href="#SP4_85">&#167;4.85</a>, <a href="#SP4_86">&#167;4.86</a>, <a href="#SP4_87">&#167;4.87</a>, <a href="#SP4_88">&#167;4.88</a>, <a href="#SP4_89">&#167;4.89</a>, <a href="#SP4_90">&#167;4.90</a>, <a href="#SP4_91">&#167;4.91</a>, <a href="#SP4_92">&#167;4.92</a>.</p>
<p class="endnote">The function CodeGen::frame is used in <a href="#SP1">&#167;1</a>, <a href="#SP3">&#167;3</a>, <a href="#SP4">&#167;4</a>, <a href="#SP4_1">&#167;4.1</a>, <a href="#SP4_2">&#167;4.2</a>, <a href="#SP4_6">&#167;4.6</a>, <a href="#SP4_7">&#167;4.7</a>, <a href="#SP4_8">&#167;4.8</a>, <a href="#SP4_9">&#167;4.9</a>, <a href="#SP4_10">&#167;4.10</a>, <a href="#SP4_11">&#167;4.11</a>, <a href="#SP4_12">&#167;4.12</a>, <a href="#SP4_13">&#167;4.13</a>, <a href="#SP4_14">&#167;4.14</a>, <a href="#SP4_15">&#167;4.15</a>, <a href="#SP4_16">&#167;4.16</a>, <a href="#SP4_17">&#167;4.17</a>, <a href="#SP4_18">&#167;4.18</a>, <a href="#SP4_19">&#167;4.19</a>, <a href="#SP4_20">&#167;4.20</a>, <a href="#SP4_21">&#167;4.21</a>, <a href="#SP4_22">&#167;4.22</a>, <a href="#SP4_23">&#167;4.23</a>, <a href="#SP4_24">&#167;4.24</a>, <a href="#SP4_25">&#167;4.25</a>, <a href="#SP4_26">&#167;4.26</a>, <a href="#SP4_27">&#167;4.27</a>, <a href="#SP4_28">&#167;4.28</a>, <a href="#SP4_29">&#167;4.29</a>, <a href="#SP4_30">&#167;4.30</a>, <a href="#SP4_31">&#167;4.31</a>, <a href="#SP4_32">&#167;4.32</a>, <a href="#SP4_33">&#167;4.33</a>, <a href="#SP4_34">&#167;4.34</a>, <a href="#SP4_35">&#167;4.35</a>, <a href="#SP4_36">&#167;4.36</a>, <a href="#SP4_37">&#167;4.37</a>, <a href="#SP4_41">&#167;4.41</a>, <a href="#SP4_42">&#167;4.42</a>, <a href="#SP4_43">&#167;4.43</a>, <a href="#SP4_44">&#167;4.44</a>, <a href="#SP4_45">&#167;4.45</a>, <a href="#SP4_46">&#167;4.46</a>, <a href="#SP4_47">&#167;4.47</a>, <a href="#SP4_48">&#167;4.48</a>, <a href="#SP4_49">&#167;4.49</a>, <a href="#SP4_50">&#167;4.50</a>, <a href="#SP4_51">&#167;4.51</a>, <a href="#SP4_52">&#167;4.52</a>, <a href="#SP4_53">&#167;4.53</a>, <a href="#SP4_54">&#167;4.54</a>, <a href="#SP4_55">&#167;4.55</a>, <a href="#SP4_56">&#167;4.56</a>, <a href="#SP4_57">&#167;4.57</a>, <a href="#SP4_58">&#167;4.58</a>, <a href="#SP4_59">&#167;4.59</a>, <a href="#SP4_60">&#167;4.60</a>, <a href="#SP4_61">&#167;4.61</a>, <a href="#SP4_62">&#167;4.62</a>, <a href="#SP4_63">&#167;4.63</a>, <a href="#SP4_64">&#167;4.64</a>, <a href="#SP4_65">&#167;4.65</a>, <a href="#SP4_66">&#167;4.66</a>, <a href="#SP4_67">&#167;4.67</a>, <a href="#SP4_68">&#167;4.68</a>, <a href="#SP4_69">&#167;4.69</a>, <a href="#SP4_70">&#167;4.70</a>, <a href="#SP4_71">&#167;4.71</a>, <a href="#SP4_72">&#167;4.72</a>, <a href="#SP4_73">&#167;4.73</a>, <a href="#SP4_74">&#167;4.74</a>, <a href="#SP4_75">&#167;4.75</a>, <a href="#SP4_76">&#167;4.76</a>, <a href="#SP4_77">&#167;4.77</a>, <a href="#SP4_78">&#167;4.78</a>, <a href="#SP4_79">&#167;4.79</a>, <a href="#SP4_80">&#167;4.80</a>, <a href="#SP4_81">&#167;4.81</a>, <a href="#SP4_82">&#167;4.82</a>, <a href="#SP4_83">&#167;4.83</a>, <a href="#SP4_84">&#167;4.84</a>, <a href="#SP4_85">&#167;4.85</a>, <a href="#SP4_86">&#167;4.86</a>, <a href="#SP4_87">&#167;4.87</a>, <a href="#SP4_88">&#167;4.88</a>, <a href="#SP4_89">&#167;4.89</a>, <a href="#SP4_90">&#167;4.90</a>, <a href="#SP4_91">&#167;4.91</a>, <a href="#SP4_92">&#167;4.92</a>, <a href="#SP4_93">&#167;4.93</a>, <a href="#SP4_94">&#167;4.94</a>, <a href="#SP4_95">&#167;4.95</a>, <a href="#SP4_96">&#167;4.96</a>, <a href="#SP4_97">&#167;4.97</a>, <a href="#SP4_98">&#167;4.98</a>, <a href="#SP4_99">&#167;4.99</a>, <a href="#SP4_100">&#167;4.100</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>There's a contrivance here to get around an awkward point of I6 syntax:
an array written in the form
@ -762,10 +762,18 @@ is 20. We instead compile this as
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INDIRECT3_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for indirect3</span> <span class="cwebmacronumber">4.86</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INDIRECT4_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for indirect4</span> <span class="cwebmacronumber">4.87</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INDIRECT5_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for indirect5</span> <span class="cwebmacronumber">4.88</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for propertyaddress</span> <span class="cwebmacronumber">4.89</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for propertylength</span> <span class="cwebmacronumber">4.90</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROVIDES_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for provides</span> <span class="cwebmacronumber">4.91</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for propertyvalue</span> <span class="cwebmacronumber">4.92</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MESSAGE0_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for message0</span> <span class="cwebmacronumber">4.89</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MESSAGE1_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for message1</span> <span class="cwebmacronumber">4.90</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MESSAGE2_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for message2</span> <span class="cwebmacronumber">4.91</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">MESSAGE3_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for message3</span> <span class="cwebmacronumber">4.92</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALLMESSAGE0_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for callmessage0</span> <span class="cwebmacronumber">4.93</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALLMESSAGE1_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for callmessage1</span> <span class="cwebmacronumber">4.94</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALLMESSAGE2_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for callmessage2</span> <span class="cwebmacronumber">4.95</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">CALLMESSAGE3_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for callmessage3</span> <span class="cwebmacronumber">4.96</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTYADDRESS_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for propertyaddress</span> <span class="cwebmacronumber">4.97</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTYLENGTH_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for propertylength</span> <span class="cwebmacronumber">4.98</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROVIDES_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for provides</span> <span class="cwebmacronumber">4.99</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PROPERTYVALUE_BIP</span><span class="plain">: </span>&lt;<span class="cwebmacro">Generate primitive for propertyvalue</span> <span class="cwebmacronumber">4.100</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Prim: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">prim</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">); </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unimplemented prim"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -2448,7 +2456,159 @@ then the result.
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_89"></a><b>&#167;4.89. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for propertyaddress</span> <span class="cwebmacronumber">4.89</span>&gt; =
&lt;<span class="cwebmacrodefn">Generate primitive for message0</span> <span class="cwebmacronumber">4.89</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"())"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_90"></a><b>&#167;4.90. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for message1</span> <span class="cwebmacronumber">4.90</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::third_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_91"></a><b>&#167;4.91. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for message2</span> <span class="cwebmacronumber">4.91</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::third_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::fourth_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_92"></a><b>&#167;4.92. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for message3</span> <span class="cwebmacronumber">4.92</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::third_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::fourth_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::fifth_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_93"></a><b>&#167;4.93. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for callmessage0</span> <span class="cwebmacronumber">4.93</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call())"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_94"></a><b>&#167;4.94. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for callmessage1</span> <span class="cwebmacronumber">4.94</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_95"></a><b>&#167;4.95. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for callmessage2</span> <span class="cwebmacronumber">4.95</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::third_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_96"></a><b>&#167;4.96. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for callmessage3</span> <span class="cwebmacronumber">4.96</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::top_of_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">".call("</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::second_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::third_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">","</span><span class="plain">);</span>
<span class="functiontext">CodeGen::frame</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::fourth_in_frame_list</span><span class="plain">(</span><span class="identifier">ifl</span><span class="plain">));</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"))"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_97"></a><b>&#167;4.97. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for propertyaddress</span> <span class="cwebmacronumber">4.97</span>&gt; =
</code></p>
@ -2464,8 +2624,8 @@ then the result.
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_90"></a><b>&#167;4.90. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for propertylength</span> <span class="cwebmacronumber">4.90</span>&gt; =
<p class="inwebparagraph"><a id="SP4_98"></a><b>&#167;4.98. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for propertylength</span> <span class="cwebmacronumber">4.98</span>&gt; =
</code></p>
@ -2481,8 +2641,8 @@ then the result.
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_91"></a><b>&#167;4.91. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for provides</span> <span class="cwebmacronumber">4.91</span>&gt; =
<p class="inwebparagraph"><a id="SP4_99"></a><b>&#167;4.99. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for provides</span> <span class="cwebmacronumber">4.99</span>&gt; =
</code></p>
@ -2498,8 +2658,8 @@ then the result.
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4_92"></a><b>&#167;4.92. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for propertyvalue</span> <span class="cwebmacronumber">4.92</span>&gt; =
<p class="inwebparagraph"><a id="SP4_100"></a><b>&#167;4.100. </b><code class="display">
&lt;<span class="cwebmacrodefn">Generate primitive for propertyvalue</span> <span class="cwebmacronumber">4.100</span>&gt; =
</code></p>

View file

@ -60,7 +60,7 @@ kinds being compiled to an I6 <code class="display"><span class="extract">Class<
<p class="inwebparagraph"></p>
<p class="endnote">The function Kinds::RunTime::I6_classname is used in <a href="#SP25">&#167;25</a>, 6/bp (<a href="6-bp.html#SP25">&#167;25</a>), 6/rlt (<a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>), 12/ter (<a href="12-ter.html#SP8_6">&#167;8.6</a>), 12/ca (<a href="12-ca.html#SP6_2">&#167;6.2</a>), 12/dtd (<a href="12-dtd.html#SP24">&#167;24</a>), 13/kak (<a href="13-kak.html#SP2">&#167;2</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP4">&#167;4</a>), 27/eis (<a href="27-eis.html#SP2_8_1">&#167;2.8.1</a>).</p>
<p class="endnote">The function Kinds::RunTime::I6_classname is used in <a href="#SP25">&#167;25</a>, 6/bp (<a href="6-bp.html#SP25">&#167;25</a>), 6/rlt (<a href="6-rlt.html#SP29_2">&#167;29.2</a>, <a href="6-rlt.html#SP29_3">&#167;29.3</a>, <a href="6-rlt.html#SP29_4">&#167;29.4</a>, <a href="6-rlt.html#SP29_5">&#167;29.5</a>, <a href="6-rlt.html#SP29_6">&#167;29.6</a>), 12/ter (<a href="12-ter.html#SP8_6">&#167;8.6</a>), 12/ca (<a href="12-ca.html#SP6_2">&#167;6.2</a>), 12/dtd (<a href="12-dtd.html#SP24">&#167;24</a>), 13/kak (<a href="13-kak.html#SP2">&#167;2</a>), 25/cii (<a href="25-cii.html#SP3_1_1_4_7_1">&#167;3.1.1.4.7.1</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP4">&#167;4</a>), 27/eis (<a href="27-eis.html#SP2_10_1">&#167;2.10.1</a>).</p>
<p class="endnote">The function Kinds::RunTime::I6_classnumber is used in <a href="#SP23">&#167;23</a>, 16/ic (<a href="16-ic.html#SP6">&#167;6</a>, <a href="16-ic.html#SP10">&#167;10</a>).</p>

View file

@ -670,7 +670,7 @@ given fresh names in between now and then.
<p class="endnote">The function LocalVariables::by_name is used in 14/lv (<a href="14-lv.html#SP14_5">&#167;14.5</a>), 25/cii (<a href="25-cii.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function LocalVariables::by_name_any is used in 27/eis (<a href="27-eis.html#SP2_9">&#167;2.9</a>).</p>
<p class="endnote">The function LocalVariables::by_name_any is used in 27/eis (<a href="27-eis.html#SP2_11">&#167;2.11</a>).</p>
<p class="endnote">The function LocalVariables::phrase_options is used in 14/cn (<a href="14-cn.html#SP16_3">&#167;16.3</a>).</p>
@ -1648,7 +1648,7 @@ need in the compilation of any given routine:
<p class="endnote">The function LocalVariables::declare is used in 26/rt (<a href="26-rt.html#SP3">&#167;3</a>, <a href="26-rt.html#SP4">&#167;4</a>, <a href="26-rt.html#SP4_1_1">&#167;4.1.1</a>).</p>
<p class="endnote">The function LocalVariables::declare_this is used in <a href="#SP8">&#167;8</a>, <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP27">&#167;27</a>, <a href="#SP28">&#167;28</a>, <a href="#SP29">&#167;29</a>, <a href="#SP41">&#167;41</a>, <a href="#SP43">&#167;43</a>, <a href="#SP45">&#167;45</a>, 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>), 11/tr (<a href="11-tr.html#SP10">&#167;10</a>), 12/dtd (<a href="12-dtd.html#SP9">&#167;9</a>, <a href="12-dtd.html#SP23">&#167;23</a>, <a href="12-dtd.html#SP25">&#167;25</a>, <a href="12-dtd.html#SP26">&#167;26</a>, <a href="12-dtd.html#SP27">&#167;27</a>), 12/cad (<a href="12-cad.html#SP7">&#167;7</a>), 13/rsfk (<a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>), 14/lv (<a href="14-lv.html#SP14_1">&#167;14.1</a>, <a href="14-lv.html#SP14_5">&#167;14.5</a>), 14/cn (<a href="14-cn.html#SP16_3">&#167;16.3</a>), 20/eq (<a href="20-eq.html#SP48">&#167;48</a>), 25/cii (<a href="25-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="25-cii.html#SP3_5_1">&#167;3.5.1</a>, <a href="25-cii.html#SP3_5_3">&#167;3.5.3</a>), 25/cp (<a href="25-cp.html#SP5_3_5">&#167;5.3.5</a>), 27/eis (<a href="27-eis.html#SP2_9">&#167;2.9</a>).</p>
<p class="endnote">The function LocalVariables::declare_this is used in <a href="#SP8">&#167;8</a>, <a href="#SP10">&#167;10</a>, <a href="#SP11">&#167;11</a>, <a href="#SP27">&#167;27</a>, <a href="#SP28">&#167;28</a>, <a href="#SP29">&#167;29</a>, <a href="#SP41">&#167;41</a>, <a href="#SP43">&#167;43</a>, <a href="#SP45">&#167;45</a>, 4/am (<a href="4-am.html#SP34_2">&#167;34.2</a>), 11/tr (<a href="11-tr.html#SP10">&#167;10</a>), 12/dtd (<a href="12-dtd.html#SP9">&#167;9</a>, <a href="12-dtd.html#SP23">&#167;23</a>, <a href="12-dtd.html#SP25">&#167;25</a>, <a href="12-dtd.html#SP26">&#167;26</a>, <a href="12-dtd.html#SP27">&#167;27</a>), 12/cad (<a href="12-cad.html#SP7">&#167;7</a>), 13/rsfk (<a href="13-rsfk.html#SP24_6_2">&#167;24.6.2</a>, <a href="13-rsfk.html#SP24_6_3">&#167;24.6.3</a>, <a href="13-rsfk.html#SP24_6_4">&#167;24.6.4</a>), 14/lv (<a href="14-lv.html#SP14_1">&#167;14.1</a>, <a href="14-lv.html#SP14_5">&#167;14.5</a>), 14/cn (<a href="14-cn.html#SP16_3">&#167;16.3</a>), 20/eq (<a href="20-eq.html#SP48">&#167;48</a>), 25/cii (<a href="25-cii.html#SP1_2_1">&#167;1.2.1</a>, <a href="25-cii.html#SP3_5_1">&#167;3.5.1</a>, <a href="25-cii.html#SP3_5_3">&#167;3.5.3</a>), 25/cp (<a href="25-cp.html#SP5_3_5">&#167;5.3.5</a>), 27/eis (<a href="27-eis.html#SP2_11">&#167;2.11</a>).</p>
<p class="endnote">The function LocalVariables::create_and_declare is used in 13/rsfk (<a href="13-rsfk.html#SP24_4_1">&#167;24.4.1</a>, <a href="13-rsfk.html#SP24_4_2">&#167;24.4.2</a>).</p>

File diff suppressed because one or more lines are too long

View file

@ -41,14 +41,16 @@
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LABEL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Label</span> <span class="cwebmacronumber">2.1</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CODE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Code block</span> <span class="cwebmacronumber">2.2</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVAL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Eval block</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Expression</span> <span class="cwebmacronumber">2.9</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUBEXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Subexpression</span> <span class="cwebmacronumber">2.7</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STATEMENT_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Statement</span> <span class="cwebmacronumber">2.8</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OPERATION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Operation</span> <span class="cwebmacronumber">2.6</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EVAL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Eval block</span> <span class="cwebmacronumber">2.7</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">EXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Expression</span> <span class="cwebmacronumber">2.11</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SUBEXPRESSION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Subexpression</span> <span class="cwebmacronumber">2.9</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">STATEMENT_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Statement</span> <span class="cwebmacronumber">2.10</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">OPERATION_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Operation</span> <span class="cwebmacronumber">2.8</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ASSEMBLY_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Assembly</span> <span class="cwebmacronumber">2.3</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALL_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Call</span> <span class="cwebmacronumber">2.4</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DIRECTIVE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Directive</span> <span class="cwebmacronumber">2.10</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">MESSAGE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Message</span> <span class="cwebmacronumber">2.5</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CALLMESSAGE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Call-message</span> <span class="cwebmacronumber">2.6</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">DIRECTIVE_ISNT</span><span class="plain">: </span>&lt;<span class="cwebmacro">Directive</span> <span class="cwebmacronumber">2.12</span>&gt;<span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown schema node type"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -56,7 +58,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function EmitInterSchemas::emit_inner is used in <a href="#SP1">&#167;1</a>, <a href="#SP2_2">&#167;2.2</a>, <a href="#SP2_3">&#167;2.3</a>, <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_5">&#167;2.5</a>, <a href="#SP2_6">&#167;2.6</a>, <a href="#SP2_7">&#167;2.7</a>, <a href="#SP2_8">&#167;2.8</a>, <a href="#SP2_8_1">&#167;2.8.1</a>.</p>
<p class="endnote">The function EmitInterSchemas::emit_inner is used in <a href="#SP1">&#167;1</a>, <a href="#SP2_2">&#167;2.2</a>, <a href="#SP2_3">&#167;2.3</a>, <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_5">&#167;2.5</a>, <a href="#SP2_6">&#167;2.6</a>, <a href="#SP2_7">&#167;2.7</a>, <a href="#SP2_8">&#167;2.8</a>, <a href="#SP2_9">&#167;2.9</a>, <a href="#SP2_10">&#167;2.10</a>, <a href="#SP2_10_1">&#167;2.10.1</a>.</p>
<p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Label</span> <span class="cwebmacronumber">2.1</span>&gt; =
@ -192,7 +194,67 @@
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_5"></a><b>&#167;2.5. </b><code class="display">
&lt;<span class="cwebmacrodefn">Eval block</span> <span class="cwebmacronumber">2.5</span>&gt; =
&lt;<span class="cwebmacrodefn">Message</span> <span class="cwebmacronumber">2.5</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">) {</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain"> = 0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">=</span><span class="identifier">n</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">) </span><span class="identifier">argc</span><span class="plain">++;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">argc</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">message0_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 3: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">message1_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 4: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">message2_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 5: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">message3_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"too many args for message"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Emit::down</span><span class="plain">();</span>
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">at</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">=</span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">)</span>
<span class="functiontext">EmitInterSchemas::emit_inner</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">,</span>
<span class="identifier">VH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">opaque_state</span><span class="plain">, </span><span class="identifier">VAL_PRIM_CAT</span><span class="plain">,</span>
<span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">second_call</span><span class="plain">, </span><span class="identifier">inline_command_handler</span><span class="plain">, </span><span class="identifier">i7_source_handler</span><span class="plain">);</span>
<span class="functiontext">Emit::up</span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_6"></a><b>&#167;2.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Call-message</span> <span class="cwebmacronumber">2.6</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">) {</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain"> = 0;</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">n</span><span class="plain">=</span><span class="identifier">n</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">) </span><span class="identifier">argc</span><span class="plain">++;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">argc</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> 1: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">callmessage0_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 2: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">callmessage1_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 3: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">callmessage2_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> 4: </span><span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">callmessage3_interp</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"too many args for call-message"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Emit::down</span><span class="plain">();</span>
<span class="reserved">for</span><span class="plain"> (; </span><span class="identifier">at</span><span class="plain">; </span><span class="identifier">at</span><span class="plain">=</span><span class="identifier">at</span><span class="plain">-&gt;</span><span class="identifier">next_node</span><span class="plain">)</span>
<span class="functiontext">EmitInterSchemas::emit_inner</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">,</span>
<span class="identifier">VH</span><span class="plain">, </span><span class="identifier">sch</span><span class="plain">, </span><span class="identifier">opaque_state</span><span class="plain">, </span><span class="identifier">VAL_PRIM_CAT</span><span class="plain">,</span>
<span class="identifier">first_call</span><span class="plain">, </span><span class="identifier">second_call</span><span class="plain">, </span><span class="identifier">inline_command_handler</span><span class="plain">, </span><span class="identifier">i7_source_handler</span><span class="plain">);</span>
<span class="functiontext">Emit::up</span><span class="plain">();</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_7"></a><b>&#167;2.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Eval block</span> <span class="cwebmacronumber">2.7</span>&gt; =
</code></p>
@ -220,8 +282,8 @@
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_6"></a><b>&#167;2.6. </b><code class="display">
&lt;<span class="cwebmacrodefn">Operation</span> <span class="cwebmacronumber">2.6</span>&gt; =
<p class="inwebparagraph"><a id="SP2_8"></a><b>&#167;2.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Operation</span> <span class="cwebmacronumber">2.8</span>&gt; =
</code></p>
@ -249,8 +311,8 @@
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_7"></a><b>&#167;2.7. </b><code class="display">
&lt;<span class="cwebmacrodefn">Subexpression</span> <span class="cwebmacronumber">2.7</span>&gt; =
<p class="inwebparagraph"><a id="SP2_9"></a><b>&#167;2.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Subexpression</span> <span class="cwebmacronumber">2.9</span>&gt; =
</code></p>
@ -273,8 +335,8 @@
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_8"></a><b>&#167;2.8. </b><code class="display">
&lt;<span class="cwebmacrodefn">Statement</span> <span class="cwebmacronumber">2.8</span>&gt; =
<p class="inwebparagraph"><a id="SP2_10"></a><b>&#167;2.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Statement</span> <span class="cwebmacronumber">2.10</span>&gt; =
</code></p>
@ -286,7 +348,7 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">arity</span><span class="plain"> &gt; 0) {</span>
<span class="functiontext">Emit::down</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">isn_clarifier</span><span class="plain"> == </span><span class="identifier">objectloop_interp</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.8.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.10.1</span>&gt;<span class="plain">;</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain"> = </span><span class="identifier">isn</span><span class="plain">-&gt;</span><span class="identifier">child_node</span><span class="plain">;</span>
<span class="identifier">inter_schema_node</span><span class="plain"> *</span><span class="identifier">last</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">actual_arity</span><span class="plain"> = 0;</span>
@ -308,8 +370,8 @@
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_8_1"></a><b>&#167;2.8.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.8.1</span>&gt; =
<p class="inwebparagraph"><a id="SP2_10_1"></a><b>&#167;2.10.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Add the objectloop range tokens</span> <span class="cwebmacronumber">2.10.1</span>&gt; =
</code></p>
@ -342,10 +404,10 @@
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP2_8">&#167;2.8</a>.</p>
<p class="endnote">This code is used in <a href="#SP2_10">&#167;2.10</a>.</p>
<p class="inwebparagraph"><a id="SP2_9"></a><b>&#167;2.9. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expression</span> <span class="cwebmacronumber">2.9</span>&gt; =
<p class="inwebparagraph"><a id="SP2_11"></a><b>&#167;2.11. </b><code class="display">
&lt;<span class="cwebmacrodefn">Expression</span> <span class="cwebmacronumber">2.11</span>&gt; =
</code></p>
@ -437,8 +499,8 @@
<p class="endnote">This code is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP2_10"></a><b>&#167;2.10. </b><code class="display">
&lt;<span class="cwebmacrodefn">Directive</span> <span class="cwebmacronumber">2.10</span>&gt; =
<p class="inwebparagraph"><a id="SP2_12"></a><b>&#167;2.12. </b><code class="display">
&lt;<span class="cwebmacrodefn">Directive</span> <span class="cwebmacronumber">2.12</span>&gt; =
</code></p>
@ -515,7 +577,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function EmitInterSchemas::find_identifier is used in <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_9">&#167;2.9</a>.</p>
<p class="endnote">The function EmitInterSchemas::find_identifier is used in <a href="#SP2_4">&#167;2.4</a>, <a href="#SP2_11">&#167;2.11</a>.</p>
<p class="endnote">The function EmitInterSchemas::find_identifier_text is used in 25/cii (<a href="25-cii.html#SP3_6_2">&#167;3.6.2</a>).</p>

File diff suppressed because one or more lines are too long

View file

@ -324,7 +324,7 @@ automatically here:
<p class="inwebparagraph"></p>
<p class="endnote">The function InterNames::to_symbol is used in 15/epv (<a href="15-epv.html#SP4">&#167;4</a>), 21/rl (<a href="21-rl.html#SP11_2">&#167;11.2</a>, <a href="21-rl.html#SP22">&#167;22</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/eis (<a href="27-eis.html#SP2_9">&#167;2.9</a>, <a href="27-eis.html#SP3">&#167;3</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP4">&#167;4</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function InterNames::to_symbol is used in 15/epv (<a href="15-epv.html#SP4">&#167;4</a>), 21/rl (<a href="21-rl.html#SP11_2">&#167;11.2</a>, <a href="21-rl.html#SP22">&#167;22</a>), 26/iti (<a href="26-iti.html#SP9">&#167;9</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/eis (<a href="27-eis.html#SP2_11">&#167;2.11</a>, <a href="27-eis.html#SP3">&#167;3</a>), 27/ei (<a href="27-ei.html#SP2">&#167;2</a>, <a href="27-ei.html#SP3">&#167;3</a>, <a href="27-ei.html#SP4">&#167;4</a>, <a href="27-ei.html#SP5">&#167;5</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="27-pt.html">Back to 'Package Types'</a></li><li><a href="27-eis.html">Continue with 'Emitting Inter Schemas'</a></li></ul><hr class="tocbar">

View file

@ -30,6 +30,8 @@ void EmitInterSchemas::emit_inner(inter_schema_node *isn, value_holster *VH,
case OPERATION_ISNT: @<Operation@>; break;
case ASSEMBLY_ISNT: @<Assembly@>; break;
case CALL_ISNT: @<Call@>; break;
case MESSAGE_ISNT: @<Message@>; break;
case CALLMESSAGE_ISNT: @<Call-message@>; break;
case DIRECTIVE_ISNT: @<Directive@>; break;
default: internal_error("unknown schema node type");
}
@ -128,6 +130,46 @@ void EmitInterSchemas::emit_inner(inter_schema_node *isn, value_holster *VH,
Emit::up();
}
@<Message@> =
if (isn->child_node) {
inter_schema_node *at = isn->child_node;
int argc = 0;
for (inter_schema_node *n = isn->child_node; n; n=n->next_node) argc++;
switch (argc) {
case 2: Emit::inv_primitive(message0_interp); break;
case 3: Emit::inv_primitive(message1_interp); break;
case 4: Emit::inv_primitive(message2_interp); break;
case 5: Emit::inv_primitive(message3_interp); break;
default: internal_error("too many args for message"); break;
}
Emit::down();
for (; at; at=at->next_node)
EmitInterSchemas::emit_inner(at,
VH, sch, opaque_state, VAL_PRIM_CAT,
first_call, second_call, inline_command_handler, i7_source_handler);
Emit::up();
}
@<Call-message@> =
if (isn->child_node) {
inter_schema_node *at = isn->child_node;
int argc = 0;
for (inter_schema_node *n = isn->child_node; n; n=n->next_node) argc++;
switch (argc) {
case 1: Emit::inv_primitive(callmessage0_interp); break;
case 2: Emit::inv_primitive(callmessage1_interp); break;
case 3: Emit::inv_primitive(callmessage2_interp); break;
case 4: Emit::inv_primitive(callmessage3_interp); break;
default: internal_error("too many args for call-message"); break;
}
Emit::down();
for (; at; at=at->next_node)
EmitInterSchemas::emit_inner(at,
VH, sch, opaque_state, VAL_PRIM_CAT,
first_call, second_call, inline_command_handler, i7_source_handler);
Emit::up();
}
@<Eval block@> =
if ((prim_cat != CODE_PRIM_CAT) && (prim_cat != VAL_PRIM_CAT))
internal_error("eval block outside evaluation context");

View file

@ -0,0 +1,59 @@
Test: parse schema from:
alpha.beta()
* (message)
* (expr)
IDENTIFIER alpha
* (expr)
IDENTIFIER beta
=========
Test: parse schema from:
alpha.beta(x)
* (message)
* (expr)
IDENTIFIER alpha
* (expr)
IDENTIFIER beta
* (expr)
IDENTIFIER x
=========
Test: parse schema from:
routine.call(x)
* (call-message)
* (expr)
IDENTIFIER routine
* (expr)
IDENTIFIER x
=========
Test: parse schema from:
(alpha.beta)(x)
* (call)
* (subexpression)
* (operation) !propertyvalue
* (expr)
IDENTIFIER alpha
* (expr)
IDENTIFIER beta
* (expr)
IDENTIFIER x
=========
Test: parse schema from:
debug_rules = 2; say__p = 1;
"Rules tracing now switched to ~all~. Type ~rules off~ to switch it off again.";
* (operation) !store
* (expr)
IDENTIFIER debug_rules
* (expr)
NUMBER 2
* (operation) !store
* (expr)
IDENTIFIER say__p
* (expr)
NUMBER 1
* (expr) ;
DQUOTED Rules tracing now switched to "all". Type "rules off" to switch it off again.
=========

16
inter/Tests/Units/exp.txt Normal file
View file

@ -0,0 +1,16 @@
schema
alpha.beta()
end
schema
alpha.beta(x)
end
schema
routine.call(x)
end
schema
(alpha.beta)(x)
end
schema
debug_rules = 2; say__p = 1;
"Rules tracing now switched to ~all~. Type ~rules off~ to switch it off again.";
end

View file

@ -669,7 +669,7 @@ inter_symbol *CodeGen::Assimilate::computed_constant_symbol(inter_package *pack)
int rb_splat_count = 1;
void CodeGen::Assimilate::routine_body(inter_reading_state *IRS, inter_symbol *block_name, inter_t offset, text_stream *body) {
if (Str::is_whitespace(body)) return;
if (Str::len(body) < 100) {
if (Str::len(body) < 120) {
LOG("=======\n\nCandidate (%S) len %d: '%S'\n\n", block_name->symbol_name, Str::len(body), body);
inter_schema *sch = InterSchemas::from_text(body, FALSE, 0, NULL);

View file

@ -89,6 +89,14 @@ inter_symbol *indirect2_interp = NULL;
inter_symbol *indirect3_interp = NULL;
inter_symbol *indirect4_interp = NULL;
inter_symbol *indirect5_interp = NULL;
inter_symbol *message0_interp = NULL;
inter_symbol *message1_interp = NULL;
inter_symbol *message2_interp = NULL;
inter_symbol *message3_interp = NULL;
inter_symbol *callmessage0_interp = NULL;
inter_symbol *callmessage1_interp = NULL;
inter_symbol *callmessage2_interp = NULL;
inter_symbol *callmessage3_interp = NULL;
inter_symbol *propertyaddress_interp = NULL;
inter_symbol *propertylength_interp = NULL;
inter_symbol *provides_interp = NULL;
@ -183,6 +191,14 @@ void Primitives::emit(inter_repository *I, inter_reading_state *IRS) {
Primitives::emit_one(I, IRS, I"!indirect3", I"val val val val -> val", &indirect3_interp);
Primitives::emit_one(I, IRS, I"!indirect4", I"val val val val val -> val", &indirect4_interp);
Primitives::emit_one(I, IRS, I"!indirect5", I"val val val val val val -> val", &indirect5_interp);
Primitives::emit_one(I, IRS, I"!message0", I"val val -> val", &message0_interp);
Primitives::emit_one(I, IRS, I"!message1", I"val val val -> val", &message1_interp);
Primitives::emit_one(I, IRS, I"!message2", I"val val val val -> val", &message2_interp);
Primitives::emit_one(I, IRS, I"!message3", I"val val val val val -> val", &message3_interp);
Primitives::emit_one(I, IRS, I"!callmessage0", I"val -> val", &callmessage0_interp);
Primitives::emit_one(I, IRS, I"!callmessage1", I"val val -> val", &callmessage1_interp);
Primitives::emit_one(I, IRS, I"!callmessage2", I"val val val -> val", &callmessage2_interp);
Primitives::emit_one(I, IRS, I"!callmessage3", I"val val val val -> val", &callmessage3_interp);
Primitives::emit_one(I, IRS, I"!propertyaddress", I"val val -> val", &propertyaddress_interp);
Primitives::emit_one(I, IRS, I"!propertylength", I"val val -> val", &propertylength_interp);
Primitives::emit_one(I, IRS, I"!provides", I"val val -> val", &provides_interp);
@ -337,6 +353,14 @@ inter_symbol *Primitives::indirectv_interp(int arity) {
@e INDIRECT3_BIP
@e INDIRECT4_BIP
@e INDIRECT5_BIP
@e MESSAGE0_BIP
@e MESSAGE1_BIP
@e MESSAGE2_BIP
@e MESSAGE3_BIP
@e CALLMESSAGE0_BIP
@e CALLMESSAGE1_BIP
@e CALLMESSAGE2_BIP
@e CALLMESSAGE3_BIP
@e PROPERTYADDRESS_BIP
@e PROPERTYLENGTH_BIP
@e PROVIDES_BIP
@ -436,6 +460,14 @@ inter_t Primitives::to_bip(inter_repository *I, inter_symbol *symb) {
if (Str::eq(symb->symbol_name, I"!indirect3")) bip = INDIRECT3_BIP;
if (Str::eq(symb->symbol_name, I"!indirect4")) bip = INDIRECT4_BIP;
if (Str::eq(symb->symbol_name, I"!indirect5")) bip = INDIRECT5_BIP;
if (Str::eq(symb->symbol_name, I"!message0")) bip = MESSAGE0_BIP;
if (Str::eq(symb->symbol_name, I"!message1")) bip = MESSAGE1_BIP;
if (Str::eq(symb->symbol_name, I"!message2")) bip = MESSAGE2_BIP;
if (Str::eq(symb->symbol_name, I"!message3")) bip = MESSAGE3_BIP;
if (Str::eq(symb->symbol_name, I"!callmessage0")) bip = CALLMESSAGE0_BIP;
if (Str::eq(symb->symbol_name, I"!callmessage1")) bip = CALLMESSAGE1_BIP;
if (Str::eq(symb->symbol_name, I"!callmessage2")) bip = CALLMESSAGE2_BIP;
if (Str::eq(symb->symbol_name, I"!callmessage3")) bip = CALLMESSAGE3_BIP;
if (Str::eq(symb->symbol_name, I"!propertyaddress")) bip = PROPERTYADDRESS_BIP;
if (Str::eq(symb->symbol_name, I"!propertylength")) bip = PROPERTYLENGTH_BIP;
if (Str::eq(symb->symbol_name, I"!provides")) bip = PROVIDES_BIP;

View file

@ -65,6 +65,8 @@ but the need to do this went away.)
@e ASSEMBLY_ISNT
@e LABEL_ISNT
@e CALL_ISNT
@e MESSAGE_ISNT
@e CALLMESSAGE_ISNT
=
typedef struct inter_schema_node {
@ -463,6 +465,12 @@ void InterSchemas::log_just(inter_schema_node *isn, int depth) {
case CALL_ISNT:
LOG("* (call)\n");
break;
case MESSAGE_ISNT:
LOG("* (message)\n");
break;
case CALLMESSAGE_ISNT:
LOG("* (call-message)\n");
break;
case SUBEXPRESSION_ISNT:
LOG("* (subexpression)\n");
break;
@ -791,6 +799,7 @@ out for the two extra syntaxes allowed, |{-bracing}| and |(+ Inform 7 interpolat
InterSchemas::add_token(sch, InterSchemas::new_token(WHITE_SPACE_ISTT, I" ", NULL, 0, -1));
break;
case DQUOTED_TOKSTATE:
InterSchemas::de_escape_text(current_raw);
InterSchemas::add_token(sch, InterSchemas::new_token(DQUOTED_ISTT, current_raw, NULL, 0, -1));
break;
case SQUOTED_TOKSTATE:
@ -1429,6 +1438,7 @@ void InterSchemas::unmark(inter_schema_node *isn) {
REPEATEDLY_APPLY(InterSchemas::strip_all_spacing);
REPEATEDLY_APPLY(InterSchemas::debracket);
REPEATEDLY_APPLY(InterSchemas::implied_return_values);
REPEATEDLY_APPLY(InterSchemas::message_calls);
@ =
int InterSchemas::implied_braces(inter_schema_node *par, inter_schema_node *at) {
@ -1846,10 +1856,10 @@ int InterSchemas::splitcases(inter_schema_node *par, inter_schema_node *isn) {
@ =
int InterSchemas::alternatecases(inter_schema_node *par, inter_schema_node *isn) {
for (; isn; isn=isn->next_node) {
if (isn->isn_clarifier == case_interp) {
if ((isn->isn_clarifier == case_interp) && (isn->child_node)) {
inter_schema_node *A = isn->child_node;
inter_schema_node *B = isn->child_node->next_node;
if ((A->isn_type == EXPRESSION_ISNT) && (B->isn_type == EXPRESSION_ISNT)) {
if ((A) && (B) && (B->next_node)) {
inter_schema_node *C = InterSchemas::new_node(isn->parent_schema, OPERATION_ISNT);
C->isn_clarifier = alternativecase_interp;
C->child_node = A;
@ -1939,12 +1949,7 @@ int InterSchemas::identify_constructs(inter_schema_node *par, inter_schema_node
while ((n) && (n->ist_type == WHITE_SPACE_ISTT)) n = n->next;
if ((n) && (n->ist_type == DQUOTED_ISTT)) {
subordinate_to = print_interp;
LOOP_THROUGH_TEXT(P, n->material) {
if (Str::get(P) == '^')
Str::put(P, '\n');
if (Str::get(P) == '~')
Str::put(P, '\"');
}
InterSchemas::de_escape_text(n->material);
}
}
if (isn->expression_tokens->reserved_word == PRINTRET_I6RW) {
@ -2136,6 +2141,7 @@ int InterSchemas::identify_constructs(inter_schema_node *par, inter_schema_node
if (dangle_text) {
new_isn->expression_tokens = InterSchemas::new_token(DQUOTED_ISTT, dangle_text, NULL, 0, -1);
new_isn->expression_tokens->owner = new_isn;
InterSchemas::de_escape_text(new_isn->expression_tokens->material);
}
if (operand2) {
inter_schema_node *new_new_isn = InterSchemas::new_node(isn->parent_schema, EXPRESSION_ISNT);
@ -2570,6 +2576,40 @@ int InterSchemas::implied_return_values(inter_schema_node *par, inter_schema_nod
return FALSE;
}
@ =
int InterSchemas::message_calls(inter_schema_node *par, inter_schema_node *isn) {
for (inter_schema_node *prev = NULL; isn; prev = isn, isn = isn->next_node) {
if ((isn->isn_type == OPERATION_ISNT) && (isn->isn_clarifier == propertyvalue_interp) &&
(isn->child_node) && (isn->child_node->next_node) && (isn->child_node->next_node->isn_type == CALL_ISNT)) {
inter_schema_node *obj = isn->child_node;
inter_schema_node *message = isn->child_node->next_node->child_node;
inter_schema_node *args = isn->child_node->next_node->child_node->next_node;
isn->isn_type = MESSAGE_ISNT; isn->isn_clarifier = NULL;
obj->next_node = message; message->parent_node = isn; message->next_node = args;
if (message->isn_type == EXPRESSION_ISNT) {
inter_schema_token *n = message->expression_tokens;
if ((n) && (Str::eq(n->material, I"call"))) {
obj->next_node = args; isn->isn_type = CALLMESSAGE_ISNT;
}
}
while (args) { args->parent_node = isn; args = args->next_node; }
return TRUE;
}
if (InterSchemas::message_calls(isn, isn->child_node)) return TRUE;
}
return FALSE;
}
@ =
void InterSchemas::de_escape_text(text_stream *m) {
LOOP_THROUGH_TEXT(P, m) {
if (Str::get(P) == '^')
Str::put(P, '\n');
if (Str::get(P) == '~')
Str::put(P, '\"');
}
}
@h Operators in I6.
The following routines return data which is essentially the content of the
table shown in section 6.2 of the Inform 6 Technical Manual: which operators

View file

@ -702,6 +702,14 @@ void CodeGen::inv(OUTPUT_STREAM, inter_repository *I, inter_frame P) {
case INDIRECT3_BIP: @<Generate primitive for indirect3@>; break;
case INDIRECT4_BIP: @<Generate primitive for indirect4@>; break;
case INDIRECT5_BIP: @<Generate primitive for indirect5@>; break;
case MESSAGE0_BIP: @<Generate primitive for message0@>; break;
case MESSAGE1_BIP: @<Generate primitive for message1@>; break;
case MESSAGE2_BIP: @<Generate primitive for message2@>; break;
case MESSAGE3_BIP: @<Generate primitive for message3@>; break;
case CALLMESSAGE0_BIP: @<Generate primitive for callmessage0@>; break;
case CALLMESSAGE1_BIP: @<Generate primitive for callmessage1@>; break;
case CALLMESSAGE2_BIP: @<Generate primitive for callmessage2@>; break;
case CALLMESSAGE3_BIP: @<Generate primitive for callmessage3@>; break;
case PROPERTYADDRESS_BIP: @<Generate primitive for propertyaddress@>; break;
case PROPERTYLENGTH_BIP: @<Generate primitive for propertylength@>; break;
case PROVIDES_BIP: @<Generate primitive for provides@>; break;
@ -1459,6 +1467,78 @@ then the result.
CodeGen::frame(OUT, I, Inter::sixth_in_frame_list(ifl));
WRITE(")");
@<Generate primitive for message0@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE("())");
@<Generate primitive for message1@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE("(");
CodeGen::frame(OUT, I, Inter::third_in_frame_list(ifl));
WRITE("))");
@<Generate primitive for message2@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE("(");
CodeGen::frame(OUT, I, Inter::third_in_frame_list(ifl));
WRITE(",");
CodeGen::frame(OUT, I, Inter::fourth_in_frame_list(ifl));
WRITE("))");
@<Generate primitive for message3@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE("(");
CodeGen::frame(OUT, I, Inter::third_in_frame_list(ifl));
WRITE(",");
CodeGen::frame(OUT, I, Inter::fourth_in_frame_list(ifl));
WRITE(",");
CodeGen::frame(OUT, I, Inter::fifth_in_frame_list(ifl));
WRITE("))");
@<Generate primitive for callmessage0@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".call())");
@<Generate primitive for callmessage1@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".call(");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE("))");
@<Generate primitive for callmessage2@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".call(");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE(",");
CodeGen::frame(OUT, I, Inter::third_in_frame_list(ifl));
WRITE("))");
@<Generate primitive for callmessage3@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));
WRITE(".call(");
CodeGen::frame(OUT, I, Inter::second_in_frame_list(ifl));
WRITE(",");
CodeGen::frame(OUT, I, Inter::third_in_frame_list(ifl));
WRITE(",");
CodeGen::frame(OUT, I, Inter::fourth_in_frame_list(ifl));
WRITE("))");
@<Generate primitive for propertyaddress@> =
WRITE("(");
CodeGen::frame(OUT, I, Inter::top_of_frame_list(ifl));