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

Added link symbols and linkage packages

This commit is contained in:
Graham Nelson 2019-07-20 07:18:40 +01:00
parent 064bc8a28c
commit 07973d0704
19 changed files with 211 additions and 33 deletions

View file

@ -148,7 +148,7 @@
<p class="endnote">The function Inter::Bookmarks::scope is used in 4/tmc (<a href="4-tmc.html#SP2">&#167;2</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc2 (<a href="4-tpc2.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/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/tpc4 (<a href="4-tpc4.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>), 4/tpc7 (<a href="4-tpc7.html#SP2">&#167;2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">&#167;2</a>), 5/tic (<a href="5-tic.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>), 5/tcc2 (<a href="5-tcc2.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Bookmarks::package is used in 2/st (<a href="2-st.html#SP8">&#167;8</a>, <a href="2-st.html#SP9">&#167;9</a>), 2/frm (<a href="2-frm.html#SP3">&#167;3</a>), 3/dfn (<a href="3-dfn.html#SP5">&#167;5</a>), 4/tnc (<a href="4-tnc.html#SP1">&#167;1</a>), 4/tcc (<a href="4-tcc.html#SP1">&#167;1</a>), 4/tmc (<a href="4-tmc.html#SP2">&#167;2</a>), 4/tvc (<a href="4-tvc.html#SP2">&#167;2</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tlc (<a href="4-tlc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc2 (<a href="4-tpc2.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/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/tpc4 (<a href="4-tpc4.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>), 4/tpc7 (<a href="4-tpc7.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/tic (<a href="5-tic.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>), 5/tlc3 (<a href="5-tlc3.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>), 5/tcc2 (<a href="5-tcc2.html#SP2">&#167;2</a>), 5/tsc (<a href="5-tsc.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function Inter::Bookmarks::package is used in 2/st (<a href="2-st.html#SP8">&#167;8</a>, <a href="2-st.html#SP9">&#167;9</a>), 2/frm (<a href="2-frm.html#SP3">&#167;3</a>), 3/dfn (<a href="3-dfn.html#SP5">&#167;5</a>), 4/tnc (<a href="4-tnc.html#SP1">&#167;1</a>), 4/tcc (<a href="4-tcc.html#SP1">&#167;1</a>), 4/tmc (<a href="4-tmc.html#SP2">&#167;2</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>), 4/tvc (<a href="4-tvc.html#SP2">&#167;2</a>), 4/tpc (<a href="4-tpc.html#SP2">&#167;2</a>), 4/tlc (<a href="4-tlc.html#SP2">&#167;2</a>), 4/tac (<a href="4-tac.html#SP2">&#167;2</a>), 4/tpc2 (<a href="4-tpc2.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/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/tpc4 (<a href="4-tpc4.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>), 4/tpc7 (<a href="4-tpc7.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/tic (<a href="5-tic.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>), 5/tlc3 (<a href="5-tlc3.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>), 5/tcc2 (<a href="5-tcc2.html#SP2">&#167;2</a>), 5/tsc (<a href="5-tsc.html#SP2">&#167;2</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-frm.html">Back to 'Frames'</a></li><li><a href="2-iibf.html">Continue with 'Inter in Binary Files'</a></li></ul><hr class="tocbar">

View file

@ -311,8 +311,18 @@ that's the end of the list and therefore the block.
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Inter::Defn::is_invalid</span><span class="plain">(</span><span class="identifier">IA</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">"invalid annotation"</span><span class="plain">);</span>
<span class="functiontext">Inter::Symbols::annotate</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">IA</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> == </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain"> = </span><span class="identifier">Str::new</span><span class="plain">();</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">TRUE</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">c</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">c</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">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == 0) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">, (</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="identifier">c</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">S</span><span class="plain">) </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_BINARY</span><span class="plain">, </span><span class="string">"Read symbol $3\</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">LOGIF</span><span class="plain">(</span><span class="identifier">INTER_BINARY</span><span class="plain">, </span><span class="string">"Read symbol $3\</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">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">trans</span><span class="plain">);</span>
<span class="plain">}</span>
@ -349,6 +359,11 @@ that's the end of the list and therefore the block.
<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">c1</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">c2</span><span class="plain">);</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="element">&gt;symbol_scope</span><span class="plain"> == </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">symb</span><span class="plain">-</span><span class="element">&gt;equated_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">Str::get</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">));</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>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>

