mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 08:34:22 +03:00
Assimilating with asynchronous plugs and sockets
This commit is contained in:
parent
006b55b04d
commit
5e9658cb27
|
@ -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">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>, <a href="#SP5">§5</a>.</p>
|
||||
<p class="endnote">The function CodeGen::Assimilate::template_submodule is used in <a href="#SP2_1_2">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>, <a href="#SP4">§4</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Assimilate::visitor1 is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
|
@ -134,10 +133,8 @@
|
|||
|
||||
<<span class="cwebmacro">Parse text of splat for identifier and value</span> <span class="cwebmacronumber">2.1.1</span>><span class="plain">;</span>
|
||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">proceed</span><span class="plain">) && (</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">) && (</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><<span class="cwebmacro">Act on parsed constant definition</span> <span class="cwebmacronumber">2.1.2</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>
|
||||
<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">-></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">-></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">-></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">(&</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">-></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">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>
|
||||
|
||||
<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="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="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::new_package_named is used in <a href="#SP2">§2</a>, <a href="#SP2_1_2">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>, <a href="#SP5">§5</a>.</p>
|
||||
<p class="endnote">The function CodeGen::Assimilate::new_package_named is used in <a href="#SP2">§2</a>, <a href="#SP2_1_2">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>, <a href="#SP4">§4</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Assimilate::install_alias is used in <a href="#SP2_1_2">§2.1.2</a>.</p>
|
||||
<p class="endnote">The function CodeGen::Assimilate::install_socket is used in <a href="#SP2_1_2">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>.</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::Assimilate::make_socketed_symbol is used in <a href="#SP2_1_2">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>, <a href="#SP4">§4</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">) && (</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">-></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="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="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">§2.1.2</a>, <a href="#SP2_2_2">§2.2.2</a>, <a href="#SP5">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </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"> = &</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">§2.1.2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">(&</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">) && (</span><span class="identifier">symb</span><span class="plain">-></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">-></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">(&</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">) && (</span><span class="identifier">symb</span><span class="plain">-></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">-></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">>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">>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">>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">>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">>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>
|
||||
|
|
|
@ -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"><</span><span class="identifier">tab</span><span class="plain">-></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">-></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">) && (</span><span class="identifier">symb</span><span class="plain">-></span><span class="identifier">equated_to</span><span class="plain">) &&</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">) && (</span><span class="identifier">symb</span><span class="plain">-></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">) && (</span><span class="identifier">to</span><span class="plain">-></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">-></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">-></span><span class="identifier">owning_table</span><span class="plain">-></span><span class="identifier">owning_package</span><span class="plain">;</span>
|
||||
|
|
|
@ -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">-></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">-></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"><</span><span class="identifier">T</span><span class="plain">-></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">-></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">)) && (</span><span class="identifier">S</span><span class="plain">-></span><span class="identifier">equated_to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) &&</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">-></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">-></span><span class="identifier">translate_text</span><span class="plain">) > 0) </span><span class="identifier">name</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-></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"><</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"><</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">§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">§5</a>), 2/alm (<a href="2-alm.html#SP2_1_2">§2.1.2</a>, <a href="2-alm.html#SP2_2_2">§2.2.2</a>, <a href="2-alm.html#SP3">§3</a>, <a href="2-alm.html#SP4">§4</a>, <a href="2-alm.html#SP5">§5</a>), 3/ip (<a href="3-ip.html#SP2">§2</a>), 3/tv (<a href="3-tv.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::MergeTemplate::build_r is used in 2/alm (<a href="2-alm.html#SP5">§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">§2.1</a>, <a href="2-alm.html#SP5">§5</a>, <a href="2-alm.html#SP6">§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">§5</a>), 2/alm (<a href="2-alm.html#SP2_1_2">§2.1.2</a>, <a href="2-alm.html#SP2_2_2">§2.2.2</a>, <a href="2-alm.html#SP3">§3</a>, <a href="2-alm.html#SP5">§5</a>, <a href="2-alm.html#SP6">§6</a>), 3/ip (<a href="3-ip.html#SP2">§2</a>), 3/tv (<a href="3-tv.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function CodeGen::MergeTemplate::entire_splat is used in <a href="#SP2">§2</a>, 2/alm (<a href="2-alm.html#SP6">§6</a>).</p>
|
||||
<p class="endnote">The function CodeGen::MergeTemplate::entire_splat is used in <a href="#SP2">§2</a>, 2/alm (<a href="2-alm.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<!--Weave of '2/res' generated by 7-->
|
||||
<ul class="crumbs"><li><a href="../webs.html">★</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">§1. Pipeline stage</a></li><li><a href="#SP2">§2. The whole shebang</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Pipeline stage</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>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="identifier">Inter::Connectors::stecker</span><span class="plain">(</span><span class="identifier">step</span><span class="plain">-</span><span class="element">>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">>repository</span><span class="plain">, </span><span class="functiontext">CodeGen::Externals::visitor</span><span class="plain">, &</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"><</span><span class="identifier">ST</span><span class="plain">-></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">-></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">) && (</span><span class="identifier">S</span><span class="plain">-></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">-></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">) && (</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">) && (!</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">-></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_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">) && (</span><span class="identifier">D</span><span class="plain">-></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">-></span><span class="identifier">equated_to</span><span class="plain">;</span>
|
||||
<span class="identifier">S</span><span class="plain">-></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">-></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">-></span><span class="identifier">equated_to</span><span class="plain">;</span>
|
||||
<span class="identifier">S</span><span class="plain">-></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="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"><</span><span class="identifier">ST</span><span class="plain">-></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">-></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">) && (</span><span class="identifier">S</span><span class="plain">-></span><span class="identifier">equated_to</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">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">-></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">-></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">-></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">-></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>§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">-></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"><</span><span class="identifier">ST</span><span class="plain">-></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">-></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">) && (</span><span class="identifier">S</span><span class="plain">-></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">) && (</span><span class="identifier">D</span><span class="plain">-></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">-></span><span class="identifier">equated_to</span><span class="plain">;</span>
|
||||
<span class="identifier">S</span><span class="plain">-></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">-></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">§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">
|
||||
|
|
|
@ -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">§4.6</a>), 2/alm (<a href="2-alm.html#SP6">§6</a>).</p>
|
||||
<p class="endnote">The function InterSchemas::log is used in 1/cm (<a href="1-cm.html#SP4_6">§4.6</a>), 2/alm (<a href="2-alm.html#SP5">§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">§18</a>, <a href="#SP19">§19</a>, 2/alm (<a href="2-alm.html#SP6">§6</a>).</p>
|
||||
<p class="endnote">The function InterSchemas::from_text is used in <a href="#SP18">§18</a>, <a href="#SP19">§19</a>, 2/alm (<a href="2-alm.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP20_1"></a><b>§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>.
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -100,7 +100,7 @@ no existence at the source text level — 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">>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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
@ -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>
|
||||
|
|
|
@ -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">§52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">§3.1</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 3/rst (<a href="3-rst.html#SP6">§6</a>), 4/am (<a href="4-am.html#SP26_1">§26.1</a>), 8/ef (<a href="8-ef.html#SP26">§26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">§3.2</a>), 10/varc (<a href="10-varc.html#SP14">§14</a>), 19/tb (<a href="19-tb.html#SP27">§27</a>, <a href="19-tb.html#SP27_1">§27.1</a>, <a href="19-tb.html#SP27_1_3">§27.1.3</a>, <a href="19-tb.html#SP29">§29</a>), 21/rl2 (<a href="21-rl2.html#SP23">§23</a>), 26/uo (<a href="26-uo.html#SP11_1">§11.1</a>), 27/hr (<a href="27-hr.html#SP5">§5</a>), 27/cm (<a href="27-cm.html#SP1">§1</a>), 1/ppl (<a href="1-ppl.html#SP5">§5</a>), 2/res (<a href="2-res.html#SP1">§1</a>), 4/fc (<a href="4-fc.html#SP1">§1</a>), 2/hf (<a href="2-hf.html#SP6">§6</a>).</p>
|
||||
<p class="endnote">The function main is used in 2/pt (<a href="2-pt.html#SP52">§52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">§3.1</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 3/rst (<a href="3-rst.html#SP6">§6</a>), 4/am (<a href="4-am.html#SP26_1">§26.1</a>), 8/ef (<a href="8-ef.html#SP26">§26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">§3.2</a>), 10/varc (<a href="10-varc.html#SP14">§14</a>), 19/tb (<a href="19-tb.html#SP27">§27</a>, <a href="19-tb.html#SP27_1">§27.1</a>, <a href="19-tb.html#SP27_1_3">§27.1.3</a>, <a href="19-tb.html#SP29">§29</a>), 21/rl2 (<a href="21-rl2.html#SP23">§23</a>), 26/uo (<a href="26-uo.html#SP11_1">§11.1</a>), 27/hr (<a href="27-hr.html#SP5">§5</a>), 27/cm (<a href="27-cm.html#SP1">§1</a>), 1/ppl (<a href="1-ppl.html#SP5">§5</a>), 4/fc (<a href="4-fc.html#SP1">§1</a>), 2/hf (<a href="2-hf.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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
|
||||
|
|
|
@ -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">, &</span><span class="identifier">v1</span><span class="plain">, &</span><span class="identifier">v2</span><span class="plain">, </span><span class="identifier">max_score_VAR</span><span class="plain">);</span>
|
||||
|
|
|
@ -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">§52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">§3.1</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 3/rst (<a href="3-rst.html#SP6">§6</a>), 4/am (<a href="4-am.html#SP26_1">§26.1</a>), 8/ef (<a href="8-ef.html#SP26">§26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">§3.2</a>), 10/varc (<a href="10-varc.html#SP14">§14</a>), 19/tb (<a href="19-tb.html#SP27">§27</a>, <a href="19-tb.html#SP27_1">§27.1</a>, <a href="19-tb.html#SP27_1_3">§27.1.3</a>, <a href="19-tb.html#SP29">§29</a>), 21/rl2 (<a href="21-rl2.html#SP23">§23</a>), 26/uo (<a href="26-uo.html#SP11_1">§11.1</a>), 27/hr (<a href="27-hr.html#SP5">§5</a>), 27/cm (<a href="27-cm.html#SP1">§1</a>), 1/ppl (<a href="1-ppl.html#SP5">§5</a>), 2/res (<a href="2-res.html#SP1">§1</a>), 4/fc (<a href="4-fc.html#SP1">§1</a>), 3/sm (<a href="3-sm.html#SP36">§36</a>, <a href="3-sm.html#SP36_1">§36.1</a>, <a href="3-sm.html#SP38">§38</a>), 3/em2 (<a href="3-em2.html#SP24">§24</a>), 4/ap (<a href="4-ap.html#SP2">§2</a>), 2/hf (<a href="2-hf.html#SP6">§6</a>).</p>
|
||||
<p class="endnote">The function main is used in 2/pt (<a href="2-pt.html#SP52">§52</a>), 2/pl2 (<a href="2-pl2.html#SP3_1">§3.1</a>), 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 3/rst (<a href="3-rst.html#SP6">§6</a>), 4/am (<a href="4-am.html#SP26_1">§26.1</a>), 8/ef (<a href="8-ef.html#SP26">§26</a>), 8/ed2 (<a href="8-ed2.html#SP3_2">§3.2</a>), 10/varc (<a href="10-varc.html#SP14">§14</a>), 19/tb (<a href="19-tb.html#SP27">§27</a>, <a href="19-tb.html#SP27_1">§27.1</a>, <a href="19-tb.html#SP27_1_3">§27.1.3</a>, <a href="19-tb.html#SP29">§29</a>), 21/rl2 (<a href="21-rl2.html#SP23">§23</a>), 26/uo (<a href="26-uo.html#SP11_1">§11.1</a>), 27/hr (<a href="27-hr.html#SP5">§5</a>), 27/cm (<a href="27-cm.html#SP1">§1</a>), 1/ppl (<a href="1-ppl.html#SP5">§5</a>), 4/fc (<a href="4-fc.html#SP1">§1</a>), 3/sm (<a href="3-sm.html#SP36">§36</a>, <a href="3-sm.html#SP36_1">§36.1</a>, <a href="3-sm.html#SP38">§38</a>), 3/em2 (<a href="3-em2.html#SP24">§24</a>), 4/ap (<a href="4-ap.html#SP2">§2</a>), 2/hf (<a href="2-hf.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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
|
||||
|
|
|
@ -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">-></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">-></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">>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">-></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">-></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">) && (</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">) && (</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"><</span><span class="identifier">ST</span><span class="plain">-</span><span class="element">>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">>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">) && (</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">) && (</span><span class="identifier">plug</span><span class="plain">-</span><span class="element">>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">>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">>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-->
|
||||
|
|
|
@ -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>§2. </b></p>
|
||||
|
||||
|
@ -225,7 +225,7 @@
|
|||
|
||||
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name is used in <a href="#SP5">§5</a>, <a href="#SP11">§11</a>, 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/trn (<a href="2-trn.html#SP3_1">§3.1</a>), 3/iitf (<a href="3-iitf.html#SP1">§1</a>), 3/idt (<a href="3-idt.html#SP3">§3</a>), 4/tpc (<a href="4-tpc.html#SP2">§2</a>), 4/tac (<a href="4-tac.html#SP2">§2</a>), 5/tlc (<a href="5-tlc.html#SP2">§2</a>), 5/tic (<a href="5-tic.html#SP2">§2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">§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">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::SymbolsTables::symbol_from_name_creating is used in <a href="#SP5">§5</a>, 2/trn (<a href="2-trn.html#SP3_1_1">§3.1.1</a>), 3/iitf (<a href="3-iitf.html#SP1">§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">§9</a>, 3/iibf (<a href="3-iibf.html#SP1_5">§1.5</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Inter::SymbolsTables::equate is used in <a href="#SP9">§9</a>, 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 3/iibf (<a href="3-iibf.html#SP1_5">§1.5</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::SymbolsTables::equate_textual is used in 4/tsc (<a href="4-tsc.html#SP1">§1</a>).</p>
|
||||
|
||||
|
|
|
@ -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>§2. </b></p>
|
||||
|
||||
|
@ -100,7 +100,7 @@
|
|||
|
||||
<p class="endnote">The function Inter::Symbols::get_type is used in <a href="#SP4">§4</a>, <a href="#SP5">§5</a>, 3/iibf (<a href="3-iibf.html#SP1_1_3_2">§1.1.3.2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::Symbols::get_scope is used in <a href="#SP4">§4</a>, <a href="#SP5">§5</a>, 2/st (<a href="2-st.html#SP10">§10</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">§1.4.2</a>, <a href="3-iibf.html#SP1_1_3_2">§1.1.3.2</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">§2</a>).</p>
|
||||
<p class="endnote">The function Inter::Symbols::get_scope is used in <a href="#SP4">§4</a>, <a href="#SP5">§5</a>, 2/st (<a href="2-st.html#SP10">§10</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">§1.4.2</a>, <a href="3-iibf.html#SP1_1_3_2">§1.1.3.2</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::Symbols::set_type is used in <a href="#SP5">§5</a>, 2/st (<a href="2-st.html#SP10">§10</a>), 3/iibf (<a href="3-iibf.html#SP1_4_2">§1.4.2</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>).</p>
|
||||
|
||||
|
|
|
@ -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">>destination</span><span class="plain">-</span><span class="element">>package_head</span><span class="plain">-</span><span class="element">>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">>destination_tree</span><span class="plain">, </span><span class="identifier">target</span><span class="plain">-</span><span class="element">>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">>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">>origin_tree</span><span class="plain">, </span><span class="identifier">target</span><span class="plain">-</span><span class="element">>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">>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>
|
||||
|
|
|
@ -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>§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>§3. </b></p>
|
||||
|
||||
|
|
|
@ -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>§3. </b></p>
|
||||
|
||||
|
|
|
@ -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">>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">>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">>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">>equated_to</span><span class="plain">-</span><span class="element">>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">>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">>equated_to</span><span class="plain">-</span><span class="element">>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">>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>
|
||||
|
|
|
@ -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">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 1/ppl (<a href="1-ppl.html#SP5">§5</a>), 2/res (<a href="2-res.html#SP1">§1</a>), 4/fc (<a href="4-fc.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function main is used in 2/pck (<a href="2-pck.html#SP3">§3</a>), 2/cnn (<a href="2-cnn.html#SP1">§1</a>), 1/ppl (<a href="1-ppl.html#SP5">§5</a>), 4/fc (<a href="4-fc.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||
|
||||
|
|
|
@ -257,6 +257,12 @@ void Kinds::RunTime::get_default_value(inter_t *v1, inter_t *v2, kind *K) {
|
|||
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);
|
||||
Emit::to_ival(v1, v2, empty);
|
||||
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -79,15 +79,16 @@ 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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
packagetype _plain
|
||||
packagetype _code
|
||||
packagetype _linkage
|
||||
packagetype _function
|
||||
packagetype _module
|
||||
packagetype _submodule
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
packagetype _plain
|
||||
packagetype _code
|
||||
packagetype _linkage
|
||||
|
||||
package main _plain
|
||||
package resources _plain
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 *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);
|
||||
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 *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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -9,46 +9,17 @@ 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
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) {
|
||||
int *fail_flag = (int *) state;
|
||||
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++) {
|
||||
|
@ -57,12 +28,22 @@ void CodeGen::Externals::visitor(inter_tree *I, inter_tree_node *P, void *state)
|
|||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue