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

Assimilating with asynchronous plugs and sockets

This commit is contained in:
Graham Nelson 2019-08-20 14:48:45 +01:00
parent 006b55b04d
commit 5e9658cb27
46 changed files with 342 additions and 535 deletions

View file

@ -32,7 +32,6 @@
<span class="identifier">no_assimilated_actions</span><span class="plain"> = 0;</span>
<span class="identifier">no_assimilated_commands</span><span class="plain"> = 0;</span>
<span class="identifier">no_assimilated_arrays</span><span class="plain"> = 0;</span>
<span class="functiontext">CodeGen::MergeTemplate::ensure_search_list</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::visitor1</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SPLAT_IST</span><span class="plain">);</span>
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::visitor2</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SPLAT_IST</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::function_bodies</span><span class="plain">();</span>
@ -106,7 +105,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::template_submodule is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::template_submodule is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::visitor1 is used in <a href="#SP1">&#167;1</a>.</p>
@ -134,10 +133,8 @@
&lt;<span class="cwebmacro">Parse text of splat for identifier and value</span> <span class="cwebmacronumber">2.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">proceed</span><span class="plain">) &amp;&amp; (</span><span class="identifier">unchecked_kind_symbol</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain"> = </span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symbol</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">plm</span><span class="plain"> = </span><span class="identifier">CONSTANT_PLM</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">plm</span><span class="plain"> = </span><span class="identifier">CONSTANT_PLM</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> != </span><span class="identifier">DEFAULT_PLM</span><span class="plain">) </span>&lt;<span class="cwebmacro">Act on parsed constant definition</span> <span class="cwebmacronumber">2.1.2</span>&gt;<span class="plain">;</span>
<span class="identifier">Inter::Tree::remove_node</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">}</span>
@ -231,7 +228,7 @@
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::maybe_extern</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">, 1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">FAKEACTION_PLM</span><span class="plain">)</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">FAKE_ACTION_IANN</span><span class="plain">, 1);</span>
@ -255,7 +252,7 @@
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + 1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">GLOBAL_PLM</span><span class="plain">:</span>
@ -264,7 +261,7 @@
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">), </span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + 1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ATTRIBUTE_PLM</span><span class="plain">: {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
@ -291,10 +288,10 @@
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">alias_symbol</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">, </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">)))</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">attr_symbol</span><span class="plain">, </span><span class="identifier">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">attr_symbol</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
@ -303,7 +300,7 @@
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">con_name</span><span class="plain">),</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unchecked_kind_symbol</span><span class="plain">),</span>
<span class="plain">(</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + 1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">VERB_PLM</span><span class="plain">:</span>
@ -382,7 +379,7 @@
<span class="identifier">Inter::Bookmarks::insert</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">array_in_progress</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plm</span><span class="plain"> == </span><span class="identifier">ARRAY_PLM</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
@ -537,7 +534,7 @@
<span class="plain">*</span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">inner_save</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rsymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::maybe_extern</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">rsymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">ASSIMILATED_IANN</span><span class="plain">, 1);</span>
<span class="functiontext">CodeGen::MergeTemplate::guard</span><span class="plain">(</span><span class="identifier">Inter::Constant::new_function</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">,</span>
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">FP</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">),</span>
@ -547,11 +544,7 @@
<span class="plain">*</span><span class="identifier">IBM</span><span class="plain"> = </span><span class="identifier">outer_save</span><span class="plain">;</span>
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">T_IBM</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::after_this_node</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">alias_name</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(&amp;</span><span class="identifier">T_IBM</span><span class="plain">), </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">alias_name</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::set_flag</span><span class="plain">(</span><span class="identifier">alias_name</span><span class="plain">, </span><span class="identifier">ALIAS_ONLY_BIT</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">, </span><span class="identifier">rsymb</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">Inter::Tree::remove_node</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
</pre>
@ -570,89 +563,32 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::install_alias</span><span class="plain">(</span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">aka_text</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">template_package</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">existing</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span>
<span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">), </span><span class="identifier">aka_text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">)) {</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Symbols::definition</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Q</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"undefined"</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::undefine</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">);</span>
<span class="identifier">Inter::Tree::remove_node</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_AME</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AME: removing previous definition of $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">existing</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_AME</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AME extra alias $3 = $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">existing</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">);</span>
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::set_flag</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">, </span><span class="identifier">ALIAS_ONLY_BIT</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">alias_name</span><span class="plain"> =</span>
<span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span>
<span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">), </span><span class="identifier">aka_text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_AME</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AME extra alias $3 = $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">alias_name</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">);</span>
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">alias_name</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::set_flag</span><span class="plain">(</span><span class="identifier">alias_name</span><span class="plain">, </span><span class="identifier">ALIAS_ONLY_BIT</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">con_name</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">aka_text</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">socket</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">aka_text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">socket</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Inter::Connectors::socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">aka_text</span><span class="plain">, </span><span class="identifier">con_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::new_package_named is used in <a href="#SP2">&#167;2</a>, <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::install_alias is used in <a href="#SP2_1_2">&#167;2.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::maybe_extern</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">into_scope</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">existing</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">))</span>
<span class="identifier">existing</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)), </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">existing</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">))) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">hmm</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)), </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">hmm</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Still relying upon $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">hmm</span><span class="plain">);</span>
<span class="identifier">existing</span><span class="plain"> = </span><span class="identifier">hmm</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">existing</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">new_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">into_scope</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_AME</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AME %S: unknown, so creating $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">new_symbol</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_symbol</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">existing</span><span class="plain">-&gt;</span><span class="identifier">owning_table</span><span class="plain"> == </span><span class="identifier">into_scope</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"already in this scope"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">)) {</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Symbols::definition</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Q</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"undefined"</span><span class="plain">);</span>
<span class="identifier">Inter::Symbols::undefine</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">);</span>
<span class="identifier">Inter::Tree::remove_node</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_AME</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AME %S: removing previous definition of $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">existing</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">into_scope</span><span class="plain">) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">new_symbol</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">into_scope</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">existing</span><span class="plain">, </span><span class="identifier">new_symbol</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_AME</span><span class="plain">) </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"AME %S: equating $3 to $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">, </span><span class="identifier">existing</span><span class="plain">, </span><span class="identifier">new_symbol</span><span class="plain">);</span>
<span class="functiontext">CodeGen::Assimilate::install_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">new_symbol</span><span class="plain">, </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">new_symbol</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Assimilate::maybe_extern is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP5">&#167;5</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::new_package_named is used in <a href="#SP2">&#167;2</a>, <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<p class="endnote">The function CodeGen::Assimilate::install_socket is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>.</p>
<p class="endnote">The function CodeGen::Assimilate::make_socketed_symbol is used in <a href="#SP2_1_2">&#167;2.1.2</a>, <a href="#SP2_2_2">&#167;2.2.2</a>, <a href="#SP4">&#167;4</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Assimilate::ensure_action</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">) == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">IBM_d</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::template_submodule</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"actions"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain"> = &amp;</span><span class="identifier">IBM_d</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">ptype</span><span class="plain"> = </span><span class="identifier">action_ptype_symbol</span><span class="plain">;</span>
@ -661,12 +597,12 @@
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">, </span><span class="string">"assim_action_%d"</span><span class="plain">, ++</span><span class="identifier">no_assimilated_actions</span><span class="plain">);</span>
<span class="identifier">Inter::Bookmarks::set_current_package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="functiontext">CodeGen::Assimilate::new_package_named</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">an</span><span class="plain">, </span><span class="identifier">ptype</span><span class="plain">));</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">an</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">asymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::maybe_extern</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">asymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::Assimilate::make_socketed_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">, </span><span class="string">"%SSub"</span><span class="plain">, </span><span class="identifier">value</span><span class="plain">);</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">txsymb</span><span class="plain"> = </span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">txsymb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">xsymb</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">unsharped</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">txsymb</span><span class="plain">) </span><span class="identifier">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">xsymb</span><span class="plain">, </span><span class="identifier">txsymb</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">unsharped</span><span class="plain">);</span>
@ -675,7 +611,6 @@
<span class="identifier">Inter::SymbolsTables::id_from_symbol</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">action_kind_symbol</span><span class="plain">),</span>
<span class="identifier">LITERAL_IVAL</span><span class="plain">, 10000, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">Inter::Bookmarks::baseline</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">) + 1, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="identifier">Inter::Symbols::annotate_i</span><span class="plain">(</span><span class="identifier">asymb</span><span class="plain">, </span><span class="identifier">ACTION_IANN</span><span class="plain">, 1);</span>
<span class="functiontext">CodeGen::MergeTemplate::build_r</span><span class="plain">(</span><span class="identifier">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
@ -684,7 +619,7 @@
<p class="endnote">The function CodeGen::Assimilate::ensure_action is used in <a href="#SP2_1_2">&#167;2.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b></p>
<pre class="display">
@ -779,7 +714,7 @@
<span class="plain">}</span>
<span class="identifier">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="identifier">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"scope=(%i+)"</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">SCOPE_FILTER_IANN</span><span class="plain">) != 1)</span>
@ -788,7 +723,7 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"noun=(%i+)"</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0]);</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::read_annotation</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">NOUN_FILTER_IANN</span><span class="plain">) != 1)</span>
@ -798,7 +733,7 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">) {</span>
<span class="identifier">Inter::Symbols::to_data</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">val1</span><span class="plain">, </span><span class="identifier">val2</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
@ -866,10 +801,9 @@
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = </span><span class="identifier">UNDEF_IVAL</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;ist_type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IDENTIFIER_ISTT</span><span class="plain">: {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">t</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">symb</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">symb</span><span class="plain">;</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Failed to identify %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">-</span><span class="element">&gt;material</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NUMBER_ISTT</span><span class="plain">:</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BIN_NUMBER_ISTT</span><span class="plain">:</span>

View file

@ -128,8 +128,7 @@ be included.
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">tab</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">tab</span><span class="plain">-&gt;</span><span class="identifier">size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">tab</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Inter::Symbols::get_flag</span><span class="plain">(</span><span class="identifier">symb</span><span class="plain">, </span><span class="identifier">ALIAS_ONLY_BIT</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">symb</span><span class="plain">) &amp;&amp; (</span><span class="identifier">symb</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">symb</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">to</span><span class="plain">) &amp;&amp; (</span><span class="identifier">to</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">to</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">needed</span><span class="plain"> = </span><span class="identifier">to</span><span class="plain">-&gt;</span><span class="identifier">owning_table</span><span class="plain">-&gt;</span><span class="identifier">owning_package</span><span class="plain">;</span>

View file

@ -30,24 +30,6 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">link_search_list</span><span class="plain">[10];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">link_search_list_len</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::ensure_search_list</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">link_search_list_len</span><span class="plain"> == 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">template_package</span><span class="plain">) {</span>
<span class="identifier">link_search_list</span><span class="plain">[2] = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">link_search_list</span><span class="plain">[1] = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">link_search_list</span><span class="plain">[0] = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">);</span>
<span class="identifier">link_search_list_len</span><span class="plain"> = 3;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">link_search_list</span><span class="plain">[1] = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">link_search_list</span><span class="plain">[0] = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">link_search_list_len</span><span class="plain"> = 2;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::link</span><span class="plain">(</span><span class="identifier">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">template_file</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> **</span><span class="identifier">PP</span><span class="plain">, </span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">owner</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">IBM</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no inter to link with"</span><span class="plain">);</span>
<span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain"> = </span><span class="identifier">Inter::Bookmarks::tree</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">);</span>
@ -55,8 +37,6 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">template_package</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unable to find template"</span><span class="plain">);</span>
<span class="functiontext">CodeGen::MergeTemplate::ensure_search_list</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">inter_bookmark</span><span class="plain"> </span><span class="identifier">link_bookmark</span><span class="plain"> =</span>
<span class="identifier">Inter::Bookmarks::at_end_of_this_package</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">);</span>
@ -81,74 +61,6 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">dictionary</span><span class="plain"> *</span><span class="identifier">linkable_namespace</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">linkable_namespace_created</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::MergeTemplate::find_in_namespace</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">linkable_namespace_created</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">linkable_namespace_created</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">linkable_namespace</span><span class="plain"> = </span><span class="identifier">Dictionaries::new</span><span class="plain">(512, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">main_package</span><span class="plain"> = </span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">main_package</span><span class="plain">) {</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">Inter::Packages::definition</span><span class="plain">(</span><span class="identifier">main_package</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">Inter::Packages::name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"template"</span><span class="plain">))</span>
<span class="functiontext">CodeGen::MergeTemplate::build_r</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">}</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">Dictionaries::find</span><span class="plain">(</span><span class="identifier">linkable_namespace</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">))</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">inter_symbol</span><span class="plain"> *) </span><span class="identifier">Dictionaries::read_value</span><span class="plain">(</span><span class="identifier">linkable_namespace</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::build_r</span><span class="plain">(</span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="functiontext">CodeGen::MergeTemplate::build_only</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">Inter::Packages::definition</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">CodeGen::MergeTemplate::build_r</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::build_only</span><span class="plain">(</span><span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">T</span><span class="plain">-&gt;</span><span class="identifier">size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">)) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="identifier">Inter::Symbols::get_flag</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">MAKE_NAME_UNIQUE</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)) {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</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">S</span><span class="plain">-&gt;</span><span class="identifier">translate_text</span><span class="plain">) &gt; 0) </span><span class="identifier">name</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">translate_text</span><span class="plain">;</span>
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="identifier">linkable_namespace</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">linkable_namespace</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="functiontext">CodeGen::MergeTemplate::find_name</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">link_search_list_len</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">link_search_list</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span><span class="identifier">link_search_list</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">symb</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">symb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::find_in_namespace</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::log_search_path</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">link_search_list_len</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Search %d: $4\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">link_search_list</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">link_pie_count</span><span class="plain"> = 0;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::MergeTemplate::guard</span><span class="plain">(</span><span class="identifier">inter_error_message</span><span class="plain"> *</span><span class="identifier">ERR</span><span class="plain">) {</span>
@ -169,25 +81,13 @@
<p class="endnote">The function CodeGen::MergeTemplate::run_pipeline_stage appears nowhere else.</p>
<p class="endnote">The function CodeGen::MergeTemplate::ensure_search_list is used in 2/alm (<a href="2-alm.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::MergeTemplate::link appears nowhere else.</p>
<p class="endnote">The function CodeGen::MergeTemplate::visitor appears nowhere else.</p>
<p class="endnote">The function CodeGen::MergeTemplate::find_in_namespace appears nowhere else.</p>
<p class="endnote">The function CodeGen::MergeTemplate::guard is used in 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 2/alm (<a href="2-alm.html#SP2_1_2">&#167;2.1.2</a>, <a href="2-alm.html#SP2_2_2">&#167;2.2.2</a>, <a href="2-alm.html#SP3">&#167;3</a>, <a href="2-alm.html#SP4">&#167;4</a>, <a href="2-alm.html#SP5">&#167;5</a>), 3/ip (<a href="3-ip.html#SP2">&#167;2</a>), 3/tv (<a href="3-tv.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::MergeTemplate::build_r is used in 2/alm (<a href="2-alm.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function CodeGen::MergeTemplate::build_only appears nowhere else.</p>
<p class="endnote">The function CodeGen::MergeTemplate::find_name is used in 2/alm (<a href="2-alm.html#SP2_1">&#167;2.1</a>, <a href="2-alm.html#SP5">&#167;5</a>, <a href="2-alm.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function CodeGen::MergeTemplate::log_search_path appears nowhere else.</p>
<p class="endnote">The function CodeGen::MergeTemplate::guard is used in 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 2/alm (<a href="2-alm.html#SP2_1_2">&#167;2.1.2</a>, <a href="2-alm.html#SP2_2_2">&#167;2.2.2</a>, <a href="2-alm.html#SP3">&#167;3</a>, <a href="2-alm.html#SP5">&#167;5</a>, <a href="2-alm.html#SP6">&#167;6</a>), 3/ip (<a href="3-ip.html#SP2">&#167;2</a>), 3/tv (<a href="3-tv.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function CodeGen::MergeTemplate::entire_splat is used in <a href="#SP2">&#167;2</a>, 2/alm (<a href="2-alm.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function CodeGen::MergeTemplate::entire_splat is used in <a href="#SP2">&#167;2</a>, 2/alm (<a href="2-alm.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>

View file

@ -11,7 +11,7 @@
<!--Weave of '2/res' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">codegen</a></li><li><a href="index.html#2">Chapter 2: Miscellaneous Pipeline Stages</a></li><li><b>Resolve External Symbols</b></li></ul><p class="purpose">To make sure certain symbol names translate into globally unique target symbols.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li><li><a href="#SP2">&#167;2. The whole shebang</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Pipeline stage</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Pipeline stage. </b></p>
@ -21,37 +21,45 @@
<span class="functiontext">CodeGen::Stage::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"resolve-external-symbols"</span><span class="plain">, </span><span class="functiontext">CodeGen::Externals::run_pipeline_stage</span><span class="plain">, </span><span class="constant">NO_STAGE_ARG</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">resolution_failed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CodeGen::Externals::run_pipeline_stage</span><span class="plain">(</span><span class="reserved">pipeline_step</span><span class="plain"> *</span><span class="identifier">step</span><span class="plain">) {</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="identifier">resolution_failed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="functiontext">CodeGen::Externals::visitor</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, 0);</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTERNAL_SYMBOL_RESOLUTION</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">"</span><span class="plain">);</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTERNAL_SYMBOL_RESOLUTION</span><span class="plain">, </span><span class="string">"Removing $3 as a main indirection intermediate\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Inter::Symbols::get_flag</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">EXTERN_TARGET_BIT</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) &amp;&amp; (!</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">))) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTERNAL_SYMBOL_RESOLUTION</span><span class="plain">, </span><span class="string">"Removing $3 as undefined and not an extern target\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">Inter::Connectors::stecker</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">resolution_failed</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">Inter::Tree::traverse</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">&gt;repository</span><span class="plain">, </span><span class="functiontext">CodeGen::Externals::visitor</span><span class="plain">, &amp;</span><span class="identifier">resolution_failed</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">PACKAGE_IST</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">resolution_failed</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"undefined external link(s)"</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">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Externals::visitor</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> *</span><span class="identifier">fail_flag</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) == </span><span class="identifier">Q</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">D</span><span class="plain">) &amp;&amp; (</span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">socket</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">socket</span><span class="plain">) {</span>
<span class="identifier">D</span><span class="plain"> = </span><span class="identifier">socket</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">;</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">template_package</span><span class="plain">) {</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">template_package</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Inter::Symbols::get_flag</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">ALIAS_ONLY_BIT</span><span class="plain">))) {</span>
<span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">EXTERNAL_SYMBOL_RESOLUTION</span><span class="plain">, </span><span class="string">"Removing $3 as a template alias\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">) == </span><span class="identifier">PLUG_ISYMS</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$3 == $3 which is a loose plug, seeking %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">equated_name</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"Failed to connect plug to: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">equated_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fail_flag</span><span class="plain">) *</span><span class="identifier">fail_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$3 == $3 which is undefined\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"Failed to resolve symbol: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">fail_flag</span><span class="plain">) *</span><span class="identifier">fail_flag</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</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">resolution_failed</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"undefined external link(s)"</span><span class="plain">);</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>
</pre>
@ -61,38 +69,7 @@
<p class="endnote">The function CodeGen::Externals::run_pipeline_stage appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. The whole shebang. </b></p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CodeGen::Externals::visitor</span><span class="plain">(</span><span class="identifier">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">inter_tree_node</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">-&gt;</span><span class="identifier">W</span><span class="plain">.</span><span class="identifier">data</span><span class="plain">[</span><span class="identifier">ID_IFLD</span><span class="plain">] == </span><span class="identifier">PACKAGE_IST</span><span class="plain">) {</span>
<span class="identifier">inter_package</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="identifier">Inter::Package::defined_by_frame</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Inter::Tree::main_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) == </span><span class="identifier">Q</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">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">) == </span><span class="identifier">Q</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="identifier">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="identifier">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">ST</span><span class="plain">-&gt;</span><span class="identifier">symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) {</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">D</span><span class="plain">) &amp;&amp; (</span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">)) </span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="identifier">equated_to</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">;</span>
<span class="identifier">Inter::Symbols::set_flag</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">EXTERN_TARGET_BIT</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (!</span><span class="identifier">Inter::Symbols::is_defined</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">)) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"In package $6:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">Q</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"$3 == $3 which is undefined\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"Failed to resolve symbol: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">-&gt;</span><span class="identifier">symbol_name</span><span class="plain">);</span>
<span class="identifier">resolution_failed</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function CodeGen::Externals::visitor is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function CodeGen::Externals::visitor appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-alm.html">Back to 'Assimilate Linked Matter'</a></li><li><a href="2-unq.html">Continue with 'Uniqueness'</a></li></ul><hr class="tocbar">