View file

@ -36,7 +36,8 @@
<pre class="definitions">
<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">USED_PACKAGE_FLAG</span><span class="plain"> 2</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>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b></p>
@ -63,6 +64,17 @@
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inter::Packages::is_linklike</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">LINKAGE_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_linklike</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">LINKAGE_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">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>
@ -207,6 +219,10 @@
<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::Packages::wrap</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="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
@ -217,6 +233,10 @@
<p class="endnote">The function Inter::Packages::make_codelike 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::is_linklike is used in 2/st (<a href="2-st.html#SP10">&#167;10</a>), 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<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::parent is used in 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>
@ -257,6 +277,8 @@
<p class="endnote">The function Inter::Packages::read_metadata appears nowhere else.</p>
<p class="endnote">The function Inter::Packages::wrap appears nowhere else.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-st.html">Back to 'Symbols Tables'</a></li><li><a href="2-sym.html">Continue with 'Symbols'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -440,6 +440,13 @@ a global symbol in any non-global context.
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = </span><span class="constant">EXTERNAL_ISYMS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::link</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S_from</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">S_from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">name</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">"bad link equation"</span><span class="plain">);</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">S_from</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = </span><span class="constant">LINK_ISYMS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::resolve_forward_references</span><span class="plain">(</span><span class="reserved">inter_repository</span><span class="plain"> *</span><span class="identifier">I</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="functiontext">Inter::traverse_tree</span><span class="plain">(</span><span class="identifier">I</span><span class="plain">, </span><span class="functiontext">Inter::SymbolsTables::rfr_visitor</span><span class="plain">, </span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">PACKAGE_IST</span><span class="plain">);</span>
<span class="plain">}</span>
@ -447,6 +454,7 @@ a global symbol in any non-global context.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::rfr_visitor</span><span class="plain">(</span><span class="reserved">inter_repository</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="reserved">void</span><span class="plain"> *</span><span class="identifier">state</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="reserved">inter_error_location</span><span class="plain"> *) </span><span class="identifier">state</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="functiontext">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="functiontext">Inter::Packages::is_linklike</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="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::scope</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">&gt;symbol_array</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
@ -466,6 +474,8 @@ a global symbol in any non-global context.
<p class="endnote">The function Inter::SymbolsTables::equate_textual is used in 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::link is used in 4/tsc (<a href="4-tsc.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::resolve_forward_references is used in 2/iitf (<a href="2-iitf.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Inter::SymbolsTables::rfr_visitor appears nowhere else.</p>

View file

@ -32,6 +32,7 @@
<span class="definitionkeyword">enum</span> <span class="constant">PRIVATE_ISYMS</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">PUBLIC_ISYMS</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXTERNAL_ISYMS</span>
<span class="definitionkeyword">enum</span> <span class="constant">LINK_ISYMS</span>
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_symbol</span><span class="plain"> {</span>
<span class="constant">inter_t</span><span class="plain"> </span><span class="identifier">symbol_ID</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inter_symbols_table</span><span class="plain"> *</span><span class="identifier">owning_table</span><span class="plain">;</span>
@ -141,6 +142,7 @@
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PRIVATE_ISYMS</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"private"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">PUBLIC_ISYMS</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"public"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXTERNAL_ISYMS</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"external"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">LINK_ISYMS</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"link"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"unknown symbol type"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
@ -153,13 +155,17 @@
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" %S"</span><span class="plain">, </span><span class="identifier">mark</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Inter::Symbols::get_flag</span><span class="plain">(</span><span class="identifier">mark</span><span class="plain">, </span><span class="constant">MAKE_NAME_UNIQUE</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"*"</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">trans_name</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">mark</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">trans_name</span><span class="plain">) &gt; 0)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" -&gt; %S"</span><span class="plain">, </span><span class="identifier">trans_name</span><span class="plain">);</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">eq</span><span class="plain"> = </span><span class="identifier">mark</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eq</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" == "</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">eq</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mark</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> == </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" == %S"</span><span class="plain">, </span><span class="identifier">mark</span><span class="plain">-</span><span class="element">&gt;equated_name</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">trans_name</span><span class="plain"> = </span><span class="functiontext">Inter::Symbols::get_translate</span><span class="plain">(</span><span class="identifier">mark</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">trans_name</span><span class="plain">) &gt; 0)</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" -&gt; %S"</span><span class="plain">, </span><span class="identifier">trans_name</span><span class="plain">);</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">eq</span><span class="plain"> = </span><span class="identifier">mark</span><span class="plain">-</span><span class="element">&gt;equated_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eq</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" == "</span><span class="plain">);</span>
<span class="functiontext">Inter::SymbolsTables::symbol_to_url_name</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">eq</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>

View file

@ -88,6 +88,7 @@
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">plain_packagetype</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">code_packagetype</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">linkage_packagetype</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -57,8 +57,10 @@
<span class="plain">}</span>
<span class="reserved">inter_error_message</span><span class="plain"> *</span><span class="functiontext">Inter::PackageType::new_packagetype</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">inter_symbol</span><span class="plain"> *</span><span class="identifier">ptype</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_error_location</span><span class="plain"> *</span><span class="identifier">eloc</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">plain_packagetype</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">plain_packagetype</span><span class="plain"> = </span><span class="identifier">ptype</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">code_packagetype</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">code_packagetype</span><span class="plain"> = </span><span class="identifier">ptype</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">ptype</span><span class="plain">-</span><span class="element">&gt;symbol_name</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_plain"</span><span class="plain">)) </span><span class="identifier">plain_packagetype</span><span class="plain"> = </span><span class="identifier">ptype</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_code"</span><span class="plain">)) </span><span class="identifier">code_packagetype</span><span class="plain"> = </span><span class="identifier">ptype</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"_linkage"</span><span class="plain">)) </span><span class="identifier">linkage_packagetype</span><span class="plain"> = </span><span class="identifier">ptype</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::Frame::fill_1</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="constant">PACKAGETYPE_IST</span><span class="plain">, </span><span class="functiontext">Inter::SymbolsTables::id_from_IRS_and_symbol</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">, </span><span class="identifier">ptype</span><span class="plain">), </span><span class="identifier">eloc</span><span class="plain">, </span><span class="identifier">level</span><span class="plain">);</span>
<span class="reserved">inter_error_message</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Defn::verify_construct</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="plain">);</span>

