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

Removed global frame list from inter trees

This commit is contained in:
Graham Nelson 2019-07-22 10:05:02 +01:00
parent ab0401fc41
commit f32c04e5bc
11 changed files with 128 additions and 63 deletions

View file

@ -133,6 +133,13 @@
<pre class="display">
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="functiontext">Inter::Frame::root_frame</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_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::find_room</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, 2, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] = (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="constant">NOP_IST</span><span class="plain">;</span>
<span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">LEVEL_IFLD</span><span class="plain">] = 0;</span>
<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">inter_frame</span><span class="plain"> </span><span class="functiontext">Inter::Frame::fill_0</span><span class="plain">(</span><span class="reserved">inter_bookmark</span><span class="plain"> *</span><span class="identifier">IBM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">inter_error_location</span><span class="plain"> *</span><span class="identifier">eloc</span><span class="plain">, </span><span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">level</span><span class="plain">) {</span>
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::find_room</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">-</span><span class="element">&gt;read_into</span><span class="plain">, 2, </span><span class="identifier">eloc</span><span class="plain">, </span><span class="functiontext">Inter::Bookmarks::package</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">));</span>
<span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] = (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">S</span><span class="plain">;</span>
@ -235,6 +242,8 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function Inter::Frame::root_frame is used in 2/iim (<a href="2-iim.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Inter::Frame::fill_0 is used in 4/tnc (<a href="4-tnc.html#SP1">&#167;1</a>), 4/tcc (<a href="4-tcc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::Frame::fill_1 is used in 4/tvc (<a href="4-tvc.html#SP2">&#167;2</a>), 4/tpc2 (<a href="4-tpc2.html#SP2">&#167;2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">&#167;2</a>), 5/tcc (<a href="5-tcc.html#SP2">&#167;2</a>), 5/tec (<a href="5-tec.html#SP2">&#167;2</a>), 5/trc2 (<a href="5-trc2.html#SP2">&#167;2</a>).</p>
@ -321,7 +330,7 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_inter_insertion</span><span class="plain">) </span><span class="functiontext">Inter::Defn::write_construct_text</span><span class="plain">(</span><span class="identifier">DL</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">F_level</span><span class="plain"> = </span><span class="identifier">F</span><span class="element">.data</span><span class="plain">[</span><span class="constant">LEVEL_IFLD</span><span class="plain">];</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F_level</span><span class="plain"> == 0) {</span>
<span class="functiontext">Inter::add_to_frame_list</span><span class="plain">(&amp;(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;global_material</span><span class="plain">), </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">Inter::Frame::place</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="constant">AS_LAST_CHILD_OF_ICPLACEMENT</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_definition_frame</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Inter::Bookmarks::get_placement</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">) == </span><span class="constant">AFTER_ICPLACEMENT</span><span class="plain">) ||</span>
<span class="plain">(</span><span class="functiontext">Inter::Bookmarks::get_placement</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">) == </span><span class="constant">IMMEDIATELY_AFTER_ICPLACEMENT</span><span class="plain">))</span>
<span class="functiontext">Inter::Bookmarks::set_ref</span><span class="plain">(</span><span class="identifier">at</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>

View file

@ -183,13 +183,13 @@ that's the end of the list and therefore the block.
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">first_one</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">resource_counter</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> == </span><span class="constant">NO_IRSRC</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = 1;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">first_one</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::create_resource</span><span class="plain">(</span><span class="identifier">warehouse</span><span class="plain">);</span>
<span class="identifier">first_one</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">resource_counter</span><span class="plain">++;</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">resource_counter</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">resource_counter</span><span class="plain"> &gt;= 3) </span><span class="identifier">n</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::create_resource</span><span class="plain">(</span><span class="identifier">warehouse</span><span class="plain">);</span>
<span class="reserved">inter_resource_holder</span><span class="plain"> *</span><span class="identifier">res</span><span class="plain"> = &amp;(</span><span class="identifier">warehouse</span><span class="plain">-</span><span class="element">&gt;stored_resources</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain">) {</span>
@ -396,25 +396,20 @@ that's the end of the list and therefore the block.
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">nid</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">nid</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">parent</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">p</span><span class="plain"> != 0) {</span>
<span class="identifier">parent</span><span class="plain"> = </span><span class="functiontext">Inter::get_package</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="reserved">if</span><span class="plain"> (</span><span class="identifier">parent</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"packages not well founded"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">p</span><span class="plain"> != 0) </span><span class="identifier">parent</span><span class="plain"> = </span><span class="functiontext">Inter::get_package</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="reserved">if</span><span class="plain"> (</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::new</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cl</span><span class="plain">) </span><span class="functiontext">Inter::Packages::make_codelike</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nid</span><span class="plain"> == 0) </span><span class="functiontext">Inter::Packages::make_rootlike</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sc</span><span class="plain"> != 0) </span><span class="functiontext">Inter::Packages::set_scope</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">, </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">sc</span><span class="plain">));</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">nid</span><span class="plain"> != 0) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">pack_name</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">parent</span><span class="plain">?(</span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">parent</span><span class="plain">)):</span><span class="functiontext">Inter::get_global_symbols</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">), </span><span class="identifier">nid</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack_name</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Parent is $6\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">parent</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">parent</span><span class="plain">) </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"package name can't be found in scope"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"package name can't be found in globals"</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">pack_name</span><span class="plain">)</span>
<span class="functiontext">Inter::Packages::set_name</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">, </span><span class="identifier">pack_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">else</span>
<span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"unable to retrieve package name"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">cl</span><span class="plain">) </span><span class="functiontext">Inter::Packages::make_codelike</span><span class="plain">(</span><span class="identifier">res</span><span class="plain">-</span><span class="element">&gt;stored_package</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
@ -434,7 +429,10 @@ that's the end of the list and therefore the block.
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">par</span><span class="plain">-</span><span class="element">&gt;index_n</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="functiontext">Inter::Packages::is_codelike</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;package_scope</span><span class="plain">-</span><span class="element">&gt;n_index</span><span class="plain">);</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">-</span><span class="element">&gt;symbol_ID</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="element">&gt;package_name</span><span class="plain">)</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">-</span><span class="element">&gt;symbol_ID</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="identifier">BinaryFiles::write_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, 0);</span>
<span class="plain">}</span>
</pre>
@ -482,6 +480,10 @@ enough that the slot exists for the eventual list to be stored in.
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">X</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">from_T</span><span class="plain"> = </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_T</span><span class="plain"> == </span><span class="identifier">NULL</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">"It's %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">X</span><span class="plain">);</span>
<span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no from_T"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_ID</span><span class="plain"> = 0;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">from_ID</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_ID</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
@ -492,8 +494,11 @@ enough that the slot exists for the eventual list to be stored in.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BinaryFiles::read_int32</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">, &amp;</span><span class="identifier">to_ID</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">)</span>
<span class="functiontext">Inter::Binary::read_error</span><span class="plain">(&amp;</span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">ftell</span><span class="plain">(</span><span class="identifier">fh</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"bytecode incomplete"</span><span class="plain">);</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">to_T</span><span class="plain"> = </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">to_T_id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_T</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 to_T"</span><span class="plain">);</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">from_S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">from_T</span><span class="plain">, </span><span class="identifier">from_ID</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from_S</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 from_S"</span><span class="plain">);</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">to_S</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::symbol_from_id</span><span class="plain">(</span><span class="identifier">to_T</span><span class="plain">, </span><span class="identifier">to_ID</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">to_S</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 to_S"</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">from_S</span><span class="plain">, </span><span class="identifier">to_S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>

View file

@ -43,8 +43,8 @@
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_tree</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_warehouse</span><span class="plain"> *</span><span class="identifier">warehouse</span><span class="plain">;</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">global_symbols_table_ID</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_frame_list</span><span class="plain"> </span><span class="identifier">global_material</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">root_definition_frame</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">root_package</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">main_package</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inter_tree</span><span class="plain">;</span>
@ -52,7 +52,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The structure inter_tree is accessed in 2/tw, 2/pck, 2/frm and here.</p>
<p class="endnote">The structure inter_tree is accessed in 2/pck, 2/frm and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
@ -60,14 +60,14 @@
<pre class="display">
<span class="reserved">inter_tree</span><span class="plain"> *</span><span class="functiontext">Inter::create</span><span class="plain">(</span><span class="reserved">void</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">CREATE</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="element">&gt;global_material.spare_storage</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;global_material.storage_used</span><span class="plain"> = 0;</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;global_material.storage_capacity</span><span class="plain"> = 0;</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;main_package</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;warehouse</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::new</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;global_symbols_table_ID</span><span class="plain"> = </span><span class="functiontext">Inter::create_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Inter::create_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_package</span><span class="plain"> = </span><span class="functiontext">Inter::get_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Inter::create_package</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">));</span>
<span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_definition_frame</span><span class="plain"> = </span><span class="functiontext">Inter::Frame::root_frame</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">);</span>
<span class="functiontext">Inter::Packages::make_rootlike</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_package</span><span class="plain">);</span>
<span class="functiontext">Inter::Packages::set_scope</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_package</span><span class="plain">, </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">I</span><span class="plain">;</span>
<span class="plain">}</span>
@ -86,7 +86,7 @@
<span class="plain">}</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="functiontext">Inter::get_global_symbols</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">return</span><span class="plain"> </span><span class="functiontext">Inter::get_symbols_table</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;global_symbols_table_ID</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;root_package</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="functiontext">Inter::get_symbols_table</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="constant">inter_t</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
@ -193,7 +193,7 @@
<p class="endnote">The function Inter::create_symbols_table is used in 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::get_global_symbols is used in 2/st (<a href="2-st.html#SP8">&#167;8</a>, <a href="2-st.html#SP9">&#167;9</a>, <a href="2-st.html#SP11">&#167;11</a>), 2/bkm (<a href="2-bkm.html#SP2">&#167;2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::get_global_symbols is used in 2/tw (<a href="2-tw.html#SP2">&#167;2</a>), 2/st (<a href="2-st.html#SP8">&#167;8</a>, <a href="2-st.html#SP9">&#167;9</a>, <a href="2-st.html#SP11">&#167;11</a>), 2/bkm (<a href="2-bkm.html#SP2">&#167;2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::get_symbols_table is used in 2/frm (<a href="2-frm.html#SP2">&#167;2</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>, <a href="2-iibf.html#SP1_6">&#167;1.6</a>).</p>
@ -312,8 +312,7 @@
<span class="plain">} </span><span class="reserved">inter_error_stash</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::traverse_global_list</span><span class="plain">(</span><span class="reserved">inter_tree</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">visitor</span><span class="plain">)(</span><span class="reserved">inter_tree</span><span class="plain"> *, </span><span class="reserved">inter_frame</span><span class="plain">, </span><span class="reserved">void</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">filter</span><span class="plain">) {</span>
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">LOOP_THROUGH_INTER_FRAME_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, (&amp;(</span><span class="identifier">from</span><span class="plain">-</span><span class="element">&gt;global_material</span><span class="plain">))) {</span>
<span class="identifier">PROTECTED_LOOP_THROUGH_INTER_CHILDREN</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, (</span><span class="identifier">from</span><span class="plain">-</span><span class="element">&gt;root_definition_frame</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">filter</span><span class="plain"> == 0) ||</span>
<span class="plain">((</span><span class="identifier">filter</span><span class="plain"> &gt; 0) &amp;&amp; (</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] == (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">filter</span><span class="plain">)) ||</span>
<span class="plain">((</span><span class="identifier">filter</span><span class="plain"> &lt; 0) &amp;&amp; (</span><span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">ID_IFLD</span><span class="plain">] != (</span><span class="constant">inter_t</span><span class="plain">) -</span><span class="identifier">filter</span><span class="plain">)))</span>
@ -385,7 +384,7 @@
<p class="endnote">The function Inter::sixth_child appears nowhere else.</p>
<p class="endnote">The function Inter::add_to_frame_list is used in 2/frm (<a href="2-frm.html#SP5">&#167;5</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::add_to_frame_list is used in 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::traverse_global_list is used in 2/iibf (<a href="2-iibf.html#SP1_1_5">&#167;1.1.5</a>), 2/iitf (<a href="2-iitf.html#SP2">&#167;2</a>).</p>

View file

@ -39,6 +39,7 @@
<span class="definitionkeyword">define</span> <span class="constant">CODELIKE_PACKAGE_FLAG</span><span class="plain"> 1</span>
<span class="definitionkeyword">define</span> <span class="constant">LINKAGE_PACKAGE_FLAG</span><span class="plain"> 2</span>
<span class="definitionkeyword">define</span> <span class="constant">USED_PACKAGE_FLAG</span><span class="plain"> 4</span>
<span class="definitionkeyword">define</span> <span class="constant">ROOT_PACKAGE_FLAG</span><span class="plain"> 8</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
@ -77,8 +78,20 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inter::Packages::is_rootlike</span><span class="plain">(</span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">pack</span><span class="plain">) &amp;&amp; (</span><span class="identifier">pack</span><span class="plain">-</span><span class="element">&gt;package_flags</span><span class="plain"> &amp; </span><span class="constant">ROOT_PACKAGE_FLAG</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="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Packages::make_rootlike</span><span class="plain">(</span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack</span><span class="plain">) {</span>
<span class="identifier">pack</span><span class="plain">-</span><span class="element">&gt;package_flags</span><span class="plain"> |= </span><span class="constant">ROOT_PACKAGE_FLAG</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="functiontext">Inter::Packages::parent</span><span class="plain">(</span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Inter::Packages::is_rootlike</span><span class="plain">(</span><span class="identifier">pack</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="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::defining_frame</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">);</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">P_index</span><span class="plain"> = </span><span class="functiontext">Inter::Frame::get_parent_index</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">P_index</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -91,7 +104,8 @@
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Packages::unmark_all</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">, </span><span class="reserved">inter_package</span><span class="plain">)</span>
<span class="identifier">CodeGen::unmark</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pack</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">)</span>
<span class="identifier">CodeGen::unmark</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">-</span><span class="element">&gt;package_name</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Packages::set_scope</span><span class="plain">(</span><span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
@ -239,11 +253,15 @@
<p class="endnote">The function Inter::Packages::make_linklike is used in 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Packages::is_rootlike appears nowhere else.</p>
<p class="endnote">The function Inter::Packages::make_rootlike is used in 2/iim (<a href="2-iim.html#SP3">&#167;3</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>).</p>
<p class="endnote">The function Inter::Packages::parent is used in 2/iim (<a href="2-iim.html#SP4">&#167;4</a>), 2/st (<a href="2-st.html#SP11">&#167;11</a>), 2/iibf (<a href="2-iibf.html#SP1_1_3_3">&#167;1.1.3.3</a>), 3/dfn (<a href="3-dfn.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Inter::Packages::unmark_all appears nowhere else.</p>
<p class="endnote">The function Inter::Packages::set_scope is used in 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Packages::set_scope is used in 2/iim (<a href="2-iim.html#SP3">&#167;3</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Packages::set_name is used in 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>).</p>
@ -269,7 +287,7 @@
<p class="endnote">The function Inter::Packages::container is used in 2/bkm (<a href="2-bkm.html#SP2">&#167;2</a>), 2/vi (<a href="2-vi.html#SP1">&#167;1</a>), 3/dfn (<a href="3-dfn.html#SP5">&#167;5</a>), 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/trc (<a href="5-trc.html#SP2">&#167;2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Packages::scope is used in 2/st (<a href="2-st.html#SP4">&#167;4</a>, <a href="2-st.html#SP8">&#167;8</a>, <a href="2-st.html#SP9">&#167;9</a>, <a href="2-st.html#SP10">&#167;10</a>, <a href="2-st.html#SP11">&#167;11</a>), 2/bkm (<a href="2-bkm.html#SP2">&#167;2</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>), 2/vi (<a href="2-vi.html#SP1">&#167;1</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">&#167;2</a>), 4/tic (<a href="4-tic.html#SP2">&#167;2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>), 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/trc (<a href="5-trc.html#SP2">&#167;2</a>), 5/tvc (<a href="5-tvc.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Packages::scope is used in 2/iim (<a href="2-iim.html#SP3">&#167;3</a>), 2/st (<a href="2-st.html#SP4">&#167;4</a>, <a href="2-st.html#SP8">&#167;8</a>, <a href="2-st.html#SP9">&#167;9</a>, <a href="2-st.html#SP10">&#167;10</a>, <a href="2-st.html#SP11">&#167;11</a>), 2/bkm (<a href="2-bkm.html#SP2">&#167;2</a>), 2/iibf (<a href="2-iibf.html#SP1_5_3">&#167;1.5.3</a>), 2/vi (<a href="2-vi.html#SP1">&#167;1</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">&#167;2</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">&#167;2</a>), 4/tic (<a href="4-tic.html#SP2">&#167;2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">&#167;2</a>), 5/tlc (<a href="5-tlc.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/trc (<a href="5-trc.html#SP2">&#167;2</a>), 5/tvc (<a href="5-tvc.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Packages::scope_of is used in 2/st (<a href="2-st.html#SP7">&#167;7</a>), 4/tmc (<a href="4-tmc.html#SP2">&#167;2</a>), 4/tkc (<a href="4-tkc.html#SP2">&#167;2</a>), 4/tdc (<a href="4-tdc.html#SP2">&#167;2</a>), 4/tvc2 (<a href="4-tvc2.html#SP2">&#167;2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">&#167;2</a>), 4/trc (<a href="4-trc.html#SP2">&#167;2</a>), 4/tic (<a href="4-tic.html#SP2">&#167;2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">&#167;2</a>), 5/tvc (<a href="5-tvc.html#SP2">&#167;2</a>), 5/tcc2 (<a href="5-tcc2.html#SP2">&#167;2</a>).</p>

View file

@ -111,7 +111,11 @@
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">IS</span><span class="plain">-</span><span class="element">&gt;next_room</span><span class="plain">) </span><span class="identifier">IS</span><span class="plain"> = </span><span class="identifier">IS</span><span class="plain">-</span><span class="element">&gt;next_room</span><span class="plain">;</span>
<span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Inter::Warehouse::find_room_in_room</span><span class="plain">(</span><span class="identifier">IS</span><span class="plain">, </span><span class="identifier">n</span><span class="plain">);</span>
<span class="identifier">F</span><span class="element">.repo_segment</span><span class="plain">-</span><span class="element">&gt;bytecode</span><span class="plain">[</span><span class="identifier">F</span><span class="element">.index</span><span class="plain"> + </span><span class="constant">PREFRAME_ORIGIN</span><span class="plain">] = </span><span class="functiontext">Inter::Warehouse::store_origin</span><span class="plain">(</span><span class="identifier">warehouse</span><span class="plain">, </span><span class="identifier">eloc</span><span class="plain">);</span>
<span class="identifier">F</span><span class="element">.repo_segment</span><span class="plain">-</span><span class="element">&gt;bytecode</span><span class="plain">[</span><span class="identifier">F</span><span class="element">.index</span><span class="plain"> + </span><span class="constant">PREFRAME_GLOBALS</span><span class="plain">] = </span><span class="identifier">I</span><span class="plain">-</span><span class="element">&gt;global_symbols_table_ID</span><span class="plain">;</span>
<span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">Inter::get_global_symbols</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">T</span><span class="plain">)</span>
<span class="identifier">F</span><span class="element">.repo_segment</span><span class="plain">-</span><span class="element">&gt;bytecode</span><span class="plain">[</span><span class="identifier">F</span><span class="element">.index</span><span class="plain"> + </span><span class="constant">PREFRAME_GLOBALS</span><span class="plain">] = (</span><span class="constant">inter_t</span><span class="plain">) </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;n_index</span><span class="plain">;</span>
<span class="reserved">else</span>
<span class="identifier">F</span><span class="element">.repo_segment</span><span class="plain">-</span><span class="element">&gt;bytecode</span><span class="plain">[</span><span class="identifier">F</span><span class="element">.index</span><span class="plain"> + </span><span class="constant">PREFRAME_GLOBALS</span><span class="plain">] = 1;</span>
<span class="functiontext">Inter::Frame::attach_package</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="functiontext">Inter::Packages::to_PID</span><span class="plain">(</span><span class="identifier">owner</span><span class="plain">));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">F</span><span class="plain">;</span>
<span class="plain">}</span>

View file

@ -6,4 +6,5 @@ assimilate
make-identifiers-unique
resolve-external-symbols
reconcile-verbs
generate 0:/main/template inventory -> *log
generate inform6 -> *out

View file

@ -83,6 +83,13 @@ int Inter::Frame::eq(inter_frame *F1, inter_frame *F2) {
}
@ =
inter_frame Inter::Frame::root_frame(inter_tree *I) {
inter_frame P = Inter::Warehouse::find_room(I, 2, NULL, NULL);
P.data[ID_IFLD] = (inter_t) NOP_IST;
P.data[LEVEL_IFLD] = 0;
return P;
}
inter_frame Inter::Frame::fill_0(inter_bookmark *IBM, int S, inter_error_location *eloc, inter_t level) {
inter_frame P = Inter::Warehouse::find_room(IBM->read_into, 2, eloc, Inter::Bookmarks::package(IBM));
P.data[ID_IFLD] = (inter_t) S;
@ -239,7 +246,7 @@ void Inter::Frame::insert(inter_frame F, inter_bookmark *at) {
if (trace_inter_insertion) Inter::Defn::write_construct_text(DL, F);
inter_t F_level = F.data[LEVEL_IFLD];
if (F_level == 0) {
Inter::add_to_frame_list(&(I->global_material), F);
Inter::Frame::place(F, AS_LAST_CHILD_OF_ICPLACEMENT, I->root_definition_frame);
if ((Inter::Bookmarks::get_placement(at) == AFTER_ICPLACEMENT) ||
(Inter::Bookmarks::get_placement(at) == IMMEDIATELY_AFTER_ICPLACEMENT))
Inter::Bookmarks::set_ref(at, F);

View file

@ -105,13 +105,13 @@ that's the end of the list and therefore the block.
@e PACKAGE_IRSRC
@<Read the resources@> =
int first_one = TRUE;
int resource_counter = 0;
while (BinaryFiles::read_int32(fh, &X)) {
if (X == NO_IRSRC) break;
inter_t n = 1;
if (first_one == FALSE) n = Inter::Warehouse::create_resource(warehouse);
first_one = FALSE;
resource_counter++;
inter_t n = (inter_t) resource_counter;
if (resource_counter >= 3) n = Inter::Warehouse::create_resource(warehouse);
inter_resource_holder *res = &(warehouse->stored_resources[n]);
switch (X) {
@ -256,25 +256,20 @@ that's the end of the list and therefore the block.
unsigned int nid;
if (BinaryFiles::read_int32(fh, &nid) == FALSE) Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete");
inter_package *parent = NULL;
if (p != 0) {
parent = Inter::get_package(I, p);
if (parent == NULL) Inter::Binary::read_error(&eloc, ftell(fh), I"packages not well founded");
}
if (p != 0) parent = Inter::get_package(I, p);
if (res->stored_package == NULL) {
res->stored_package = Inter::Packages::new(I, n);
}
if (cl) Inter::Packages::make_codelike(res->stored_package);
if (nid == 0) Inter::Packages::make_rootlike(res->stored_package);
if (sc != 0) Inter::Packages::set_scope(res->stored_package, Inter::get_symbols_table(I, sc));
if (nid != 0) {
inter_symbol *pack_name = Inter::SymbolsTables::symbol_from_id(parent?(Inter::Packages::scope(parent)):Inter::get_global_symbols(I), nid);
if (pack_name == NULL) {
LOG("Parent is $6\n", parent);
if (parent) Inter::Binary::read_error(&eloc, ftell(fh), I"package name can't be found in scope");
else Inter::Binary::read_error(&eloc, ftell(fh), I"package name can't be found in globals");
} else {
if (pack_name)
Inter::Packages::set_name(res->stored_package, pack_name);
}
else
Inter::Binary::read_error(&eloc, ftell(fh), I"unable to retrieve package name");
}
if (cl) Inter::Packages::make_codelike(res->stored_package);
@<Write a package resource@> =
inter_package *P = res->stored_package;
@ -284,7 +279,10 @@ that's the end of the list and therefore the block.
else BinaryFiles::write_int32(fh, (unsigned int) par->index_n);
BinaryFiles::write_int32(fh, (unsigned int) Inter::Packages::is_codelike(P));
BinaryFiles::write_int32(fh, (unsigned int) P->package_scope->n_index);
BinaryFiles::write_int32(fh, (unsigned int) P->package_name->symbol_ID);
if (P->package_name)
BinaryFiles::write_int32(fh, (unsigned int) P->package_name->symbol_ID);
else
BinaryFiles::write_int32(fh, 0);
}
@ We do nothing here, because frame lists are built new on reading. It's
@ -300,6 +298,10 @@ enough that the slot exists for the eventual list to be stored in.
while (BinaryFiles::read_int32(fh, &X)) {
if (X == 0) break;
inter_symbols_table *from_T = Inter::get_symbols_table(I, X);
if (from_T == NULL) {
WRITE_TO(STDERR, "It's %d\n", X);
internal_error("no from_T");
}
unsigned int from_ID = 0;
while (BinaryFiles::read_int32(fh, &from_ID)) {
if (from_ID == 0) break;
@ -310,8 +312,11 @@ enough that the slot exists for the eventual list to be stored in.
if (BinaryFiles::read_int32(fh, &to_ID) == FALSE)
Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete");
inter_symbols_table *to_T = Inter::get_symbols_table(I, to_T_id);
if (from_T == NULL) internal_error("no to_T");
inter_symbol *from_S = Inter::SymbolsTables::symbol_from_id(from_T, from_ID);
if (from_S == NULL) internal_error("no from_S");
inter_symbol *to_S = Inter::SymbolsTables::symbol_from_id(to_T, to_ID);
if (to_S == NULL) internal_error("no to_S");
Inter::SymbolsTables::equate(from_S, to_S);
}
}

View file

@ -29,8 +29,8 @@ To store bytecode-like intermediate code in memory.
=
typedef struct inter_tree {
struct inter_warehouse *warehouse;
inter_t global_symbols_table_ID;
struct inter_frame_list global_material;
struct inter_frame root_definition_frame;
struct inter_package *root_package;
struct inter_package *main_package;
MEMORY_MANAGEMENT
} inter_tree;
@ -38,14 +38,14 @@ typedef struct inter_tree {
@ =
inter_tree *Inter::create(void) {
inter_tree *I = CREATE(inter_tree);
I->global_material.spare_storage = NULL;
I->global_material.storage_used = 0;
I->global_material.storage_capacity = 0;
I->main_package = NULL;
I->warehouse = Inter::Warehouse::new(I);
I->global_symbols_table_ID = Inter::create_symbols_table(I);
inter_t N = Inter::create_symbols_table(I);
I->root_package = Inter::get_package(I, Inter::create_package(I));
I->root_definition_frame = Inter::Frame::root_frame(I);
Inter::Packages::make_rootlike(I->root_package);
Inter::Packages::set_scope(I->root_package, Inter::get_symbols_table(I, N));
return I;
}
@ -64,7 +64,7 @@ inter_t Inter::create_symbols_table(inter_tree *I) {
}
inter_symbols_table *Inter::get_global_symbols(inter_tree *I) {
return Inter::get_symbols_table(I, I->global_symbols_table_ID);
return Inter::Packages::scope(I->root_package);
}
inter_symbols_table *Inter::get_symbols_table(inter_tree *I, inter_t n) {
@ -252,8 +252,7 @@ typedef struct inter_error_stash {
} inter_error_stash;
void Inter::traverse_global_list(inter_tree *from, void (*visitor)(inter_tree *, inter_frame, void *), void *state, int filter) {
inter_frame P;
LOOP_THROUGH_INTER_FRAME_LIST(P, (&(from->global_material))) {
PROTECTED_LOOP_THROUGH_INTER_CHILDREN(P, (from->root_definition_frame)) {
if ((filter == 0) ||
((filter > 0) && (P.data[ID_IFLD] == (inter_t) filter)) ||
((filter < 0) && (P.data[ID_IFLD] != (inter_t) -filter)))

View file

@ -20,6 +20,7 @@ typedef struct inter_package {
@d CODELIKE_PACKAGE_FLAG 1
@d LINKAGE_PACKAGE_FLAG 2
@d USED_PACKAGE_FLAG 4
@d ROOT_PACKAGE_FLAG 8
@ =
inter_package *Inter::Packages::new(inter_tree *I, inter_t n) {
@ -55,8 +56,20 @@ void Inter::Packages::make_linklike(inter_package *pack) {
}
}
int Inter::Packages::is_rootlike(inter_package *pack) {
if ((pack) && (pack->package_flags & ROOT_PACKAGE_FLAG)) return TRUE;
return FALSE;
}
void Inter::Packages::make_rootlike(inter_package *pack) {
if (pack) {
pack->package_flags |= ROOT_PACKAGE_FLAG;
}
}
inter_package *Inter::Packages::parent(inter_package *pack) {
if (pack) {
if (Inter::Packages::is_rootlike(pack)) return NULL;
inter_frame D = Inter::Symbols::defining_frame(pack->package_name);
inter_t P_index = Inter::Frame::get_parent_index(D);
if (P_index == 0) return NULL;
@ -69,7 +82,8 @@ inter_package *Inter::Packages::parent(inter_package *pack) {
void Inter::Packages::unmark_all(void) {
inter_package *pack;
LOOP_OVER(pack, inter_package)
CodeGen::unmark(pack->package_name);
if (pack->package_name)
CodeGen::unmark(pack->package_name);
}
void Inter::Packages::set_scope(inter_package *P, inter_symbols_table *T) {

View file

@ -89,7 +89,11 @@ inter_frame Inter::Warehouse::find_room(inter_tree *I, int n, inter_error_locati
while (IS->next_room) IS = IS->next_room;
inter_frame F = Inter::Warehouse::find_room_in_room(IS, n);
F.repo_segment->bytecode[F.index + PREFRAME_ORIGIN] = Inter::Warehouse::store_origin(warehouse, eloc);
F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = I->global_symbols_table_ID;
inter_symbols_table *T = Inter::get_global_symbols(I);
if (T)
F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = (inter_t) T->n_index;
else
F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = 1;
Inter::Frame::attach_package(F, Inter::Packages::to_PID(owner));
return F;
}