View file

@ -690,7 +690,7 @@ we go to some trouble here.
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSchemas::log is used in 1/cm (<a href="1-cm.html#SP4_6">&#167;4.6</a>), 2/alm (<a href="2-alm.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function InterSchemas::log is used in 1/cm (<a href="1-cm.html#SP4_6">&#167;4.6</a>), 2/alm (<a href="2-alm.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function InterSchemas::log_depth appears nowhere else.</p>
@ -943,7 +943,7 @@ for instance, we could simply have defined:
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSchemas::from_text is used in <a href="#SP18">&#167;18</a>, <a href="#SP19">&#167;19</a>, 2/alm (<a href="2-alm.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function InterSchemas::from_text is used in <a href="#SP18">&#167;18</a>, <a href="#SP19">&#167;19</a>, 2/alm (<a href="2-alm.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP20_1"></a><b>&#167;20.1. Stage 1. </b>Our method is to tokenise the source code as if it were Inform 6, but to look
out for the two extra syntaxes allowed, <code class="display"><span class="extract">{-bracing}</span></code> and <code class="display"><span class="extract">(+ Inform 7 interpolation +)</span></code>.

View file

@ -327,6 +327,12 @@ absence of rooms would otherwise result in.
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::Compare::eq</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">, </span><span class="identifier">K_understanding</span><span class="plain">)) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">empty</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">DEFAULTTOPIC_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::to_ival</span><span class="plain">(</span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">empty</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Kinds::get_construct</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">) == </span><span class="identifier">CON_rule</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">empty</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">LITTLE_USED_DO_NOTHING_R_HL</span><span class="plain">);</span>
<span class="functiontext">Emit::to_ival</span><span class="plain">(</span><span class="identifier">v1</span><span class="plain">, </span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">empty</span><span class="plain">);</span>
@ -1453,6 +1459,7 @@ each such kind, and needed at run-time.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::RunTime::compile_nnci</span><span class="plain">(</span><span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">val</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Kinds::RunTime::compile_instance_counts</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
@ -1468,6 +1475,7 @@ each such kind, and needed at run-time.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Characters::isalnum</span><span class="plain">(</span><span class="identifier">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">)) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">Str::put</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="character">'_'</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_specific_name</span><span class="plain">(</span><span class="constant">ICOUNT_HL</span><span class="plain">, </span><span class="functiontext">Emit::main_render_unique</span><span class="plain">(</span><span class="functiontext">Emit::main_scope</span><span class="plain">(), </span><span class="identifier">ICN</span><span class="plain">), </span><span class="identifier">Kinds::Behaviour::package</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">ICN</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="functiontext">Instances::count</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">));</span>
<span class="plain">}</span>

View file

@ -100,7 +100,7 @@ no existence at the source text level &mdash; and hence have no names.
</p>
<p class="inwebparagraph">Setting them up as adjectives may seem a little over the top, since they cannot
be encountered in source text, but the plugins will have to set these properties
be encountered in source text, but the world model will have to set these properties
by asserting propositions to be true; and type-checking of those propositions
relies on adjectival meanings.
</p>
@ -109,8 +109,9 @@ relies on adjectival meanings.
<pre class="display">
<span class="reserved">property</span><span class="plain"> *</span><span class="functiontext">Properties::EitherOr::new_nameless</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">I6_form</span><span class="plain">) {</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::feed_text</span><span class="plain">(</span><span class="identifier">I6_form</span><span class="plain">);</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="constant">PROPERTY_HL</span><span class="plain">, </span><span class="functiontext">Hierarchy::template</span><span class="plain">(), </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::create</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="functiontext">Hierarchy::template</span><span class="plain">(), </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">package_request</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Hierarchy::synoptic_package</span><span class="plain">(</span><span class="constant">PROPERTIES_HAP</span><span class="plain">);</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::make_iname_with_memo</span><span class="plain">(</span><span class="constant">PROPERTY_HL</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">);</span>
<span class="reserved">property</span><span class="plain"> *</span><span class="identifier">prn</span><span class="plain"> = </span><span class="functiontext">Properties::create</span><span class="plain">(</span><span class="identifier">EMPTY_WORDING</span><span class="plain">, </span><span class="identifier">R</span><span class="plain">, </span><span class="identifier">iname</span><span class="plain">);</span>
<span class="identifier">prn</span><span class="plain">-</span><span class="element">&gt;either_or</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="functiontext">Properties::exclude_from_index</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">);</span>
<span class="functiontext">Properties::set_translation</span><span class="plain">(</span><span class="identifier">prn</span><span class="plain">, </span><span class="identifier">I6_form</span><span class="plain">);</span>

View file

@ -917,9 +917,11 @@ times".
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Chronology::chronology_extents_i6_escape</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname1</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NO_PAST_TENSE_CONDS_HL</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname1</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname1</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">no_past_tenses</span><span class="plain">);</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname2</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">NO_PAST_TENSE_ACTIONS_HL</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname2</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname2</span><span class="plain">, (</span><span class="identifier">inter_t</span><span class="plain">) </span><span class="identifier">no_past_actions</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>

View file

@ -457,6 +457,7 @@ without notice.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::TestScriptSub_stub_routine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTSCRIPTSUB_HL</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::rfalse</span><span class="plain">();</span>
<span class="functiontext">Routines::end</span><span class="plain">(</span><span class="identifier">save</span><span class="plain">);</span>
@ -464,6 +465,7 @@ without notice.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PL::Parsing::TestScripts::TestScriptSub_routine</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="constant">TESTSCRIPTSUB_HL</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">packaging_state</span><span class="plain"> </span><span class="identifier">save</span><span class="plain"> = </span><span class="functiontext">Routines::begin</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NUMBER_CREATED</span><span class="plain">(</span><span class="reserved">test_scenario</span><span class="plain">) == 0) {</span>
<span class="functiontext">Emit::inv_primitive</span><span class="plain">(</span><span class="identifier">print_interp</span><span class="plain">);</span>

View file

@ -219,24 +219,28 @@ value for each possible word size.
<pre class="display">
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">VirtualMachines::emit_fundamental_constant</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">VirtualMachines::emit_signed_fundamental_constant</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant_signed</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">VirtualMachines::emit_hex_fundamental_constant</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant_hex</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">VirtualMachines::emit_unchecked_hex_fundamental_constant</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_unchecked_constant_hex</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>

View file

@ -134,7 +134,7 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">symb</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::plug</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">Inter::Connectors::plug</span><span class="plain">(</span><span class="functiontext">Emit::tree</span><span class="plain">(), </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">Dictionaries::create</span><span class="plain">(</span><span class="identifier">extern_symbols</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">Dictionaries::write_value</span><span class="plain">(</span><span class="identifier">extern_symbols</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">symb</span><span class="plain">;</span>

File diff suppressed because one or more lines are too long

View file

@ -1199,6 +1199,7 @@ logical properties of the two terms of the BP being defined.
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="functiontext">Relations::compile_defined_relation_constant</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
<span class="reserved">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="functiontext">Hierarchy::find</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="functiontext">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="functiontext">Emit::named_numeric_constant_hex</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">iname</span><span class="plain">;</span>
<span class="plain">}</span>

View file

@ -36,7 +36,7 @@ but on others it's compiled into the body of an application. So:
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/pt (<a href="2-pt.html#SP52">&#167;52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/rst (<a href="3-rst.html#SP6">&#167;6</a>), 4/am (<a href="4-am.html#SP26_1">&#167;26.1</a>), 8/ef (<a href="8-ef.html#SP26">&#167;26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">&#167;3.2</a>), 10/varc (<a href="10-varc.html#SP14">&#167;14</a>), 19/tb (<a href="19-tb.html#SP27">&#167;27</a>, <a href="19-tb.html#SP27_1">&#167;27.1</a>, <a href="19-tb.html#SP27_1_3">&#167;27.1.3</a>, <a href="19-tb.html#SP29">&#167;29</a>), 21/rl2 (<a href="21-rl2.html#SP23">&#167;23</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/cm (<a href="27-cm.html#SP1">&#167;1</a>), 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 2/res (<a href="2-res.html#SP1">&#167;1</a>), 4/fc (<a href="4-fc.html#SP1">&#167;1</a>), 2/hf (<a href="2-hf.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function main is used in 2/pt (<a href="2-pt.html#SP52">&#167;52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/rst (<a href="3-rst.html#SP6">&#167;6</a>), 4/am (<a href="4-am.html#SP26_1">&#167;26.1</a>), 8/ef (<a href="8-ef.html#SP26">&#167;26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">&#167;3.2</a>), 10/varc (<a href="10-varc.html#SP14">&#167;14</a>), 19/tb (<a href="19-tb.html#SP27">&#167;27</a>, <a href="19-tb.html#SP27_1">&#167;27.1</a>, <a href="19-tb.html#SP27_1_3">&#167;27.1.3</a>, <a href="19-tb.html#SP29">&#167;29</a>), 21/rl2 (<a href="21-rl2.html#SP23">&#167;23</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/cm (<a href="27-cm.html#SP1">&#167;1</a>), 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 4/fc (<a href="4-fc.html#SP1">&#167;1</a>), 2/hf (<a href="2-hf.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>As a matter of policy, no module is allowed to start or stop the foundation
module, not even the mighty core; so we take care of that with one more

View file

@ -80,6 +80,7 @@ score corresponding to successful completion and the highest rank.
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">inter_name</span><span class="plain"> *</span><span class="identifier">iname</span><span class="plain"> = </span><span class="identifier">Hierarchy::find</span><span class="plain">(</span><span class="identifier">INITIAL_MAX_SCORE_HL</span><span class="plain">);</span>
<span class="identifier">Hierarchy::make_available</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NonlocalVariables::has_initial_value_set</span><span class="plain">(</span><span class="identifier">max_score_VAR</span><span class="plain">)) {</span>
<span class="identifier">inter_t</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain"> = 0, </span><span class="identifier">v2</span><span class="plain"> = 0;</span>
<span class="identifier">NonlocalVariables::seek_initial_value</span><span class="plain">(</span><span class="identifier">iname</span><span class="plain">, &amp;</span><span class="identifier">v1</span><span class="plain">, &amp;</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">max_score_VAR</span><span class="plain">);</span>

View file

@ -43,7 +43,7 @@ when they want I7 to run.
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/pt (<a href="2-pt.html#SP52">&#167;52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/rst (<a href="3-rst.html#SP6">&#167;6</a>), 4/am (<a href="4-am.html#SP26_1">&#167;26.1</a>), 8/ef (<a href="8-ef.html#SP26">&#167;26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">&#167;3.2</a>), 10/varc (<a href="10-varc.html#SP14">&#167;14</a>), 19/tb (<a href="19-tb.html#SP27">&#167;27</a>, <a href="19-tb.html#SP27_1">&#167;27.1</a>, <a href="19-tb.html#SP27_1_3">&#167;27.1.3</a>, <a href="19-tb.html#SP29">&#167;29</a>), 21/rl2 (<a href="21-rl2.html#SP23">&#167;23</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/cm (<a href="27-cm.html#SP1">&#167;1</a>), 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 2/res (<a href="2-res.html#SP1">&#167;1</a>), 4/fc (<a href="4-fc.html#SP1">&#167;1</a>), 3/sm (<a href="3-sm.html#SP36">&#167;36</a>, <a href="3-sm.html#SP36_1">&#167;36.1</a>, <a href="3-sm.html#SP38">&#167;38</a>), 3/em2 (<a href="3-em2.html#SP24">&#167;24</a>), 4/ap (<a href="4-ap.html#SP2">&#167;2</a>), 2/hf (<a href="2-hf.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function main is used in 2/pt (<a href="2-pt.html#SP52">&#167;52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">&#167;3.1</a>), 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/rst (<a href="3-rst.html#SP6">&#167;6</a>), 4/am (<a href="4-am.html#SP26_1">&#167;26.1</a>), 8/ef (<a href="8-ef.html#SP26">&#167;26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">&#167;3.2</a>), 10/varc (<a href="10-varc.html#SP14">&#167;14</a>), 19/tb (<a href="19-tb.html#SP27">&#167;27</a>, <a href="19-tb.html#SP27_1">&#167;27.1</a>, <a href="19-tb.html#SP27_1_3">&#167;27.1.3</a>, <a href="19-tb.html#SP29">&#167;29</a>), 21/rl2 (<a href="21-rl2.html#SP23">&#167;23</a>), 26/uo (<a href="26-uo.html#SP11_1">&#167;11.1</a>), 27/hr (<a href="27-hr.html#SP5">&#167;5</a>), 27/cm (<a href="27-cm.html#SP1">&#167;1</a>), 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 4/fc (<a href="4-fc.html#SP1">&#167;1</a>), 3/sm (<a href="3-sm.html#SP36">&#167;36</a>, <a href="3-sm.html#SP36_1">&#167;36.1</a>, <a href="3-sm.html#SP38">&#167;38</a>), 3/em2 (<a href="3-em2.html#SP24">&#167;24</a>), 4/ap (<a href="4-ap.html#SP2">&#167;2</a>), 2/hf (<a href="2-hf.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Either way, that brings us here. All our modules have to be started up and
shut down, so we take care of that with one more intermediary. These modules

View file

@ -15,12 +15,16 @@
<pre class="display">
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::Connectors::plug</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">plug_name</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">wanted</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_plug_number</span><span class="plain"> = 1;</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::Connectors::plug</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">wanted</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">connectors</span><span class="plain"> = </span><span class="functiontext">Inter::Connectors::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">, </span><span class="string">"plug_%05d"</span><span class="plain">, </span><span class="identifier">unique_plug_number</span><span class="plain">++);</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">plug</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span>
<span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">connectors</span><span class="plain">), </span><span class="identifier">plug_name</span><span class="plain">);</span>
<span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">connectors</span><span class="plain">), </span><span class="identifier">PN</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">PN</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::make_plug</span><span class="plain">(</span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">wanted</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Plug I%d: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">plug_name</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Plug I%d: $3 seeking %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">plug</span><span class="plain">;</span>
<span class="plain">}</span>
@ -29,7 +33,7 @@
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">socket</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::create_with_unique_name</span><span class="plain">(</span>
<span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">connectors</span><span class="plain">), </span><span class="identifier">socket_name</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::make_socket</span><span class="plain">(</span><span class="identifier">socket</span><span class="plain">, </span><span class="identifier">wired_from</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Socket I%d: %S (== $3)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">socket_name</span><span class="plain">, </span><span class="identifier">socket</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Socket I%d: $3 wired to $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-&gt;</span><span class="identifier">allocation_id</span><span class="plain">, </span><span class="identifier">socket</span><span class="plain">, </span><span class="identifier">wired_from</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">socket</span><span class="plain">;</span>
<span class="plain">}</span>
@ -53,6 +57,50 @@
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">connectors</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">connectors</span><span class="plain"> = </span><span class="functiontext">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">connectors</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span>
<span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="functiontext">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)), </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">) == </span><span class="constant">SOCKET_ISYMS</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="functiontext">Inter::Connectors::find_plug</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">identifier</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">connectors</span><span class="plain"> = </span><span class="functiontext">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">connectors</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_name_not_equating</span><span class="plain">(</span>
<span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="functiontext">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">)), </span><span class="identifier">identifier</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">S</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">) == </span><span class="constant">PLUG_ISYMS</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Connectors::wire_plug</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">plug</span><span class="plain">, </span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plug</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no plug"</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Plug $3 wired to $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Connectors::stecker</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">I</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">Q</span><span class="plain"> = </span><span class="functiontext">Inter::Tree::connectors_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Q</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">ST</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">Q</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">plug</span><span class="plain"> = </span><span class="identifier">ST</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">plug</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Inter::Symbols::get_scope</span><span class="plain">(</span><span class="identifier">plug</span><span class="plain">) == </span><span class="constant">PLUG_ISYMS</span><span class="plain">) &amp;&amp; (</span><span class="identifier">plug</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">socket</span><span class="plain"> = </span><span class="functiontext">Inter::Connectors::find_socket</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">socket</span><span class="plain">) {</span>
<span class="functiontext">Inter::Connectors::wire_plug</span><span class="plain">(</span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">socket</span><span class="plain">);</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Wired plug $3 to $3\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">socket</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Loose plug: $3 (seeking %S)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">, </span><span class="identifier">plug</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -63,6 +111,14 @@
<p class="endnote">The function Inter::Connectors::connectors_package appears nowhere else.</p>
<p class="endnote">The function Inter::Connectors::find_socket appears nowhere else.</p>
<p class="endnote">The function Inter::Connectors::find_plug appears nowhere else.</p>
<p class="endnote">The function Inter::Connectors::wire_plug appears nowhere else.</p>
<p class="endnote">The function Inter::Connectors::stecker appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-ann.html">Back to 'Annotations'</a></li><li><a href="2-trn.html">Continue with 'Transmigration'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -30,7 +30,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure inter_symbols_table is accessed in 2/in, 2/tw, 2/pck, 2/sym, 2/trn, 3/iibf and here.</p>
<p class="endnote">The structure inter_symbols_table is accessed in 2/in, 2/tw, 2/pck, 2/sym, 2/cnn, 2/trn, 3/iibf and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
@ -225,7 +225,7 @@
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name is used in <a href="#SP5">&#167;5</a>, <a href="#SP11">&#167;11</a>, 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/trn (<a href="2-trn.html#SP3_1">&#167;3.1</a>), 3/iitf (<a href="3-iitf.html#SP1">&#167;1</a>), 3/idt (<a href="3-idt.html#SP3">&#167;3</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_not_equating appears nowhere else.</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_not_equating is used in 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_creating is used in <a href="#SP5">&#167;5</a>, 2/trn (<a href="2-trn.html#SP3_1_1">&#167;3.1.1</a>), 3/iitf (<a href="3-iitf.html#SP1">&#167;1</a>).</p>
@ -511,7 +511,7 @@ a global symbol in any non-global context.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::SymbolsTables::equate is used in <a href="#SP9">&#167;9</a>, 3/iibf (<a href="3-iibf.html#SP1_5">&#167;1.5</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::equate is used in <a href="#SP9">&#167;9</a>, 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/iibf (<a href="3-iibf.html#SP1_5">&#167;1.5</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::equate_textual is used in 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>

View file

@ -34,7 +34,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure inter_symbol is accessed in 2/st, 2/trn, 3/iibf, 3/iitf, 3/vi, 3/idt, 4/tmc, 4/tpc, 4/tac, 4/tpc2, 4/tpc3, 4/tkc, 4/tdc, 4/tvc2, 4/tcc2, 4/trc, 4/tic, 4/tpc4, 4/tpc5, 4/tpc6, 4/tpc7, 5/tlc, 5/tlc2, 5/tic, 5/trc, 5/tvc, 5/tlc3, 5/tcc2 and here.</p>
<p class="endnote">The structure inter_symbol is accessed in 2/st, 2/cnn, 2/trn, 3/iibf, 3/iitf, 3/vi, 3/idt, 4/tmc, 4/tpc, 4/tac, 4/tpc2, 4/tpc3, 4/tkc, 4/tdc, 4/tvc2, 4/tcc2, 4/trc, 4/tic, 4/tpc4, 4/tpc5, 4/tpc6, 4/tpc7, 5/tlc, 5/tlc2, 5/tic, 5/trc, 5/tvc, 5/tlc3, 5/tcc2 and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
@ -100,7 +100,7 @@
<p class="endnote">The function Inter::Symbols::get_type is used in <a href="#SP4">&#167;4</a>, <a href="#SP5">&#167;5</a>, 3/iibf (<a href="3-iibf.html#SP1_1_3_2">&#167;1.1.3.2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Symbols::get_scope is used in <a href="#SP4">&#167;4</a>, <a href="#SP5">&#167;5</a>, 2/st (<a href="2-st.html#SP10">&#167;10</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">&#167;1.4.2</a>, <a href="3-iibf.html#SP1_1_3_2">&#167;1.1.3.2</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Symbols::get_scope is used in <a href="#SP4">&#167;4</a>, <a href="#SP5">&#167;5</a>, 2/st (<a href="2-st.html#SP10">&#167;10</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">&#167;1.4.2</a>, <a href="3-iibf.html#SP1_1_3_2">&#167;1.1.3.2</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Symbols::set_type is used in <a href="#SP5">&#167;5</a>, 2/st (<a href="2-st.html#SP10">&#167;10</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">&#167;1.4.2</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>

View file

@ -254,7 +254,7 @@
<span class="functiontext">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain">(</span><span class="identifier">URL</span><span class="plain">, </span><span class="identifier">target</span><span class="plain">);</span>
<span class="identifier">equivalent</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::url_name_to_symbol</span><span class="plain">(</span><span class="identifier">ipct</span><span class="plain">-</span><span class="element">&gt;destination</span><span class="plain">-</span><span class="element">&gt;package_head</span><span class="plain">-</span><span class="element">&gt;tree</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">URL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">equivalent</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">equivalent</span><span class="plain"> = </span><span class="functiontext">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">ipct</span><span class="plain">-</span><span class="element">&gt;destination_tree</span><span class="plain">, </span><span class="identifier">target</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">, </span><span class="identifier">URL</span><span class="plain">);</span>
<span class="identifier">equivalent</span><span class="plain"> = </span><span class="functiontext">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">ipct</span><span class="plain">-</span><span class="element">&gt;destination_tree</span><span class="plain">, </span><span class="identifier">URL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">URL</span><span class="plain">);</span>
<span class="functiontext">Inter::Transmigration::cache</span><span class="plain">(</span><span class="identifier">target</span><span class="plain">, </span><span class="identifier">equivalent</span><span class="plain">);</span>
<span class="plain">}</span>
@ -324,7 +324,7 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">equivalent</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">URL</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain">(</span><span class="identifier">URL</span><span class="plain">, </span><span class="identifier">target</span><span class="plain">);</span>
<span class="identifier">equivalent</span><span class="plain"> = </span><span class="functiontext">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">ipct</span><span class="plain">-</span><span class="element">&gt;origin_tree</span><span class="plain">, </span><span class="identifier">target</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">, </span><span class="identifier">URL</span><span class="plain">);</span>
<span class="identifier">equivalent</span><span class="plain"> = </span><span class="functiontext">Inter::Connectors::plug</span><span class="plain">(</span><span class="identifier">ipct</span><span class="plain">-</span><span class="element">&gt;origin_tree</span><span class="plain">, </span><span class="identifier">URL</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">URL</span><span class="plain">);</span>
<span class="functiontext">Inter::Transmigration::cache</span><span class="plain">(</span><span class="identifier">target</span><span class="plain">, </span><span class="identifier">equivalent</span><span class="plain">);</span>
<span class="plain">}</span>

View file

@ -27,7 +27,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure inter_warehouse is accessed in 2/in, 2/st, 2/trn, 3/iibf and here.</p>
<p class="endnote">The structure inter_warehouse is accessed in 2/in, 2/st, 2/cnn, 2/trn, 3/iibf and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
@ -67,7 +67,7 @@
<p class="endnote">The structure inter_resource_holder is accessed in 2/st, 2/pck, 2/trn, 3/iibf and here.</p>
<p class="endnote">The structure inter_warehouse_room is accessed in 2/in, 2/st, 2/trn, 3/iibf and here.</p>
<p class="endnote">The structure inter_warehouse_room is accessed in 2/in, 2/st, 2/cnn, 2/trn, 3/iibf and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>

View file

@ -83,9 +83,7 @@ symbol.
<span class="definitionkeyword">define</span> <span class="constant">VPH_MARK_BIT</span><span class="plain"> 0</span><span class="identifier">x00000080</span>
<span class="definitionkeyword">define</span> <span class="constant">USED_MARK_BIT</span><span class="plain"> 0</span><span class="identifier">x00000100</span>
<span class="definitionkeyword">define</span> <span class="constant">MAKE_NAME_UNIQUE</span><span class="plain"> 0</span><span class="identifier">x00000200</span>
<span class="definitionkeyword">define</span> <span class="constant">EXTERN_TARGET_BIT</span><span class="plain"> 0</span><span class="identifier">x00000400</span>
<span class="definitionkeyword">define</span> <span class="constant">ALIAS_ONLY_BIT</span><span class="plain"> 0</span><span class="identifier">x00000800</span>
<span class="definitionkeyword">define</span> <span class="constant">NONTRANSIENT_SYMBOL_BITS</span><span class="plain"> (</span><span class="constant">MAKE_NAME_UNIQUE</span><span class="plain"> + </span><span class="constant">ALIAS_ONLY_BIT</span><span class="plain"> + </span><span class="constant">SYMBOL_TYPE_MASK_ISYMT</span><span class="plain"> + </span><span class="constant">SYMBOL_SCOPE_MASK_ISYMT</span><span class="plain">)</span>
<span class="definitionkeyword">define</span> <span class="constant">NONTRANSIENT_SYMBOL_BITS</span><span class="plain"> (</span><span class="constant">MAKE_NAME_UNIQUE</span><span class="plain"> + </span><span class="constant">SYMBOL_TYPE_MASK_ISYMT</span><span class="plain"> + </span><span class="constant">SYMBOL_SCOPE_MASK_ISYMT</span><span class="plain">)</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>

View file

@ -21,8 +21,8 @@
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::unequated_symbol_from_id</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;W.data</span><span class="plain">[</span><span class="identifier">index</span><span class="plain">]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::Node::error</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"no symbol for ID (case 1)"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"This is $6 but %S equates to a symbol in $6\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="functiontext">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">, </span><span class="functiontext">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">-</span><span class="element">&gt;definition</span><span class="plain">));</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"This is $6 but $3 equates to $3 in $6\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="functiontext">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">, </span><span class="functiontext">Inter::Packages::container</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">-</span><span class="element">&gt;definition</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::Node::error</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"symbol defined outside its native scope"</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_tree_node</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::definition</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>

View file

@ -80,7 +80,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function main is used in 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 2/res (<a href="2-res.html#SP1">&#167;1</a>), 4/fc (<a href="4-fc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function main is used in 2/pck (<a href="2-pck.html#SP3">&#167;3</a>), 2/cnn (<a href="2-cnn.html#SP1">&#167;1</a>), 1/ppl (<a href="1-ppl.html#SP5">&#167;5</a>), 4/fc (<a href="4-fc.html#SP1">&#167;1</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>

View file

@ -256,6 +256,12 @@ void Kinds::RunTime::get_default_value(inter_t *v1, inter_t *v2, kind *K) {
Emit::to_ival(v1, v2, empty);
return;
}
if (Kinds::Compare::eq(K, K_understanding)) {
inter_name *empty = Hierarchy::find(DEFAULTTOPIC_HL);
Emit::to_ival(v1, v2, empty);
return;
}
if (Kinds::get_construct(K) == CON_rule) {
inter_name *empty = Hierarchy::find(LITTLE_USED_DO_NOTHING_R_HL);
@ -1052,6 +1058,7 @@ void Kinds::RunTime::kind_declarations(void) {
void Kinds::RunTime::compile_nnci(inter_name *name, int val) {
Emit::named_numeric_constant(name, (inter_t) val);
Hierarchy::make_available(name);
}
void Kinds::RunTime::compile_instance_counts(void) {
@ -1067,6 +1074,7 @@ void Kinds::RunTime::compile_instance_counts(void) {
if (Characters::isalnum(Str::get(pos)) == FALSE) Str::put(pos, '_');
}
inter_name *iname = Hierarchy::make_iname_with_specific_name(ICOUNT_HL, Emit::main_render_unique(Emit::main_scope(), ICN), Kinds::Behaviour::package(K));
Hierarchy::make_available(iname);
DISCARD_TEXT(ICN);
Emit::named_numeric_constant(iname, (inter_t) Instances::count(K));
}

View file

@ -79,20 +79,21 @@ which are added to the model by plugins here inside Inform, but which have
no existence at the source text level -- and hence have no names.
Setting them up as adjectives may seem a little over the top, since they cannot
be encountered in source text, but the plugins will have to set these properties
be encountered in source text, but the world model will have to set these properties
by asserting propositions to be true; and type-checking of those propositions
relies on adjectival meanings.
=
property *Properties::EitherOr::new_nameless(wchar_t *I6_form) {
wording W = Feeds::feed_text(I6_form);
inter_name *iname = Hierarchy::make_iname_with_memo(PROPERTY_HL, Hierarchy::template(), W);
property *prn = Properties::create(EMPTY_WORDING, Hierarchy::template(), iname);
package_request *R = Hierarchy::synoptic_package(PROPERTIES_HAP);
inter_name *iname = Hierarchy::make_iname_with_memo(PROPERTY_HL, R, W);
property *prn = Properties::create(EMPTY_WORDING, R, iname);
prn->either_or = TRUE;
Properties::exclude_from_index(prn);
Properties::set_translation(prn, I6_form);
Properties::EitherOr::create_adjective_from_property(prn, EMPTY_WORDING, K_object);
prn->run_time_only = TRUE;
prn->run_time_only = TRUE;
return prn;
}

View file

@ -784,8 +784,10 @@ times".
=
void Chronology::chronology_extents_i6_escape(void) {
inter_name *iname1 = Hierarchy::find(NO_PAST_TENSE_CONDS_HL);
Hierarchy::make_available(iname1);
Emit::named_numeric_constant(iname1, (inter_t) no_past_tenses);
inter_name *iname2 = Hierarchy::find(NO_PAST_TENSE_ACTIONS_HL);
Hierarchy::make_available(iname2);
Emit::named_numeric_constant(iname2, (inter_t) no_past_actions);
}

View file

@ -298,6 +298,7 @@ void PL::Parsing::TestScripts::NO_TEST_SCENARIOS_constant(void) {
void PL::Parsing::TestScripts::TestScriptSub_stub_routine(void) {
inter_name *iname = Hierarchy::find(TESTSCRIPTSUB_HL);
Hierarchy::make_available(iname);
packaging_state save = Routines::begin(iname);
Emit::rfalse();
Routines::end(save);
@ -305,6 +306,7 @@ void PL::Parsing::TestScripts::TestScriptSub_stub_routine(void) {
void PL::Parsing::TestScripts::TestScriptSub_routine(void) {
inter_name *iname = Hierarchy::find(TESTSCRIPTSUB_HL);
Hierarchy::make_available(iname);
packaging_state save = Routines::begin(iname);
if (NUMBER_CREATED(test_scenario) == 0) {
Emit::inv_primitive(print_interp);

View file

@ -159,24 +159,28 @@ value for each possible word size.
=
inter_name *VirtualMachines::emit_fundamental_constant(int id, inter_t val) {
inter_name *iname = Hierarchy::find(id);
Hierarchy::make_available(iname);
Emit::named_numeric_constant(iname, val);
return iname;
}
inter_name *VirtualMachines::emit_signed_fundamental_constant(int id, int val) {
inter_name *iname = Hierarchy::find(id);
Hierarchy::make_available(iname);
Emit::named_numeric_constant_signed(iname, val);
return iname;
}
inter_name *VirtualMachines::emit_hex_fundamental_constant(int id, inter_t val) {
inter_name *iname = Hierarchy::find(id);
Hierarchy::make_available(iname);
Emit::named_numeric_constant_hex(iname, val);
return iname;
}
inter_name *VirtualMachines::emit_unchecked_hex_fundamental_constant(int id, inter_t val) {
inter_name *iname = Hierarchy::find(id);
Hierarchy::make_available(iname);
Emit::named_unchecked_constant_hex(iname, val);
return iname;
}

View file

@ -124,7 +124,7 @@ inter_symbol *Emit::extern(text_stream *name, kind *K) {
return symb;
}
}
inter_symbol *symb = Inter::Connectors::plug(Emit::tree(), name, name);
inter_symbol *symb = Inter::Connectors::plug(Emit::tree(), name);
Dictionaries::create(extern_symbols, name);
Dictionaries::write_value(extern_symbols, name, symb);
return symb;

View file

@ -1079,6 +1079,7 @@ void Hierarchy::establish(void) {
@e DEBUG_RULES_HL
@e DEBUG_SCENES_HL
@e DECIMALNUMBER_HL
@e DEFAULTTOPIC_HL
@e DEFERRED_CALLING_LIST_HL
@e DETECTPLURALWORD_HL
@e DIGITTOVALUE_HL
@ -1320,6 +1321,7 @@ void Hierarchy::establish(void) {
HierarchyLocations::con(DEBUG_RULES_HL, I"debug_rules", Translation::same(), template);
HierarchyLocations::con(DEBUG_SCENES_HL, I"debug_scenes", Translation::same(), template);
HierarchyLocations::con(DECIMALNUMBER_HL, I"DecimalNumber", Translation::same(), template);
HierarchyLocations::con(DEFAULTTOPIC_HL, I"DefaultTopic", Translation::same(), template);
HierarchyLocations::con(DEFERRED_CALLING_LIST_HL, I"deferred_calling_list", Translation::same(), template);
HierarchyLocations::con(DETECTPLURALWORD_HL, I"DetectPluralWord", Translation::same(), template);
HierarchyLocations::con(DIGITTOVALUE_HL, I"DigitToValue", Translation::same(), template);

View file

@ -851,6 +851,7 @@ inter_name *TTF_iname = NULL;
inter_name *Relations::compile_defined_relation_constant(int id, inter_t val) {
inter_name *iname = Hierarchy::find(id);
Hierarchy::make_available(iname);
Emit::named_numeric_constant_hex(iname, val);
return iname;
}

View file

@ -52,6 +52,7 @@ void PL::Score::compile_max_score(void) {
}
}
inter_name *iname = Hierarchy::find(INITIAL_MAX_SCORE_HL);
Hierarchy::make_available(iname);
if (NonlocalVariables::has_initial_value_set(max_score_VAR)) {
inter_t v1 = 0, v2 = 0;
NonlocalVariables::seek_initial_value(iname, &v1, &v2, max_score_VAR);

View file

@ -10,11 +10,11 @@ package main _plain
symbol public misc K_func
symbol public misc awkward
symbol public misc troublesome
symbol external misc secret --> /main/connectors/secret
symbol external misc secret --> /main/connectors/plug_00002
kind K_number int32
kind K_func function K_number -> K_number
# Exported my_fn here
constant awkward K_number = secret
constant awkward K_number = plug_00002
constant troublesome K_number = 12
package connectors _linkage
symbol plug misc secret --? /main/my_fn/secret
symbol plug misc plug_00002 --? /main/my_fn/secret

View file

@ -175,16 +175,16 @@ package main _plain
symbol private misc x
symbol private label .begin
symbol external misc K_number --> /main/K_number
symbol external misc troublesome --> /main/connectors/troublesome
symbol external misc troublesome --> /main/connectors/plug_00001
local x K_number __call_parameter
code
.begin
inv !if
val K_number troublesome
val K_number plug_00001
code
inv !goto
lab .begin
constant R_101 K_func = R_101_B
constant secret K_number = 7
package connectors _linkage
symbol plug misc troublesome --? /main/troublesome
symbol plug misc plug_00001 --? /main/troublesome

View file

@ -1,5 +1,6 @@
packagetype _plain
packagetype _code
packagetype _linkage
packagetype _function
packagetype _module
packagetype _submodule

View file

@ -1,5 +1,6 @@
packagetype _plain
packagetype _code
packagetype _linkage
package main _plain
package resources _plain

View file

@ -1,5 +1,6 @@
packagetype _plain
packagetype _code
packagetype _linkage
packagetype _function
packagetype _module
packagetype _submodule
@ -129,3 +130,23 @@ package main _plain
symbol public misc density
symbol external misc K_unchecked --> /main/other/K_unchecked
property density K_unchecked __assimilated=1
package connectors _linkage
symbol socket misc Falsity --> /main/template/functions/Falsity_fn/Falsity
symbol socket misc Demo --> /main/template/functions/Demo_fn/Demo
symbol socket misc Banana --> /main/template/functions/Banana_fn/Banana
symbol socket misc Peach --> /main/template/functions/Peach_fn/Peach
symbol socket misc marmorial --> /main/template/properties/marmorial_prop/marmorial
symbol socket misc P_marmorial --> /main/template/properties/marmorial_prop/marmorial
symbol socket misc density --> /main/template/properties/density_prop/density
symbol socket misc DEBUG --> /main/template/constants/DEBUG_con/DEBUG
symbol socket misc Badger --> /main/template/constants/Badger_con/Badger
symbol socket misc XA --> /main/template/arrays/XA_arr/XA
symbol socket misc XB --> /main/template/arrays/XB_arr/XB
symbol socket misc XC --> /main/template/arrays/XC_arr/XC
symbol socket misc XD --> /main/template/arrays/XD_arr/XD
symbol socket misc XE --> /main/template/arrays/XE_arr/XE
symbol socket misc XF --> /main/template/arrays/XF_arr/XF
symbol socket misc Bodger --> /main/template/constants/Bodger_con/Bodger
symbol socket misc Budger --> /main/template/constants/Budger_con/Budger
symbol socket misc Bydger --> /main/template/constants/Bydger_con/Bydger
symbol socket misc nitwit --> /main/template/variables/nitwit_var/nitwit

View file

@ -20,7 +20,6 @@ int CodeGen::Assimilate::run_pipeline_stage(pipeline_step *step) {
no_assimilated_actions = 0;
no_assimilated_commands = 0;
no_assimilated_arrays = 0;
CodeGen::MergeTemplate::ensure_search_list(I);
Inter::Tree::traverse(I, CodeGen::Assimilate::visitor1, NULL, NULL, SPLAT_IST);
Inter::Tree::traverse(I, CodeGen::Assimilate::visitor2, NULL, NULL, SPLAT_IST);
CodeGen::Assimilate::function_bodies();
@ -96,10 +95,8 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
@<Parse text of splat for identifier and value@>;
if ((proceed) && (unchecked_kind_symbol)) {
if (plm == DEFAULT_PLM) {
inter_symbol *symbol = CodeGen::MergeTemplate::find_name(I, identifier);
if (symbol == NULL) plm = CONSTANT_PLM;
}
if ((plm == DEFAULT_PLM) && (Inter::Connectors::find_socket(I, identifier) == NULL))
plm = CONSTANT_PLM;
if (plm != DEFAULT_PLM) @<Act on parsed constant definition@>;
Inter::Tree::remove_node(P);
}
@ -173,7 +170,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
}
inter_symbol *con_name = CodeGen::Assimilate::maybe_extern(I, identifier, Inter::Bookmarks::scope(IBM));
inter_symbol *con_name = CodeGen::Assimilate::make_socketed_symbol(I, identifier, Inter::Bookmarks::scope(IBM));
Inter::Symbols::annotate_i(con_name, ASSIMILATED_IANN, 1);
if (plm == FAKEACTION_PLM)
Inter::Symbols::annotate_i(con_name, FAKE_ACTION_IANN, 1);
@ -197,7 +194,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), con_name),
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), unchecked_kind_symbol), v1, v2,
(inter_t) Inter::Bookmarks::baseline(IBM) + 1, NULL));
CodeGen::Assimilate::install_alias(con_name, identifier);
CodeGen::Assimilate::install_socket(I, con_name, identifier);
break;
}
case GLOBAL_PLM:
@ -206,7 +203,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), con_name),
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), unchecked_kind_symbol), v1, v2,
(inter_t) Inter::Bookmarks::baseline(IBM) + 1, NULL));
CodeGen::Assimilate::install_alias(con_name, identifier);
CodeGen::Assimilate::install_socket(I, con_name, identifier);
break;
case ATTRIBUTE_PLM: {
TEMPORARY_TEXT(A);
@ -233,10 +230,10 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
Inter::SymbolsTables::equate(alias_symbol, attr_symbol);
}
}
CodeGen::Assimilate::install_alias(attr_symbol, A);
CodeGen::Assimilate::install_alias(attr_symbol, con_name->symbol_name);
CodeGen::Assimilate::install_socket(I, attr_symbol, A);
CodeGen::Assimilate::install_socket(I, attr_symbol, con_name->symbol_name);
if (Str::ne(attr_symbol->symbol_name, Inter::Symbols::get_translate(attr_symbol)))
CodeGen::Assimilate::install_alias(attr_symbol, Inter::Symbols::get_translate(attr_symbol));
CodeGen::Assimilate::install_socket(I, attr_symbol, Inter::Symbols::get_translate(attr_symbol));
DISCARD_TEXT(A);
break;
}
@ -245,7 +242,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), con_name),
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), unchecked_kind_symbol),
(inter_t) Inter::Bookmarks::baseline(IBM) + 1, NULL));
CodeGen::Assimilate::install_alias(con_name, identifier);
CodeGen::Assimilate::install_socket(I, con_name, identifier);
break;
}
case VERB_PLM:
@ -324,7 +321,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
Inter::Bookmarks::insert(IBM, array_in_progress);
if (plm == ARRAY_PLM) {
CodeGen::Assimilate::install_alias(con_name, identifier);
CodeGen::Assimilate::install_socket(I, con_name, identifier);
}
break;
@ -429,7 +426,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
*IBM = inner_save;
inter_symbol *rsymb = CodeGen::Assimilate::maybe_extern(I, identifier, Inter::Bookmarks::scope(IBM));
inter_symbol *rsymb = CodeGen::Assimilate::make_socketed_symbol(I, identifier, Inter::Bookmarks::scope(IBM));
Inter::Symbols::annotate_i(rsymb, ASSIMILATED_IANN, 1);
CodeGen::MergeTemplate::guard(Inter::Constant::new_function(IBM,
Inter::SymbolsTables::id_from_symbol(I, FP, rsymb),
@ -439,11 +436,7 @@ void CodeGen::Assimilate::visitor3(inter_tree *I, inter_tree_node *P, void *stat
*IBM = outer_save;
inter_bookmark T_IBM = Inter::Bookmarks::after_this_node(I, P);
inter_symbol *alias_name = Inter::SymbolsTables::create_with_unique_name(Inter::Bookmarks::scope(&T_IBM), identifier);
Inter::SymbolsTables::equate(alias_name, rsymb);
Inter::Symbols::set_flag(alias_name, ALIAS_ONLY_BIT);
CodeGen::Assimilate::install_socket(I, rsymb, rsymb->symbol_name);
Inter::Tree::remove_node(P);
@ =
@ -454,71 +447,20 @@ inter_package *CodeGen::Assimilate::new_package_named(inter_bookmark *IBM, text_
return P;
}
void CodeGen::Assimilate::install_alias(inter_symbol *con_name, text_stream *aka_text) {
if (template_package) {
inter_symbol *existing = Inter::SymbolsTables::symbol_from_name_not_equating(
Inter::Packages::scope(template_package), aka_text);
if (existing) {
if (Inter::Symbols::is_defined(existing)) {
inter_tree_node *Q = Inter::Symbols::definition(existing);
if (Q == NULL) internal_error("undefined");
Inter::Symbols::undefine(existing);
Inter::Tree::remove_node(Q);
if (trace_AME) LOG("AME: removing previous definition of $3\n", existing);
}
if (trace_AME) LOG("AME extra alias $3 = $3\n", existing, con_name);
Inter::SymbolsTables::equate(existing, con_name);
Inter::Symbols::set_flag(existing, ALIAS_ONLY_BIT);
return;
}
inter_symbol *alias_name =
Inter::SymbolsTables::create_with_unique_name(
Inter::Packages::scope(template_package), aka_text);
if (trace_AME) LOG("AME extra alias $3 = $3\n", alias_name, con_name);
Inter::SymbolsTables::equate(alias_name, con_name);
Inter::Symbols::set_flag(alias_name, ALIAS_ONLY_BIT);
}
void CodeGen::Assimilate::install_socket(inter_tree *I, inter_symbol *con_name, text_stream *aka_text) {
inter_symbol *socket = Inter::Connectors::find_socket(I, aka_text);
if (socket == NULL) Inter::Connectors::socket(I, aka_text, con_name);
}
@ =
inter_symbol *CodeGen::Assimilate::maybe_extern(inter_tree *I, text_stream *identifier, inter_symbols_table *into_scope) {
inter_symbol *existing = NULL;
if (Inter::Tree::connectors_package(I))
existing = Inter::SymbolsTables::symbol_from_name_not_equating(Inter::Packages::scope(Inter::Tree::connectors_package(I)), identifier);
if ((existing == NULL) && (Inter::Tree::main_package(I))) {
inter_symbol *hmm = Inter::SymbolsTables::symbol_from_name_not_equating(Inter::Packages::scope(Inter::Tree::main_package(I)), identifier);
if (hmm) {
LOG("Still relying upon $3\n", hmm);
existing = hmm;
}
}
if (existing == NULL) {
inter_symbol *new_symbol = Inter::SymbolsTables::create_with_unique_name(into_scope, identifier);
if (trace_AME) LOG("AME %S: unknown, so creating $3\n", identifier, new_symbol);
return new_symbol;
}
if (existing->owning_table == into_scope) internal_error("already in this scope");
if (Inter::Symbols::is_defined(existing)) {
inter_tree_node *Q = Inter::Symbols::definition(existing);
if (Q == NULL) internal_error("undefined");
Inter::Symbols::undefine(existing);
Inter::Tree::remove_node(Q);
if (trace_AME) LOG("AME %S: removing previous definition of $3\n", identifier, existing);
}
inter_symbol *CodeGen::Assimilate::make_socketed_symbol(inter_tree *I, text_stream *identifier, inter_symbols_table *into_scope) {
inter_symbol *new_symbol = Inter::SymbolsTables::create_with_unique_name(into_scope, identifier);
Inter::SymbolsTables::equate(existing, new_symbol);
if (trace_AME) LOG("AME %S: equating $3 to $3\n", identifier, existing, new_symbol);
CodeGen::Assimilate::install_socket(I, new_symbol, identifier);
return new_symbol;
}
@ =
void CodeGen::Assimilate::ensure_action(inter_tree *I, inter_tree_node *P, text_stream *value) {
if (CodeGen::MergeTemplate::find_name(I, value) == NULL) {
if (Inter::Connectors::find_socket(I, value) == NULL) {
inter_bookmark IBM_d = CodeGen::Assimilate::template_submodule(I, I"actions", P);
inter_bookmark *IBM = &IBM_d;
inter_symbol *ptype = action_ptype_symbol;
@ -527,12 +469,12 @@ void CodeGen::Assimilate::ensure_action(inter_tree *I, inter_tree_node *P, text_
WRITE_TO(an, "assim_action_%d", ++no_assimilated_actions);
Inter::Bookmarks::set_current_package(IBM, CodeGen::Assimilate::new_package_named(IBM, an, ptype));
DISCARD_TEXT(an);
inter_symbol *asymb = CodeGen::Assimilate::maybe_extern(I, value, Inter::Bookmarks::scope(IBM));
inter_symbol *asymb = CodeGen::Assimilate::make_socketed_symbol(I, value, Inter::Bookmarks::scope(IBM));
TEMPORARY_TEXT(unsharped);
WRITE_TO(unsharped, "%SSub", value);
Str::delete_first_character(unsharped);
Str::delete_first_character(unsharped);
inter_symbol *txsymb = CodeGen::MergeTemplate::find_name(I, unsharped);
inter_symbol *txsymb = Inter::Connectors::find_socket(I, unsharped);
inter_symbol *xsymb = Inter::SymbolsTables::create_with_unique_name(Inter::Bookmarks::scope(IBM), unsharped);
if (txsymb) Inter::SymbolsTables::equate(xsymb, txsymb);
DISCARD_TEXT(unsharped);
@ -541,7 +483,6 @@ void CodeGen::Assimilate::ensure_action(inter_tree *I, inter_tree_node *P, text_
Inter::SymbolsTables::id_from_symbol(I, Inter::Bookmarks::package(IBM), action_kind_symbol),
LITERAL_IVAL, 10000, (inter_t) Inter::Bookmarks::baseline(IBM) + 1, NULL));
Inter::Symbols::annotate_i(asymb, ACTION_IANN, 1);
CodeGen::MergeTemplate::build_r(Inter::Bookmarks::package(IBM));
}
}
@ -637,7 +578,7 @@ void CodeGen::Assimilate::value(inter_tree *I, inter_package *pack, inter_bookma
}
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, S, L"scope=(%i+)")) {
inter_symbol *symb = CodeGen::MergeTemplate::find_name(I, mr.exp[0]);
inter_symbol *symb = Inter::Connectors::find_socket(I, mr.exp[0]);
while ((symb) && (symb->equated_to)) symb = symb->equated_to;
if (symb) {
if (Inter::Symbols::read_annotation(symb, SCOPE_FILTER_IANN) != 1)
@ -646,7 +587,7 @@ void CodeGen::Assimilate::value(inter_tree *I, inter_package *pack, inter_bookma
}
}
if (Regexp::match(&mr, S, L"noun=(%i+)")) {
inter_symbol *symb = CodeGen::MergeTemplate::find_name(I, mr.exp[0]);
inter_symbol *symb = Inter::Connectors::find_socket(I, mr.exp[0]);
while ((symb) && (symb->equated_to)) symb = symb->equated_to;
if (symb) {
if (Inter::Symbols::read_annotation(symb, NOUN_FILTER_IANN) != 1)
@ -656,7 +597,7 @@ void CodeGen::Assimilate::value(inter_tree *I, inter_package *pack, inter_bookma
}
}
inter_symbol *symb = CodeGen::MergeTemplate::find_name(I, S);
inter_symbol *symb = Inter::Connectors::find_socket(I, S);
if (symb) {
Inter::Symbols::to_data(I, pack, symb, val1, val2); return;
}
@ -724,10 +665,9 @@ inter_symbol *CodeGen::Assimilate::compute_constant_eval(inter_tree *I, inter_pa
inter_t v1 = UNDEF_IVAL, v2 = 0;
switch (t->ist_type) {
case IDENTIFIER_ISTT: {
inter_symbol *symb = CodeGen::MergeTemplate::find_name(I, t->material);
inter_symbol *symb = Inter::Connectors::find_socket(I, t->material);
if (symb) return symb;
LOG("Failed to identify %S\n", t->material);
break;
return Inter::Connectors::plug(I, t->material);
}
case NUMBER_ISTT:
case BIN_NUMBER_ISTT:

View file

@ -82,8 +82,7 @@ void CodeGen::Eliminate::require(inter_package *pack, inter_package *witness, te
inter_symbols_table *tab = Inter::Packages::scope(pack);
for (int i=0; i<tab->size; i++) {
inter_symbol *symb = tab->symbol_array[i];
if ((symb) && (symb->equated_to) &&
(Inter::Symbols::get_flag(symb, ALIAS_ONLY_BIT) == FALSE)) {
if ((symb) && (symb->equated_to)) {
inter_symbol *to = symb;
while ((to) && (to->equated_to)) to = to->equated_to;
inter_package *needed = to->owning_table->owning_package;

View file

@ -18,24 +18,6 @@ int CodeGen::MergeTemplate::run_pipeline_stage(pipeline_step *step) {
return TRUE;
}
inter_symbols_table *link_search_list[10];
int link_search_list_len = 0;
void CodeGen::MergeTemplate::ensure_search_list(inter_tree *I) {
if (link_search_list_len == 0) {
if (template_package) {
link_search_list[2] = Inter::Packages::scope(Inter::Tree::main_package(I));
link_search_list[1] = Inter::Packages::scope(Inter::Tree::connectors_package(I));
link_search_list[0] = Inter::Packages::scope(template_package);
link_search_list_len = 3;
} else {
link_search_list[1] = Inter::Packages::scope(Inter::Tree::main_package(I));
link_search_list[0] = Inter::Packages::scope(Inter::Tree::connectors_package(I));
link_search_list_len = 2;
}
}
}
void CodeGen::MergeTemplate::link(inter_bookmark *IBM, text_stream *template_file, int N, pathname **PP, inter_package *owner) {
if (IBM == NULL) internal_error("no inter to link with");
inter_tree *I = Inter::Bookmarks::tree(IBM);
@ -43,8 +25,6 @@ void CodeGen::MergeTemplate::link(inter_bookmark *IBM, text_stream *template_fil
if (template_package == NULL) internal_error("unable to find template");
CodeGen::MergeTemplate::ensure_search_list(I);
inter_bookmark link_bookmark =
Inter::Bookmarks::at_end_of_this_package(template_package);
@ -69,74 +49,6 @@ void CodeGen::MergeTemplate::visitor(inter_tree *I, inter_tree_node *P, void *st
}
}
dictionary *linkable_namespace = NULL;
int linkable_namespace_created = FALSE;
inter_symbol *CodeGen::MergeTemplate::find_in_namespace(inter_tree *I, text_stream *name) {
if (linkable_namespace_created == FALSE) {
linkable_namespace_created = TRUE;
linkable_namespace = Dictionaries::new(512, FALSE);
inter_package *main_package = Inter::Tree::main_package(I);
if (main_package) {
inter_tree_node *D = Inter::Packages::definition(main_package);
LOOP_THROUGH_INTER_CHILDREN(C, D) {
if (C->W.data[ID_IFLD] == PACKAGE_IST) {
inter_package *P = Inter::Package::defined_by_frame(C);
if (Str::ne(Inter::Packages::name(P), I"template"))
CodeGen::MergeTemplate::build_r(P);
}
}
}
}
if (Dictionaries::find(linkable_namespace, name))
return (inter_symbol *) Dictionaries::read_value(linkable_namespace, name);
return NULL;
}
void CodeGen::MergeTemplate::build_r(inter_package *P) {
CodeGen::MergeTemplate::build_only(P);
inter_tree_node *D = Inter::Packages::definition(P);
LOOP_THROUGH_INTER_CHILDREN(C, D) {
if (C->W.data[ID_IFLD] == PACKAGE_IST) {
inter_package *Q = Inter::Package::defined_by_frame(C);
CodeGen::MergeTemplate::build_r(Q);
}
}
}
void CodeGen::MergeTemplate::build_only(inter_package *P) {
inter_symbols_table *T = Inter::Packages::scope(P);
if (T) {
for (int i=0; i<T->size; i++) {
inter_symbol *S = T->symbol_array[i];
if ((Inter::Symbols::is_defined(S)) && (S->equated_to == NULL) &&
(Inter::Symbols::get_flag(S, MAKE_NAME_UNIQUE) == FALSE)) {
text_stream *name = S->symbol_name;
if (Str::len(S->translate_text) > 0) name = S->translate_text;
Dictionaries::create(linkable_namespace, name);
Dictionaries::write_value(linkable_namespace, name, (void *) S);
}
}
}
}
inter_symbol *CodeGen::MergeTemplate::find_name(inter_tree *I, text_stream *S) {
for (int i=0; i<link_search_list_len; i++) {
if (link_search_list[i]) {
inter_symbol *symb = Inter::SymbolsTables::symbol_from_name_not_equating(link_search_list[i], S);
if (symb) return symb;
}
}
return CodeGen::MergeTemplate::find_in_namespace(I, S);
}
void CodeGen::MergeTemplate::log_search_path(void) {
for (int i=0; i<link_search_list_len; i++) {
LOG("Search %d: $4\n", i, link_search_list[i]);
}
}
int link_pie_count = 0;
void CodeGen::MergeTemplate::guard(inter_error_message *ERR) {

View file

@ -9,60 +9,41 @@ void CodeGen::Externals::create_pipeline_stage(void) {
CodeGen::Stage::new(I"resolve-external-symbols", CodeGen::Externals::run_pipeline_stage, NO_STAGE_ARG, FALSE);
}
int resolution_failed = FALSE;
int CodeGen::Externals::run_pipeline_stage(pipeline_step *step) {
inter_package *P = Inter::Tree::main_package(step->repository);
if (P) {
resolution_failed = FALSE;
Inter::Tree::traverse(step->repository, CodeGen::Externals::visitor, NULL, NULL, 0);
LOGIF(EXTERNAL_SYMBOL_RESOLUTION, "\n\n");
inter_symbols_table *ST = Inter::Packages::scope(P);
for (int i=0; i<ST->size; i++) {
inter_symbol *S = ST->symbol_array[i];
if ((S) && (S->equated_to)) {
LOGIF(EXTERNAL_SYMBOL_RESOLUTION, "Removing $3 as a main indirection intermediate\n", S);
ST->symbol_array[i] = NULL;
} else if ((S) && (Inter::Symbols::get_flag(S, EXTERN_TARGET_BIT) == FALSE) && (!Inter::Symbols::is_defined(S))) {
LOGIF(EXTERNAL_SYMBOL_RESOLUTION, "Removing $3 as undefined and not an extern target\n", S);
ST->symbol_array[i] = NULL;
}
}
if (template_package) {
inter_symbols_table *ST = Inter::Packages::scope(template_package);
for (int i=0; i<ST->size; i++) {
inter_symbol *S = ST->symbol_array[i];
if ((S) && (S->equated_to) && (Inter::Symbols::get_flag(S, ALIAS_ONLY_BIT))) {
LOGIF(EXTERNAL_SYMBOL_RESOLUTION, "Removing $3 as a template alias\n", S);
ST->symbol_array[i] = NULL;
}
}
}
if (resolution_failed) internal_error("undefined external link(s)");
}
Inter::Connectors::stecker(step->repository);
int resolution_failed = FALSE;
Inter::Tree::traverse(step->repository, CodeGen::Externals::visitor, &resolution_failed, NULL, PACKAGE_IST);
if (resolution_failed) internal_error("undefined external link(s)");
return TRUE;
}
@h The whole shebang.
=
void CodeGen::Externals::visitor(inter_tree *I, inter_tree_node *P, void *state) {
if (P->W.data[ID_IFLD] == PACKAGE_IST) {
inter_package *Q = Inter::Package::defined_by_frame(P);
if (Inter::Tree::main_package(I) == Q) return;
if (Inter::Tree::connectors_package(I) == Q) return;
inter_symbols_table *ST = Inter::Packages::scope(Q);
for (int i=0; i<ST->size; i++) {
inter_symbol *S = ST->symbol_array[i];
if ((S) && (S->equated_to)) {
inter_symbol *D = S;
while ((D) && (D->equated_to)) D = D->equated_to;
S->equated_to = D;
Inter::Symbols::set_flag(D, EXTERN_TARGET_BIT);
if (!Inter::Symbols::is_defined(D)) {
LOG("In package $6:\n", Q);
int *fail_flag = (int *) state;
inter_package *Q = Inter::Package::defined_by_frame(P);
if (Inter::Tree::connectors_package(I) == Q) return;
inter_symbols_table *ST = Inter::Packages::scope(Q);
for (int i=0; i<ST->size; i++) {
inter_symbol *S = ST->symbol_array[i];
if ((S) && (S->equated_to)) {
inter_symbol *D = S;
while ((D) && (D->equated_to)) D = D->equated_to;
S->equated_to = D;
if (!Inter::Symbols::is_defined(D)) {
inter_symbol *socket = Inter::Connectors::find_socket(I, D->symbol_name);
if (socket) {
D = socket->equated_to;
S->equated_to = D;
}
}
if (!Inter::Symbols::is_defined(D)) {
if (Inter::Symbols::get_scope(D) == PLUG_ISYMS) {
LOG("$3 == $3 which is a loose plug, seeking %S\n", S, D, D->equated_name);
WRITE_TO(STDERR, "Failed to connect plug to: %S\n", D->equated_name);
if (fail_flag) *fail_flag = TRUE;
} else {
LOG("$3 == $3 which is undefined\n", S, D);
WRITE_TO(STDERR, "Failed to resolve symbol: %S\n", D->symbol_name);
resolution_failed = TRUE;
if (fail_flag) *fail_flag = TRUE;
}
}
}

View file

@ -3,12 +3,16 @@
To manage link symbols.
@ =
inter_symbol *Inter::Connectors::plug(inter_tree *I, text_stream *plug_name, text_stream *wanted) {
int unique_plug_number = 1;
inter_symbol *Inter::Connectors::plug(inter_tree *I, text_stream *wanted) {
inter_package *connectors = Inter::Connectors::connectors_package(I);
TEMPORARY_TEXT(PN)
WRITE_TO(PN, "plug_%05d", unique_plug_number++);
inter_symbol *plug = Inter::SymbolsTables::create_with_unique_name(
Inter::Packages::scope(connectors), plug_name);
Inter::Packages::scope(connectors), PN);
DISCARD_TEXT(PN);
Inter::SymbolsTables::make_plug(plug, wanted);
LOG("Plug I%d: %S\n", I->allocation_id, plug_name);
LOG("Plug I%d: $3 seeking %S\n", I->allocation_id, plug, plug->equated_name);
return plug;
}
@ -17,7 +21,7 @@ inter_symbol *Inter::Connectors::socket(inter_tree *I, text_stream *socket_name,
inter_symbol *socket = Inter::SymbolsTables::create_with_unique_name(
Inter::Packages::scope(connectors), socket_name);
Inter::SymbolsTables::make_socket(socket, wired_from);
LOG("Socket I%d: %S (== $3)\n", I->allocation_id, socket_name, socket);
LOG("Socket I%d: $3 wired to $3\n", I->allocation_id, socket, wired_from);
return socket;
}
@ -41,3 +45,47 @@ inter_package *Inter::Connectors::connectors_package(inter_tree *I) {
}
return connectors;
}
inter_symbol *Inter::Connectors::find_socket(inter_tree *I, text_stream *identifier) {
inter_package *connectors = Inter::Tree::connectors_package(I);
if (connectors) {
inter_symbol *S = Inter::SymbolsTables::symbol_from_name_not_equating(
Inter::Packages::scope(Inter::Tree::connectors_package(I)), identifier);
if ((S) && (Inter::Symbols::get_scope(S) == SOCKET_ISYMS)) return S;
}
return NULL;
}
inter_symbol *Inter::Connectors::find_plug(inter_tree *I, text_stream *identifier) {
inter_package *connectors = Inter::Tree::connectors_package(I);
if (connectors) {
inter_symbol *S = Inter::SymbolsTables::symbol_from_name_not_equating(
Inter::Packages::scope(Inter::Tree::connectors_package(I)), identifier);
if ((S) && (Inter::Symbols::get_scope(S) == PLUG_ISYMS)) return S;
}
return NULL;
}
void Inter::Connectors::wire_plug(inter_symbol *plug, inter_symbol *to) {
if (plug == NULL) internal_error("no plug");
LOG("Plug $3 wired to $3\n", plug, to);
Inter::SymbolsTables::equate(plug, to);
}
void Inter::Connectors::stecker(inter_tree *I) {
inter_package *Q = Inter::Tree::connectors_package(I);
if (Q == NULL) return;
inter_symbols_table *ST = Inter::Packages::scope(Q);
for (int i=0; i<ST->size; i++) {
inter_symbol *plug = ST->symbol_array[i];
if ((plug) && (Inter::Symbols::get_scope(plug) == PLUG_ISYMS) && (plug->equated_to == NULL)) {
inter_symbol *socket = Inter::Connectors::find_socket(I, plug->equated_name);
if (socket) {
Inter::Connectors::wire_plug(plug, socket);
LOG("Wired plug $3 to $3\n", plug, socket);
} else {
LOG("Loose plug: $3 (seeking %S)\n", plug, plug->equated_name);
}
}
}
}

View file

@ -142,7 +142,7 @@ void Inter::Transmigration::correct_migrant(inter_tree *I, inter_tree_node *P, v
Inter::SymbolsTables::symbol_to_url_name(URL, target);
equivalent = Inter::SymbolsTables::url_name_to_symbol(ipct->destination->package_head->tree, NULL, URL);
if (equivalent == NULL)
equivalent = Inter::Connectors::plug(ipct->destination_tree, target->symbol_name, URL);
equivalent = Inter::Connectors::plug(ipct->destination_tree, URL);
DISCARD_TEXT(URL);
Inter::Transmigration::cache(target, equivalent);
}
@ -184,7 +184,7 @@ void Inter::Transmigration::correct_origin(inter_tree *I, inter_tree_node *P, vo
if (equivalent == NULL) {
TEMPORARY_TEXT(URL);
Inter::SymbolsTables::symbol_to_url_name(URL, target);
equivalent = Inter::Connectors::plug(ipct->origin_tree, target->symbol_name, URL);
equivalent = Inter::Connectors::plug(ipct->origin_tree, URL);
DISCARD_TEXT(URL);
Inter::Transmigration::cache(target, equivalent);
}

View file

@ -65,10 +65,8 @@ symbol.
@d VPH_MARK_BIT 0x00000080
@d USED_MARK_BIT 0x00000100
@d MAKE_NAME_UNIQUE 0x00000200
@d EXTERN_TARGET_BIT 0x00000400
@d ALIAS_ONLY_BIT 0x00000800
@d NONTRANSIENT_SYMBOL_BITS (MAKE_NAME_UNIQUE + ALIAS_ONLY_BIT + SYMBOL_TYPE_MASK_ISYMT + SYMBOL_SCOPE_MASK_ISYMT)
@d NONTRANSIENT_SYMBOL_BITS (MAKE_NAME_UNIQUE + SYMBOL_TYPE_MASK_ISYMT + SYMBOL_SCOPE_MASK_ISYMT)
@ =
void Inter::Canon::declare(void) {

View file

@ -9,8 +9,8 @@ inter_error_message *Inter::Verify::defn(inter_package *owner, inter_tree_node *
inter_symbol *S = Inter::SymbolsTables::unequated_symbol_from_id(T, P->W.data[index]);
if (S == NULL) return Inter::Node::error(P, I"no symbol for ID (case 1)", NULL);
if (S->equated_to) {
LOG("This is $6 but %S equates to a symbol in $6\n",
Inter::Packages::container(P), S->symbol_name, Inter::Packages::container(S->equated_to->definition));
LOG("This is $6 but $3 equates to $3 in $6\n",
Inter::Packages::container(P), S, S->equated_to, Inter::Packages::container(S->equated_to->definition));
return Inter::Node::error(P, I"symbol defined outside its native scope", S->symbol_name);
}
inter_tree_node *D = Inter::Symbols::definition(S);