View file

@ -77,6 +77,8 @@
<span class="reserved">inter_package</span><span class="plain"> *</span><span class="identifier">pack</span><span class="plain"> = </span><span class="functiontext">Inter::Packages::from_PID</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">-</span><span class="element">&gt;read_into</span><span class="plain">, </span><span class="identifier">PID</span><span class="plain">);</span>
<span class="functiontext">Inter::Packages::set_name</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">, </span><span class="identifier">package_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ptype_name</span><span class="plain"> == </span><span class="identifier">code_packagetype</span><span class="plain">) </span><span class="functiontext">Inter::Packages::make_codelike</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">linkage_packagetype</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ptype_name</span><span class="plain"> == </span><span class="identifier">linkage_packagetype</span><span class="plain">))</span>
<span class="functiontext">Inter::Packages::make_linklike</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">);</span>
<span class="functiontext">Inter::Packages::set_scope</span><span class="plain">(</span><span class="identifier">pack</span><span class="plain">, </span><span class="functiontext">Inter::Package::local_symbols</span><span class="plain">(</span><span class="identifier">package_name</span><span class="plain">));</span>
<span class="identifier">P</span><span class="element">.data</span><span class="plain">[</span><span class="constant">PID_PACKAGE_IFLD</span><span class="plain">] = </span><span class="identifier">PID</span><span class="plain">;</span>

View file

