mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 16:44:21 +03:00
Added link symbols and linkage packages
This commit is contained in:
parent
064bc8a28c
commit
07973d0704
|
@ -148,7 +148,7 @@
|
|||
|
||||
<p class="endnote">The function Inter::Bookmarks::scope is used in 4/tmc (<a href="4-tmc.html#SP2">§2</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>), 4/tpc (<a href="4-tpc.html#SP2">§2</a>), 4/tac (<a href="4-tac.html#SP2">§2</a>), 4/tpc2 (<a href="4-tpc2.html#SP2">§2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">§2</a>), 4/tkc (<a href="4-tkc.html#SP2">§2</a>), 4/tdc (<a href="4-tdc.html#SP2">§2</a>), 4/tvc2 (<a href="4-tvc2.html#SP2">§2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">§2</a>), 4/trc (<a href="4-trc.html#SP2">§2</a>), 4/tic (<a href="4-tic.html#SP2">§2</a>), 4/tpc4 (<a href="4-tpc4.html#SP2">§2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">§2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">§2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">§2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">§2</a>), 5/tic (<a href="5-tic.html#SP2">§2</a>), 5/trc (<a href="5-trc.html#SP2">§2</a>), 5/tvc (<a href="5-tvc.html#SP2">§2</a>), 5/tcc2 (<a href="5-tcc2.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::Bookmarks::package is used in 2/st (<a href="2-st.html#SP8">§8</a>, <a href="2-st.html#SP9">§9</a>), 2/frm (<a href="2-frm.html#SP3">§3</a>), 3/dfn (<a href="3-dfn.html#SP5">§5</a>), 4/tnc (<a href="4-tnc.html#SP1">§1</a>), 4/tcc (<a href="4-tcc.html#SP1">§1</a>), 4/tmc (<a href="4-tmc.html#SP2">§2</a>), 4/tvc (<a href="4-tvc.html#SP2">§2</a>), 4/tpc (<a href="4-tpc.html#SP2">§2</a>), 4/tlc (<a href="4-tlc.html#SP2">§2</a>), 4/tac (<a href="4-tac.html#SP2">§2</a>), 4/tpc2 (<a href="4-tpc2.html#SP2">§2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">§2</a>), 4/tkc (<a href="4-tkc.html#SP2">§2</a>), 4/tdc (<a href="4-tdc.html#SP2">§2</a>), 4/tvc2 (<a href="4-tvc2.html#SP2">§2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">§2</a>), 4/trc (<a href="4-trc.html#SP2">§2</a>), 4/tic (<a href="4-tic.html#SP2">§2</a>), 4/tpc4 (<a href="4-tpc4.html#SP2">§2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">§2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">§2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">§2</a>), 5/tlc (<a href="5-tlc.html#SP2">§2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">§2</a>), 5/tic (<a href="5-tic.html#SP2">§2</a>), 5/trc (<a href="5-trc.html#SP2">§2</a>), 5/tvc (<a href="5-tvc.html#SP2">§2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">§2</a>), 5/tcc (<a href="5-tcc.html#SP2">§2</a>), 5/tec (<a href="5-tec.html#SP2">§2</a>), 5/trc2 (<a href="5-trc2.html#SP2">§2</a>), 5/tcc2 (<a href="5-tcc2.html#SP2">§2</a>), 5/tsc (<a href="5-tsc.html#SP2">§2</a>).</p>
|
||||
<p class="endnote">The function Inter::Bookmarks::package is used in 2/st (<a href="2-st.html#SP8">§8</a>, <a href="2-st.html#SP9">§9</a>), 2/frm (<a href="2-frm.html#SP3">§3</a>), 3/dfn (<a href="3-dfn.html#SP5">§5</a>), 4/tnc (<a href="4-tnc.html#SP1">§1</a>), 4/tcc (<a href="4-tcc.html#SP1">§1</a>), 4/tmc (<a href="4-tmc.html#SP2">§2</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>), 4/tvc (<a href="4-tvc.html#SP2">§2</a>), 4/tpc (<a href="4-tpc.html#SP2">§2</a>), 4/tlc (<a href="4-tlc.html#SP2">§2</a>), 4/tac (<a href="4-tac.html#SP2">§2</a>), 4/tpc2 (<a href="4-tpc2.html#SP2">§2</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">§2</a>), 4/tkc (<a href="4-tkc.html#SP2">§2</a>), 4/tdc (<a href="4-tdc.html#SP2">§2</a>), 4/tvc2 (<a href="4-tvc2.html#SP2">§2</a>), 4/tcc2 (<a href="4-tcc2.html#SP2">§2</a>), 4/trc (<a href="4-trc.html#SP2">§2</a>), 4/tic (<a href="4-tic.html#SP2">§2</a>), 4/tpc4 (<a href="4-tpc4.html#SP2">§2</a>), 4/tpc5 (<a href="4-tpc5.html#SP2">§2</a>), 4/tpc6 (<a href="4-tpc6.html#SP2">§2</a>), 4/tpc7 (<a href="4-tpc7.html#SP2">§2</a>), 5/tlc (<a href="5-tlc.html#SP2">§2</a>), 5/tlc2 (<a href="5-tlc2.html#SP2">§2</a>), 5/tic (<a href="5-tic.html#SP2">§2</a>), 5/trc (<a href="5-trc.html#SP2">§2</a>), 5/tvc (<a href="5-tvc.html#SP2">§2</a>), 5/tlc3 (<a href="5-tlc3.html#SP2">§2</a>), 5/tcc (<a href="5-tcc.html#SP2">§2</a>), 5/tec (<a href="5-tec.html#SP2">§2</a>), 5/trc2 (<a href="5-trc2.html#SP2">§2</a>), 5/tcc2 (<a href="5-tcc2.html#SP2">§2</a>), 5/tsc (<a href="5-tsc.html#SP2">§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">
|
||||
|
|
|
@ -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">(&</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">>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">>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">, &</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">(&</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">>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">>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">>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>
|
||||
|
|
|
@ -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>§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">) && (</span><span class="identifier">pack</span><span class="plain">-</span><span class="element">>package_flags</span><span class="plain"> & </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">>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">>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">§1.5.3</a>), 4/tpc3 (<a href="4-tpc3.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::Packages::is_linklike is used in 2/st (<a href="2-st.html#SP10">§10</a>), 4/tsc (<a href="4-tsc.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::Packages::make_linklike is used in 4/tpc3 (<a href="4-tpc3.html#SP2">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::Packages::parent is used in 2/st (<a href="2-st.html#SP11">§11</a>), 2/iibf (<a href="2-iibf.html#SP1_1_3_3">§1.1.3.3</a>), 3/dfn (<a href="3-dfn.html#SP5">§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-->
|
||||
|
|
|
@ -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">>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">>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">>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">>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"><</span><span class="identifier">T</span><span class="plain">-</span><span class="element">>size</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
||||
<span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">symb</span><span class="plain"> = </span><span class="identifier">T</span><span class="plain">-</span><span class="element">>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">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::SymbolsTables::link is used in 4/tsc (<a href="4-tsc.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::SymbolsTables::resolve_forward_references is used in 2/iitf (<a href="2-iitf.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inter::SymbolsTables::rfr_visitor appears nowhere else.</p>
|
||||
|
|
|
@ -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,6 +155,9 @@
|
|||
<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">>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="reserved">if</span><span class="plain"> (</span><span class="identifier">mark</span><span class="plain">-</span><span class="element">>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">>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">) > 0)</span>
|
||||
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" -> %S"</span><span class="plain">, </span><span class="identifier">trans_name</span><span class="plain">);</span>
|
||||
|
@ -162,6 +167,7 @@
|
|||
<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>
|
||||
|
||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inter::Symbols::define</span><span class="plain">(</span><span class="reserved">inter_symbol</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">inter_frame</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
|
||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">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">"tried to define null symbol"</span><span class="plain">);</span>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">>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>
|
||||
|
|
|
@ -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">>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">) && (</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>
|
||||
|
||||
|
|
|
@ -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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>symbol_type</span><span class="plain"> = </span><span class="constant">LABEL_ISYMT</span><span class="plain">;</span>
|
||||
|
@ -79,12 +80,29 @@
|
|||
<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">>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">>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="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">>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">>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">>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>
|
||||
<span class="functiontext">Inter::Symbols::set_flag</span><span class="plain">(</span><span class="identifier">name_name</span><span class="plain">, </span><span class="constant">MAKE_NAME_UNIQUE</span><span class="plain">);</span>
|
||||
|
|
|
@ -507,6 +507,9 @@ These begin empty.
|
|||
<p class="inwebparagraph"><a id="SP16"></a><b>§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
|
||||
|
|
31
inter/Tests/Valid/linkage.intert
Normal file
31
inter/Tests/Valid/linkage.intert
Normal 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
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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,6 +113,9 @@ 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("*");
|
||||
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);
|
||||
|
@ -120,6 +125,7 @@ void Inter::Symbols::write_declaration(OUTPUT_STREAM, inter_symbol *mark, int N)
|
|||
Inter::SymbolsTables::symbol_to_url_name(OUT, eq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Inter::Symbols::define(inter_symbol *S, inter_frame P) {
|
||||
if (S == NULL) internal_error("tried to define null symbol");
|
||||
|
|
|
@ -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;
|
||||
|
||||
@
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,12 +68,29 @@ 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) && (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) {
|
||||
Inter::Symbols::set_flag(name_name, MAKE_NAME_UNIQUE);
|
||||
|
|
Loading…
Reference in a new issue