@ -71,6 +71,7 @@
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">ilp</span><span class="plain">-</span><span class="element">&gt;mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"private"</span><span class="plain">)) </span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = </span><span class="constant">PRIVATE_ISYMS</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">Str::eq</span><span class="plain">(</span><span class="identifier">ilp</span><span class="plain">-</span><span class="element">&gt;mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"public"</span><span class="plain">)) </span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = </span><span class="constant">PUBLIC_ISYMS</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">Str::eq</span><span class="plain">(</span><span class="identifier">ilp</span><span class="plain">-</span><span class="element">&gt;mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"external"</span><span class="plain">)) </span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = </span><span class="constant">EXTERNAL_ISYMS</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">Str::eq</span><span class="plain">(</span><span class="identifier">ilp</span><span class="plain">-</span><span class="element">&gt;mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[0], </span><span class="identifier">I</span><span class="string">"link"</span><span class="plain">)) </span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> = </span><span class="constant">LINK_ISYMS</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> { *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown scope keyword"</span><span class="plain">, </span><span class="identifier">eloc</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">ilp</span><span class="plain">-</span><span class="element">&gt;mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1], </span><span class="identifier">I</span><span class="string">"label"</span><span class="plain">)) </span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_type</span><span class="plain"> = </span><span class="constant">LABEL_ISYMT</span><span class="plain">;</span>
@ -79,11 +80,28 @@
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::eq</span><span class="plain">(</span><span class="identifier">ilp</span><span class="plain">-</span><span class="element">&gt;mr</span><span class="plain">.</span><span class="identifier">exp</span><span class="plain">[1], </span><span class="identifier">I</span><span class="string">"packagetype"</span><span class="plain">)) </span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_type</span><span class="plain"> = </span><span class="constant">PTYPE_ISYMT</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> { *</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"unknown symbol-type keyword"</span><span class="plain">, </span><span class="identifier">eloc</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">trans_name</span><span class="plain">) </span><span class="functiontext">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">trans_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">equate_name</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">eq</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::url_name_to_symbol</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">-</span><span class="element">&gt;read_into</span><span class="plain">, </span><span class="functiontext">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">equate_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eq</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Inter::SymbolsTables::equate_textual</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">equate_name</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">eq</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">trans_name</span><span class="plain">) &amp;&amp; (</span><span class="identifier">equate_name</span><span class="plain">)) {</span>
<span class="plain">*</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"a symbol cannot be both translated and equated"</span><span class="plain">, </span><span class="identifier">eloc</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="functiontext">Inter::Packages::is_linklike</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="reserved">if</span><span class="plain"> (</span><span class="identifier">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> != </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"in a _linkage package, all symbols must be links"</span><span class="plain">, </span><span class="identifier">eloc</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">equate_name</span><span class="plain">) </span><span class="functiontext">Inter::SymbolsTables::link</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">equate_name</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="plain">*</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"link symbol not equated"</span><span class="plain">, </span><span class="identifier">eloc</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">;</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">name_name</span><span class="plain">-</span><span class="element">&gt;symbol_scope</span><span class="plain"> == </span><span class="constant">LINK_ISYMS</span><span class="plain">) {</span>
<span class="plain">*</span><span class="identifier">E</span><span class="plain"> = </span><span class="functiontext">Inter::Errors::plain</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"links may only occur in a _linkage package"</span><span class="plain">, </span><span class="identifier">eloc</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">trans_name</span><span class="plain">) </span><span class="functiontext">Inter::Symbols::set_translate</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">trans_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">equate_name</span><span class="plain">) {</span>
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">eq</span><span class="plain"> = </span><span class="functiontext">Inter::SymbolsTables::url_name_to_symbol</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">-</span><span class="element">&gt;read_into</span><span class="plain">, </span><span class="functiontext">Inter::Bookmarks::scope</span><span class="plain">(</span><span class="identifier">IBM</span><span class="plain">), </span><span class="identifier">equate_name</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">eq</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">Inter::SymbolsTables::equate_textual</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">equate_name</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Inter::SymbolsTables::equate</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="identifier">eq</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">starred</span><span class="plain">) {</span>

View file

@ -507,6 +507,9 @@ These begin empty.
<p class="inwebparagraph"><a id="SP16"></a><b>&#167;16. </b>And that leaves only one routine: for finding the unique vocabulary
entry pointer associated with the material in <code class="display"><span class="extract">text</span></code>. We search the
hash table to see if we have the word already, and if not, we add it.
Either way, we return a valid pointer. (Compare Isaiah 55:11, "So shall
my word be that goeth forth out of my mouth: it shall not return unto
me void.")
</p>
<p class="inwebparagraph">It is in order to set the initial values of the flags for the new

View file

@ -0,0 +1,31 @@
packagetype _plain
packagetype _code
packagetype _linkage
package main _plain
symbol public misc K_number
symbol public misc C_alpha
symbol public misc sub
symbol public misc references
kind K_number int32
constant C_alpha K_number = 1
package references _linkage
symbol link misc faraway == /main/template/timbuktu
symbol link misc distant == /main/template/ultima/thule
package sub _plain
symbol public misc C_beta
symbol public misc subsub
symbol external misc C_gamma == /main/sub/subsub/C_gamma
symbol external misc C_alpha == /main/C_alpha
symbol external misc K_number == /main/K_number
symbol public misc C_epislon
constant C_beta K_number = C_alpha
package subsub _plain
symbol public misc C_gamma
symbol public misc C_delta
symbol external misc C_alpha == /main/C_alpha
symbol external misc K_number == /main/K_number
symbol external misc C_beta == /main/sub/C_beta
constant C_gamma K_number = C_alpha
constant C_delta K_number = C_beta
constant C_epislon K_number = C_gamma

View file

@ -193,8 +193,18 @@ that's the end of the list and therefore the block.
if (Inter::Defn::is_invalid(IA)) Inter::Binary::read_error(&eloc, ftell(fh), I"invalid annotation");
Inter::Symbols::annotate(I, S, IA);
}
if (S->symbol_scope == LINK_ISYMS) {
S->equated_name = Str::new();
while (TRUE) {
unsigned int c;
if (BinaryFiles::read_int32(fh, &c) == FALSE)
Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete");
if (c == 0) break;
PUT_TO(S->equated_name, (wchar_t) c);
}
}
if (S) LOGIF(INTER_BINARY, "Read symbol $3\n", S);
LOGIF(INTER_BINARY, "Read symbol $3\n", S);
DISCARD_TEXT(name);
DISCARD_TEXT(trans);
}
@ -221,6 +231,11 @@ that's the end of the list and therefore the block.
BinaryFiles::write_int32(fh, (unsigned int) c1);
BinaryFiles::write_int32(fh, (unsigned int) c2);
}
if (symb->symbol_scope == LINK_ISYMS) {
LOOP_THROUGH_TEXT(pos, symb->equated_name)
BinaryFiles::write_int32(fh, (unsigned int) Str::get(pos));
BinaryFiles::write_int32(fh, 0);
}
}
}
}

View file

@ -17,7 +17,8 @@ typedef struct inter_package {
@
@d CODELIKE_PACKAGE_FLAG 1
@d USED_PACKAGE_FLAG 2
@d LINKAGE_PACKAGE_FLAG 2
@d USED_PACKAGE_FLAG 4
@ =
inter_package *Inter::Packages::new(inter_repository *I, inter_t n) {
@ -41,6 +42,17 @@ void Inter::Packages::make_codelike(inter_package *pack) {
}
}
int Inter::Packages::is_linklike(inter_package *pack) {
if ((pack) && (pack->package_flags & LINKAGE_PACKAGE_FLAG)) return TRUE;
return FALSE;
}
void Inter::Packages::make_linklike(inter_package *pack) {
if (pack) {
pack->package_flags |= LINKAGE_PACKAGE_FLAG;
}
}
inter_package *Inter::Packages::parent(inter_package *pack) {
if (pack) {
inter_frame D = Inter::Symbols::defining_frame(pack->package_name);
@ -185,3 +197,7 @@ text_stream *Inter::Packages::read_metadata(inter_package *P, text_stream *key)
}
return NULL;
}
void Inter::Packages::wrap(inter_package *P) {
}

View file

@ -325,6 +325,13 @@ void Inter::SymbolsTables::equate_textual(inter_symbol *S_from, text_stream *nam
S_from->symbol_scope = EXTERNAL_ISYMS;
}
void Inter::SymbolsTables::link(inter_symbol *S_from, text_stream *name) {
if ((S_from == NULL) || (name == NULL)) internal_error("bad link equation");
S_from->equated_to = NULL;
S_from->equated_name = Str::duplicate(name);
S_from->symbol_scope = LINK_ISYMS;
}
void Inter::SymbolsTables::resolve_forward_references(inter_repository *I, inter_error_location *eloc) {
Inter::traverse_tree(I, Inter::SymbolsTables::rfr_visitor, eloc, NULL, PACKAGE_IST);
}
@ -332,6 +339,7 @@ void Inter::SymbolsTables::resolve_forward_references(inter_repository *I, inter
void Inter::SymbolsTables::rfr_visitor(inter_repository *I, inter_frame P, void *state) {
inter_error_location *eloc = (inter_error_location *) state;
inter_package *pack = Inter::Package::defined_by_frame(P);
if (Inter::Packages::is_linklike(pack)) return;
inter_symbols_table *T = Inter::Packages::scope(pack);
for (int i=0; i<T->size; i++) {
inter_symbol *symb = T->symbol_array[i];

View file

@ -16,6 +16,7 @@ To manage named symbols in inter code.
@e PRIVATE_ISYMS from 1
@e PUBLIC_ISYMS
@e EXTERNAL_ISYMS
@e LINK_ISYMS
=
typedef struct inter_symbol {
@ -99,6 +100,7 @@ void Inter::Symbols::write_declaration(OUTPUT_STREAM, inter_symbol *mark, int N)
case PRIVATE_ISYMS: WRITE("private"); break;
case PUBLIC_ISYMS: WRITE("public"); break;
case EXTERNAL_ISYMS: WRITE("external"); break;
case LINK_ISYMS: WRITE("link"); break;
default: internal_error("unknown symbol type"); break;
}
WRITE(" ");
@ -111,13 +113,17 @@ void Inter::Symbols::write_declaration(OUTPUT_STREAM, inter_symbol *mark, int N)
}
WRITE(" %S", mark->symbol_name);
if (Inter::Symbols::get_flag(mark, MAKE_NAME_UNIQUE)) WRITE("*");
text_stream *trans_name = Inter::Symbols::get_translate(mark);
if (Str::len(trans_name) > 0)
WRITE(" -> %S", trans_name);
inter_symbol *eq = mark->equated_to;
if (eq) {
WRITE(" == ");
Inter::SymbolsTables::symbol_to_url_name(OUT, eq);
if (mark->symbol_scope == LINK_ISYMS) {
WRITE(" == %S", mark->equated_name);
} else {
text_stream *trans_name = Inter::Symbols::get_translate(mark);
if (Str::len(trans_name) > 0)
WRITE(" -> %S", trans_name);
inter_symbol *eq = mark->equated_to;
if (eq) {
WRITE(" == ");
Inter::SymbolsTables::symbol_to_url_name(OUT, eq);
}
}
}

View file

@ -66,6 +66,7 @@ inter_construct *Inter::Defn::create_construct(inter_t ID, wchar_t *syntax,
inter_symbol *plain_packagetype = NULL;
inter_symbol *code_packagetype = NULL;
inter_symbol *linkage_packagetype = NULL;
@

View file

@ -57,6 +57,8 @@ inter_error_message *Inter::Package::new_package(inter_bookmark *IBM, inter_symb
inter_package *pack = Inter::Packages::from_PID(IBM->read_into, PID);
Inter::Packages::set_name(pack, package_name);
if (ptype_name == code_packagetype) Inter::Packages::make_codelike(pack);
if ((linkage_packagetype) && (ptype_name == linkage_packagetype))
Inter::Packages::make_linklike(pack);
Inter::Packages::set_scope(pack, Inter::Package::local_symbols(package_name));
P.data[PID_PACKAGE_IFLD] = PID;

View file

@ -38,8 +38,10 @@ void Inter::PackageType::read(inter_construct *IC, inter_bookmark *IBM, inter_li
}
inter_error_message *Inter::PackageType::new_packagetype(inter_bookmark *IBM, inter_symbol *ptype, inter_t level, inter_error_location *eloc) {
if (plain_packagetype == NULL) plain_packagetype = ptype;
else if (code_packagetype == NULL) code_packagetype = ptype;
text_stream *name = ptype->symbol_name;
if (Str::eq(name, I"_plain")) plain_packagetype = ptype;
if (Str::eq(name, I"_code")) code_packagetype = ptype;
if (Str::eq(name, I"_linkage")) linkage_packagetype = ptype;
inter_frame P = Inter::Frame::fill_1(IBM, PACKAGETYPE_IST, Inter::SymbolsTables::id_from_IRS_and_symbol(IBM, ptype), eloc, level);
inter_error_message *E = Inter::Defn::verify_construct(Inter::Bookmarks::package(IBM), P);

View file

@ -59,6 +59,7 @@ void Inter::Symbol::read(inter_construct *IC, inter_bookmark *IBM, inter_line_pa
if (Str::eq(ilp->mr.exp[0], I"private")) name_name->symbol_scope = PRIVATE_ISYMS;
else if (Str::eq(ilp->mr.exp[0], I"public")) name_name->symbol_scope = PUBLIC_ISYMS;
else if (Str::eq(ilp->mr.exp[0], I"external")) name_name->symbol_scope = EXTERNAL_ISYMS;
else if (Str::eq(ilp->mr.exp[0], I"link")) name_name->symbol_scope = LINK_ISYMS;
else { *E = Inter::Errors::plain(I"unknown scope keyword", eloc); return; }
if (Str::eq(ilp->mr.exp[1], I"label")) name_name->symbol_type = LABEL_ISYMT;
@ -67,11 +68,28 @@ void Inter::Symbol::read(inter_construct *IC, inter_bookmark *IBM, inter_line_pa
else if (Str::eq(ilp->mr.exp[1], I"packagetype")) name_name->symbol_type = PTYPE_ISYMT;
else { *E = Inter::Errors::plain(I"unknown symbol-type keyword", eloc); return; }
if (trans_name) Inter::Symbols::set_translate(name_name, trans_name);
if (equate_name) {
inter_symbol *eq = Inter::SymbolsTables::url_name_to_symbol(IBM->read_into, Inter::Bookmarks::scope(IBM), equate_name);
if (eq == NULL) Inter::SymbolsTables::equate_textual(name_name, equate_name);
else Inter::SymbolsTables::equate(name_name, eq);
if ((trans_name) && (equate_name)) {
*E = Inter::Errors::plain(I"a symbol cannot be both translated and equated", eloc); return;
}
if (Inter::Packages::is_linklike(Inter::Bookmarks::package(IBM))) {
if (name_name->symbol_scope != LINK_ISYMS) {
*E = Inter::Errors::plain(I"in a _linkage package, all symbols must be links", eloc); return;
}
if (equate_name) Inter::SymbolsTables::link(name_name, equate_name);
else {
*E = Inter::Errors::plain(I"link symbol not equated", eloc); return;
}
} else {
if (name_name->symbol_scope == LINK_ISYMS) {
*E = Inter::Errors::plain(I"links may only occur in a _linkage package", eloc); return;
}
if (trans_name) Inter::Symbols::set_translate(name_name, trans_name);
if (equate_name) {
inter_symbol *eq = Inter::SymbolsTables::url_name_to_symbol(IBM->read_into, Inter::Bookmarks::scope(IBM), equate_name);
if (eq == NULL) Inter::SymbolsTables::equate_textual(name_name, equate_name);
else Inter::SymbolsTables::equate(name_name, eq);
}
}
if (starred) {