1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 10:04:21 +03:00
inform7/docs/final-module/2-cal.html
2021-08-22 14:13:10 +01:00

554 lines
76 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Constants and Literals</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Inform.png" height=72">
</a></h1>
<ul><li><a href="../compiler.html">compiler tools</a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul><h2>Compiler Webs</h2><ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul><h2>Inbuild Modules</h2><ul>
<li><a href="../supervisor-module/index.html">supervisor</a></li>
</ul><h2>Inform7 Modules</h2><ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../assertions-module/index.html">assertions</a></li>
<li><a href="../values-module/index.html">values</a></li>
<li><a href="../knowledge-module/index.html">knowledge</a></li>
<li><a href="../imperative-module/index.html">imperative</a></li>
<li><a href="../runtime-module/index.html">runtime</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul><h2>Inter Modules</h2><ul>
<li><a href="../bytecode-module/index.html">bytecode</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../pipeline-module/index.html">pipeline</a></li>
<li><a href="index.html"><span class="selectedlink">final</span></a></li>
</ul><h2>Services</h2><ul>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../calculus-module/index.html">calculus</a></li>
<li><a href="../html-module/index.html">html</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Constants and Literals' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inter Modules</a></li><li><a href="index.html">final</a></li><li><a href="index.html#2">Chapter 2: Mechanism</a></li><li><b>Constants and Literals</b></li></ul></div>
<p class="purpose">To generate final code for constants, including arrays.</p>
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">the_quartet_found</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">box_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">printing_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::CL::prepare</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">CodeGen::CL::prepare</span></span>:<br/>Code Generation - <a href="2-cg.html#SP8_1">&#167;8.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">the_quartet_found</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">box_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">; </span><span class="identifier-syntax">printing_mode</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">InterTree::traverse</span><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">from</span><span class="plain-syntax">, </span><a href="2-cal.html#SP1" class="function-link"><span class="function-syntax">CodeGen::CL::quartet_visitor</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">CONSTANT_IST</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::CL::quartet_visitor</span><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">state</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbolsTables::symbol_from_frame_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">DEFN_CONST_IFLD</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"thedark"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"InformLibrary"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"InformParser"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Compass"</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">the_quartet_found</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::CL::quartet_present</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">CodeGen::CL::quartet_present</span></span>:<br/>Instances and Properties - <a href="2-iap.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">the_quartet_found</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b>There's a contrivance here to get around an awkward point of I6 syntax:
an array written in the form
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> </span><span class="identifier-syntax">table</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span><span class="plain-syntax">;</span>
</pre>
<p class="commentary">makes a table with 20 entries, not a table with one entry whose initial value
is 20. We instead compile this as
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">Array</span><span class="plain-syntax"> </span><span class="identifier-syntax">X</span><span class="plain-syntax"> --&gt; </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="constant-syntax">20</span><span class="plain-syntax">;</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::CL::constant</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">CodeGen::CL::constant</span></span>:<br/>Frame Control - <a href="2-fc.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">code_generation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = </span><a href="2-cg.html#SP7" class="function-link"><span class="function-syntax">CodeGen::current</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">con_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterSymbolsTables::symbol_from_frame_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">DEFN_CONST_IFLD</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">INLINE_ARRAY_IANN</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">ACTION_IANN</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">fa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">fa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ft.html#SP19" class="function-link"><span class="function-syntax">CodeGen::Targets::new_action</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">fa</span><span class="plain-syntax">, </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">FAKE_ACTION_IANN</span><span class="plain-syntax">) == </span><span class="constant-syntax">1</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fa</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::duplicate</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">fa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">Str::delete_first_character</span><span class="plain-syntax">(</span><span class="identifier-syntax">fa</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ft.html#SP19" class="function-link"><span class="function-syntax">CodeGen::Targets::new_action</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">fa</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">ifndef_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">VENEER_IANN</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"WORDSIZE"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"TARGET_ZCODE"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"INDIV_PROP_START"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"TARGET_GLULX"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DICT_WORD_SIZE"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"DEBUG"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"cap_short_name"</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ifndef_me</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Inter::Symbols::read_annotation</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">OBJECT_IANN</span><span class="plain-syntax">) &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Release"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Release "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cal.html#SP2" class="function-link"><span class="function-syntax">CodeGen::CL::literal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Packages::scope_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">val1</span><span class="plain-syntax">, </span><span class="identifier-syntax">val2</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Story"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Global Story = "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cal.html#SP2" class="function-link"><span class="function-syntax">CodeGen::CL::literal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Packages::scope_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">val1</span><span class="plain-syntax">, </span><span class="identifier-syntax">val2</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Serial"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">val2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"Serial "</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-cal.html#SP2" class="function-link"><span class="function-syntax">CodeGen::CL::literal</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">Inter::Packages::scope_of</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">), </span><span class="identifier-syntax">val1</span><span class="plain-syntax">, </span><span class="identifier-syntax">val2</span><span class="plain-syntax">, </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">";\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">Str::eq</span><span class="plain-syntax">(</span><span class="identifier-syntax">con_name</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">symbol_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"UUID_ARRAY"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">ID</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">DATA_CONST_IFLD</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Inode::ID_to_text</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">ID</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-ft.html#SP18" class="function-link"><span class="function-syntax">CodeGen::Targets::begin_array</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">gen</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"UUID_ARRAY"</span><span class="plain-syntax">, </span><span class="constant-syntax">BYTE_ARRAY_FORMAT</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">content</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">content</span><span class="plain-syntax">, </span><span class="string-syntax">"UUID:</span><span class="comment-syntax">");</span>
<span class="string-syntax"> for (int i=0, L=Str::len(S); i&lt;L; i++) WRITE_TO(content, "</span><span class="plain-syntax">%</span><span class="identifier-syntax">c</span><span class="string-syntax">", Characters::toupper(Str::get_at(S, i)));</span>
<span class="string-syntax"> WRITE_TO(content, "</span><span class="plain-syntax">//</span><span class="string-syntax">");</span>
<span class="string-syntax"> TEMPORARY_TEXT(length)</span>
<span class="string-syntax"> WRITE_TO(length, "</span><span class="plain-syntax">%</span><span class="identifier-syntax">d</span><span class="string-syntax">", (int) Str::len(content));</span>
<span class="string-syntax"> CodeGen::Targets::array_entry(gen, length, BYTE_ARRAY_FORMAT);</span>
<span class="string-syntax"> DISCARD_TEXT(length)</span>
<span class="string-syntax"> LOOP_THROUGH_TEXT(pos, content) {</span>
<span class="string-syntax"> TEMPORARY_TEXT(ch)</span>
<span class="string-syntax"> WRITE_TO(ch, "</span><span class="character-syntax">'%c'</span><span class="string-syntax">", Str::get(pos));</span>
<span class="string-syntax"> CodeGen::Targets::array_entry(gen, ch, BYTE_ARRAY_FORMAT);</span>
<span class="string-syntax"> DISCARD_TEXT(ch)</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> DISCARD_TEXT(content)</span>
<span class="string-syntax"> CodeGen::Targets::end_array(gen, BYTE_ARRAY_FORMAT);</span>
<span class="string-syntax"> return;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> if (Inter::Constant::is_routine(con_name)) {</span>
<span class="string-syntax"> inter_package *code_block = Inter::Constant::code_block(con_name);</span>
<span class="string-syntax"> CodeGen::Targets::begin_function(2, gen, con_name);</span>
<span class="string-syntax"> void_level = Inter::Defn::get_level(P) + 2;</span>
<span class="string-syntax"> inter_tree_node *D = Inter::Packages::definition(code_block);</span>
<span class="string-syntax"> CodeGen::FC::frame(gen, D);</span>
<span class="string-syntax"> CodeGen::Targets::end_function(2, gen, con_name);</span>
<span class="string-syntax"> return;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> switch (P-&gt;W.data[FORMAT_CONST_IFLD]) {</span>
<span class="string-syntax"> case CONSTANT_INDIRECT_TEXT: {</span>
<span class="string-syntax"> inter_ti ID = P-&gt;W.data[DATA_CONST_IFLD];</span>
<span class="string-syntax"> text_stream *S = Inode::ID_to_text(P, ID);</span>
<span class="string-syntax"> CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(con_name), TRUE, FALSE);</span>
<span class="string-syntax"> CodeGen::Targets::compile_literal_text(gen, S, FALSE, FALSE, FALSE);</span>
<span class="comment-syntax"> WRITE("\"%S\"", S);</span>
<span class="string-syntax"> CodeGen::Targets::end_constant(gen, CodeGen::CL::name(con_name), FALSE);</span>
<span class="string-syntax"> break;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> case CONSTANT_INDIRECT_LIST: {</span>
<span class="string-syntax"> int format = WORD_ARRAY_FORMAT, hang_one = FALSE;</span>
<span class="string-syntax"> int do_not_bracket = FALSE, unsub = FALSE;</span>
<span class="string-syntax"> int X = (P-&gt;W.extent - DATA_CONST_IFLD)/2;</span>
<span class="string-syntax"> if (X == 1) do_not_bracket = TRUE;</span>
<span class="string-syntax"> if (Inter::Symbols::read_annotation(con_name, BYTEARRAY_IANN) == 1) format = BYTE_ARRAY_FORMAT;</span>
<span class="string-syntax"> if (Inter::Symbols::read_annotation(con_name, TABLEARRAY_IANN) == 1) {</span>
<span class="string-syntax"> format = TABLE_ARRAY_FORMAT;</span>
<span class="string-syntax"> if (P-&gt;W.extent - DATA_CONST_IFLD == 2) { format = WORD_ARRAY_FORMAT; hang_one = TRUE; }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1)</span>
<span class="string-syntax"> format = BUFFER_ARRAY_FORMAT;</span>
<span class="string-syntax"> if (Inter::Symbols::read_annotation(con_name, VERBARRAY_IANN) == 1) {</span>
<span class="string-syntax"> WRITE("</span><span class="identifier-syntax">Verb</span><span class="plain-syntax"> </span><span class="string-syntax">"); do_not_bracket = TRUE; unsub = TRUE;</span>
<span class="string-syntax"> if (Inter::Symbols::read_annotation(con_name, METAVERB_IANN) == 1) WRITE("</span><span class="identifier-syntax">meta</span><span class="plain-syntax"> </span><span class="string-syntax">");</span>
<span class="string-syntax"> for (int i=DATA_CONST_IFLD; i&lt;P-&gt;W.extent; i=i+2) {</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax"> </span><span class="string-syntax">");</span>
<span class="string-syntax"> CodeGen::CL::literal(gen, con_name, Inter::Packages::scope_of(P), P-&gt;W.data[i], P-&gt;W.data[i+1], unsub);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax">;</span><span class="string-syntax">");</span>
<span class="string-syntax"> } else {</span>
<span class="string-syntax"> CodeGen::Targets::begin_array(gen, CodeGen::CL::name(con_name), format);</span>
<span class="string-syntax"> if (hang_one) CodeGen::Targets::array_entry(gen, I"</span><span class="constant-syntax">1</span><span class="string-syntax">", format);</span>
<span class="string-syntax"> int entry_count = 0;</span>
<span class="string-syntax"> for (int i=DATA_CONST_IFLD; i&lt;P-&gt;W.extent; i=i+2)</span>
<span class="string-syntax"> if (P-&gt;W.data[i] != DIVIDER_IVAL)</span>
<span class="string-syntax"> entry_count++;</span>
<span class="string-syntax"> if (hang_one) entry_count++;</span>
<span class="string-syntax"> inter_ti e = 0; int ips = FALSE;</span>
<span class="string-syntax"> if ((entry_count == 1) &amp;&amp; (Inter::Symbols::read_annotation(con_name, ASSIMILATED_IANN) &gt;= 0)) {</span>
<span class="string-syntax"> inter_ti val1 = P-&gt;W.data[DATA_CONST_IFLD], val2 = P-&gt;W.data[DATA_CONST_IFLD+1];</span>
<span class="string-syntax"> e = CodeGen::CL::evaluate(gen, Inter::Packages::scope_of(P), val1, val2, &amp;ips);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> if (e &gt; 1) {</span>
<span class="string-syntax"> LOG("</span><span class="identifier-syntax">Entry</span><span class="plain-syntax"> </span><span class="identifier-syntax">count</span><span class="plain-syntax"> </span><span class="constant-syntax">1</span><span class="plain-syntax"> </span><span class="identifier-syntax">on</span><span class="plain-syntax"> %</span><span class="identifier-syntax">S</span><span class="plain-syntax"> </span><span class="identifier-syntax">masks</span><span class="plain-syntax"> %</span><span class="identifier-syntax">d</span><span class="plain-syntax"> </span><span class="identifier-syntax">blanks</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="string-syntax">", CodeGen::CL::name(con_name), e);</span>
<span class="string-syntax"> CodeGen::Targets::array_entries(gen, (int) e, ips, format);</span>
<span class="string-syntax"> } else {</span>
<span class="string-syntax"> for (int i=DATA_CONST_IFLD; i&lt;P-&gt;W.extent; i=i+2) {</span>
<span class="string-syntax"> if (P-&gt;W.data[i] != DIVIDER_IVAL) {</span>
<span class="string-syntax"> TEMPORARY_TEXT(entry)</span>
<span class="string-syntax"> CodeGen::select_temporary(gen, entry);</span>
<span class="string-syntax"> CodeGen::CL::literal(gen, con_name, Inter::Packages::scope_of(P), P-&gt;W.data[i], P-&gt;W.data[i+1], unsub);</span>
<span class="string-syntax"> CodeGen::deselect_temporary(gen);</span>
<span class="string-syntax"> CodeGen::Targets::array_entry(gen, entry, format);</span>
<span class="string-syntax"> DISCARD_TEXT(entry)</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> CodeGen::Targets::end_array(gen, format);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="string-syntax">");</span>
<span class="string-syntax"> break;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> case CONSTANT_SUM_LIST:</span>
<span class="string-syntax"> case CONSTANT_PRODUCT_LIST:</span>
<span class="string-syntax"> case CONSTANT_DIFFERENCE_LIST:</span>
<span class="string-syntax"> case CONSTANT_QUOTIENT_LIST: {</span>
<span class="string-syntax"> int depth = CodeGen::CL::constant_depth(con_name);</span>
<span class="string-syntax"> if (depth &gt; 1) {</span>
<span class="string-syntax"> LOGIF(CONSTANT_DEPTH_CALCULATION,</span>
<span class="string-syntax"> "</span><span class="identifier-syntax">Con</span><span class="plain-syntax"> %</span><span class="identifier-syntax">S</span><span class="plain-syntax"> </span><span class="identifier-syntax">has</span><span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax"> %</span><span class="identifier-syntax">d</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="string-syntax">", con_name-&gt;symbol_name, depth);</span>
<span class="string-syntax"> CodeGen::CL::constant_depth(con_name);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::basic_constant_segment(gen, depth));</span>
<span class="string-syntax"> text_stream *OUT = CodeGen::current(gen);</span>
<span class="string-syntax"> CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(con_name), TRUE, FALSE);</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax">(</span><span class="string-syntax">");</span>
<span class="string-syntax"> for (int i=DATA_CONST_IFLD; i&lt;P-&gt;W.extent; i=i+2) {</span>
<span class="string-syntax"> if (i&gt;DATA_CONST_IFLD) {</span>
<span class="string-syntax"> if (P-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_SUM_LIST) WRITE("</span><span class="plain-syntax"> + </span><span class="string-syntax">");</span>
<span class="string-syntax"> if (P-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_PRODUCT_LIST) WRITE("</span><span class="plain-syntax"> * </span><span class="string-syntax">");</span>
<span class="string-syntax"> if (P-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_DIFFERENCE_LIST) WRITE("</span><span class="plain-syntax"> - </span><span class="string-syntax">");</span>
<span class="string-syntax"> if (P-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_QUOTIENT_LIST) WRITE("</span><span class="plain-syntax"> / </span><span class="string-syntax">");</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> int bracket = TRUE;</span>
<span class="string-syntax"> if ((P-&gt;W.data[i] == LITERAL_IVAL) || (Inter::Symbols::is_stored_in_data(P-&gt;W.data[i], P-&gt;W.data[i+1]))) bracket = FALSE;</span>
<span class="string-syntax"> if (bracket) WRITE("</span><span class="plain-syntax">(</span><span class="string-syntax">");</span>
<span class="string-syntax"> CodeGen::CL::literal(gen, con_name, Inter::Packages::scope_of(P), P-&gt;W.data[i], P-&gt;W.data[i+1], FALSE);</span>
<span class="string-syntax"> if (bracket) WRITE("</span><span class="plain-syntax">)</span><span class="string-syntax">");</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax">)</span><span class="string-syntax">");</span>
<span class="string-syntax"> CodeGen::Targets::end_constant(gen, CodeGen::CL::name(con_name), FALSE);</span>
<span class="string-syntax"> CodeGen::deselect(gen, saved);</span>
<span class="string-syntax"> break;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> case CONSTANT_DIRECT: {</span>
<span class="string-syntax"> int depth = CodeGen::CL::constant_depth(con_name);</span>
<span class="string-syntax"> if (depth &gt; 1) LOGIF(CONSTANT_DEPTH_CALCULATION,</span>
<span class="string-syntax"> "</span><span class="identifier-syntax">Con</span><span class="plain-syntax"> %</span><span class="identifier-syntax">S</span><span class="plain-syntax"> </span><span class="identifier-syntax">has</span><span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax"> %</span><span class="identifier-syntax">d</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="string-syntax">", con_name-&gt;symbol_name, depth);</span>
<span class="string-syntax"> generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::basic_constant_segment(gen, depth));</span>
<span class="string-syntax"> CodeGen::Targets::begin_constant(gen, CodeGen::CL::name(con_name), TRUE, ifndef_me);</span>
<span class="string-syntax"> inter_ti val1 = P-&gt;W.data[DATA_CONST_IFLD];</span>
<span class="string-syntax"> inter_ti val2 = P-&gt;W.data[DATA_CONST_IFLD + 1];</span>
<span class="string-syntax"> CodeGen::CL::literal(gen, con_name, Inter::Packages::scope_of(P), val1, val2, FALSE);</span>
<span class="string-syntax"> CodeGen::Targets::end_constant(gen, CodeGen::CL::name(con_name), ifndef_me);</span>
<span class="string-syntax"> CodeGen::deselect(gen, saved);</span>
<span class="string-syntax"> break;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> default: internal_error("</span><span class="identifier-syntax">ungenerated</span><span class="plain-syntax"> </span><span class="identifier-syntax">constant</span><span class="plain-syntax"> </span><span class="identifier-syntax">format</span><span class="string-syntax">");</span>
<span class="string-syntax"> }</span>
<span class="string-syntax">}</span>
<span class="string-syntax">int CodeGen::CL::constant_depth(inter_symbol *con) {</span>
<span class="string-syntax"> LOG_INDENT;</span>
<span class="string-syntax"> int d = CodeGen::CL::constant_depth_inner(con);</span>
<span class="string-syntax"> LOGIF(CONSTANT_DEPTH_CALCULATION, "</span><span class="plain-syntax">%</span><span class="identifier-syntax">S</span><span class="plain-syntax"> </span><span class="identifier-syntax">has</span><span class="plain-syntax"> </span><span class="identifier-syntax">depth</span><span class="plain-syntax"> %</span><span class="identifier-syntax">d</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="string-syntax">", con-&gt;symbol_name, d);</span>
<span class="string-syntax"> LOG_OUTDENT;</span>
<span class="string-syntax"> return d;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">int CodeGen::CL::constant_depth_inner(inter_symbol *con) {</span>
<span class="string-syntax"> if (con == NULL) return 1;</span>
<span class="string-syntax"> inter_tree_node *D = Inter::Symbols::definition(con);</span>
<span class="string-syntax"> if (D-&gt;W.data[ID_IFLD] != CONSTANT_IST) return 1;</span>
<span class="string-syntax"> if (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_DIRECT) {</span>
<span class="string-syntax"> inter_ti val1 = D-&gt;W.data[DATA_CONST_IFLD];</span>
<span class="string-syntax"> inter_ti val2 = D-&gt;W.data[DATA_CONST_IFLD + 1];</span>
<span class="string-syntax"> if (val1 == ALIAS_IVAL) {</span>
<span class="string-syntax"> inter_symbol *alias =</span>
<span class="string-syntax"> InterSymbolsTables::symbol_from_data_pair_and_table(</span>
<span class="string-syntax"> val1, val2, Inter::Packages::scope(D-&gt;package));</span>
<span class="string-syntax"> return CodeGen::CL::constant_depth(alias) + 1;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> return 1;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> if ((D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_SUM_LIST) ||</span>
<span class="string-syntax"> (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_PRODUCT_LIST) ||</span>
<span class="string-syntax"> (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_DIFFERENCE_LIST) ||</span>
<span class="string-syntax"> (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_QUOTIENT_LIST)) {</span>
<span class="string-syntax"> int total = 0;</span>
<span class="string-syntax"> for (int i=DATA_CONST_IFLD; i&lt;D-&gt;W.extent; i=i+2) {</span>
<span class="string-syntax"> inter_ti val1 = D-&gt;W.data[i];</span>
<span class="string-syntax"> inter_ti val2 = D-&gt;W.data[i + 1];</span>
<span class="string-syntax"> if (val1 == ALIAS_IVAL) {</span>
<span class="string-syntax"> inter_symbol *alias =</span>
<span class="string-syntax"> InterSymbolsTables::symbol_from_data_pair_and_table(</span>
<span class="string-syntax"> val1, val2, Inter::Packages::scope(D-&gt;package));</span>
<span class="string-syntax"> total += CodeGen::CL::constant_depth(alias);</span>
<span class="string-syntax"> } else total++;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> return 1 + total;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> return 1;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">typedef struct text_literal_holder {</span>
<span class="string-syntax"> struct text_stream *definition_code;</span>
<span class="string-syntax"> struct text_stream *literal_content;</span>
<span class="string-syntax"> CLASS_DEFINITION</span>
<span class="string-syntax">} text_literal_holder;</span>
<span class="string-syntax">text_stream *CodeGen::CL::literal_text_at(code_generation *gen, text_stream *S) {</span>
<span class="string-syntax"> text_literal_holder *tlh = CREATE(text_literal_holder);</span>
<span class="string-syntax"> tlh-&gt;definition_code = Str::new();</span>
<span class="string-syntax"> tlh-&gt;literal_content = S;</span>
<span class="string-syntax"> return tlh-&gt;definition_code;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">int CodeGen::CL::compare_tlh(const void *elem1, const void *elem2) {</span>
<span class="string-syntax"> const text_literal_holder **e1 = (const text_literal_holder **) elem1;</span>
<span class="string-syntax"> const text_literal_holder **e2 = (const text_literal_holder **) elem2;</span>
<span class="string-syntax"> if ((*e1 == NULL) || (*e2 == NULL))</span>
<span class="string-syntax"> internal_error("</span><span class="identifier-syntax">Disaster</span><span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> </span><span class="identifier-syntax">sorting</span><span class="plain-syntax"> </span><span class="identifier-syntax">text</span><span class="plain-syntax"> </span><span class="identifier-syntax">literals</span><span class="string-syntax">");</span>
<span class="string-syntax"> text_stream *s1 = (*e1)-&gt;literal_content;</span>
<span class="string-syntax"> text_stream *s2 = (*e2)-&gt;literal_content;</span>
<span class="string-syntax"> return Str::cmp(s1, s2);</span>
<span class="string-syntax">}</span>
<span class="string-syntax">void CodeGen::CL::sort_literals(code_generation *gen) {</span>
<span class="string-syntax"> int no_tlh = NUMBER_CREATED(text_literal_holder);</span>
<span class="string-syntax"> text_literal_holder **sorted = (text_literal_holder **)</span>
<span class="string-syntax"> (Memory::calloc(no_tlh, sizeof(text_literal_holder *), CODE_GENERATION_MREASON));</span>
<span class="string-syntax"> int i = 0;</span>
<span class="string-syntax"> text_literal_holder *tlh;</span>
<span class="string-syntax"> LOOP_OVER(tlh, text_literal_holder) sorted[i++] = tlh;</span>
<span class="string-syntax"> qsort(sorted, (size_t) no_tlh, sizeof(text_literal_holder *), CodeGen::CL::compare_tlh);</span>
<span class="string-syntax"> for (int i=0; i&lt;no_tlh; i++) {</span>
<span class="string-syntax"> text_literal_holder *tlh = sorted[i];</span>
<span class="string-syntax"> generated_segment *saved = CodeGen::select(gen, CodeGen::Targets::tl_segment(gen));</span>
<span class="string-syntax"> text_stream *TO = CodeGen::current(gen);</span>
<span class="string-syntax"> WRITE_TO(TO, "</span><span class="plain-syntax">%</span><span class="identifier-syntax">S</span><span class="string-syntax">", tlh-&gt;definition_code);</span>
<span class="string-syntax"> CodeGen::deselect(gen, saved);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax">}</span>
<span class="string-syntax">void CodeGen::CL::enter_box_mode(void) {</span>
<span class="string-syntax"> box_mode = TRUE;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">void CodeGen::CL::exit_box_mode(void) {</span>
<span class="string-syntax"> box_mode = FALSE;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">void CodeGen::CL::enter_print_mode(void) {</span>
<span class="string-syntax"> printing_mode = TRUE;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">void CodeGen::CL::exit_print_mode(void) {</span>
<span class="string-syntax"> printing_mode = FALSE;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">inter_ti CodeGen::CL::evaluate(code_generation *gen, inter_symbols_table *T, inter_ti val1, inter_ti val2, int *ips) {</span>
<span class="string-syntax"> if (val1 == LITERAL_IVAL) return val2;</span>
<span class="string-syntax"> if (Inter::Symbols::is_stored_in_data(val1, val2)) {</span>
<span class="string-syntax"> inter_symbol *aliased = InterSymbolsTables::symbol_from_data_pair_and_table(val1, val2, T);</span>
<span class="string-syntax"> if (aliased == NULL) internal_error("</span><span class="identifier-syntax">bad</span><span class="plain-syntax"> </span><span class="identifier-syntax">aliased</span><span class="plain-syntax"> </span><span class="identifier-syntax">symbol</span><span class="string-syntax">");</span>
<span class="string-syntax"> inter_tree_node *D = aliased-&gt;definition;</span>
<span class="string-syntax"> if (D == NULL) internal_error("</span><span class="identifier-syntax">undefined</span><span class="plain-syntax"> </span><span class="identifier-syntax">symbol</span><span class="string-syntax">");</span>
<span class="string-syntax"> switch (D-&gt;W.data[FORMAT_CONST_IFLD]) {</span>
<span class="string-syntax"> case CONSTANT_DIRECT: {</span>
<span class="string-syntax"> inter_ti dval1 = D-&gt;W.data[DATA_CONST_IFLD];</span>
<span class="string-syntax"> inter_ti dval2 = D-&gt;W.data[DATA_CONST_IFLD + 1];</span>
<span class="string-syntax"> inter_ti e = CodeGen::CL::evaluate(gen, Inter::Packages::scope_of(D), dval1, dval2, ips);</span>
<span class="string-syntax"> if (e == 0) {</span>
<span class="string-syntax"> text_stream *S = CodeGen::CL::name(aliased);</span>
<span class="string-syntax"> if (Str::eq(S, I"</span><span class="identifier-syntax">INDIV_PROP_START</span><span class="string-syntax">")) *ips = TRUE;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> LOG("</span><span class="identifier-syntax">Eval</span><span class="plain-syntax"> </span><span class="reserved-syntax">const</span><span class="plain-syntax"> $3 = %</span><span class="identifier-syntax">d</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="string-syntax">", aliased, e);</span>
<span class="string-syntax"> return e;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> case CONSTANT_SUM_LIST:</span>
<span class="string-syntax"> case CONSTANT_PRODUCT_LIST:</span>
<span class="string-syntax"> case CONSTANT_DIFFERENCE_LIST:</span>
<span class="string-syntax"> case CONSTANT_QUOTIENT_LIST: {</span>
<span class="string-syntax"> inter_ti result = 0;</span>
<span class="string-syntax"> for (int i=DATA_CONST_IFLD; i&lt;D-&gt;W.extent; i=i+2) {</span>
<span class="string-syntax"> inter_ti extra = CodeGen::CL::evaluate(gen, Inter::Packages::scope_of(D), D-&gt;W.data[i], D-&gt;W.data[i+1], ips);</span>
<span class="string-syntax"> if (i == DATA_CONST_IFLD) result = extra;</span>
<span class="string-syntax"> else {</span>
<span class="string-syntax"> if (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_SUM_LIST) result = result + extra;</span>
<span class="string-syntax"> if (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_PRODUCT_LIST) result = result * extra;</span>
<span class="string-syntax"> if (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_DIFFERENCE_LIST) result = result - extra;</span>
<span class="string-syntax"> if (D-&gt;W.data[FORMAT_CONST_IFLD] == CONSTANT_QUOTIENT_LIST) result = result / extra;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> return result;</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> return 0;</span>
<span class="string-syntax">}</span>
<span class="string-syntax">void CodeGen::CL::literal(code_generation *gen, inter_symbol *con_name, inter_symbols_table *T, inter_ti val1, inter_ti val2, int unsub) {</span>
<span class="string-syntax"> inter_tree *I = gen-&gt;from;</span>
<span class="string-syntax"> text_stream *OUT = CodeGen::current(gen);</span>
<span class="string-syntax"> if (val1 == LITERAL_IVAL) {</span>
<span class="string-syntax"> int hex = FALSE;</span>
<span class="string-syntax"> if ((con_name) &amp;&amp; (Inter::Annotations::find(&amp;(con_name-&gt;ann_set), HEX_IANN))) hex = TRUE;</span>
<span class="string-syntax"> CodeGen::Targets::compile_literal_number(gen, val2, hex);</span>
<span class="string-syntax"> } else if (Inter::Symbols::is_stored_in_data(val1, val2)) {</span>
<span class="string-syntax"> inter_symbol *aliased = InterSymbolsTables::symbol_from_data_pair_and_table(val1, val2, T);</span>
<span class="string-syntax"> if (aliased == NULL) internal_error("</span><span class="identifier-syntax">bad</span><span class="plain-syntax"> </span><span class="identifier-syntax">aliased</span><span class="plain-syntax"> </span><span class="identifier-syntax">symbol</span><span class="string-syntax">");</span>
<span class="string-syntax"> if (aliased == verb_directive_divider_symbol) WRITE("</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="plain-syntax">\</span><span class="identifier-syntax">t</span><span class="plain-syntax">*</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_reverse_symbol) WRITE("</span><span class="identifier-syntax">reverse</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_slash_symbol) WRITE("</span><span class="plain-syntax">/</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_result_symbol) WRITE("</span><span class="plain-syntax">-&gt;</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_special_symbol) WRITE("</span><span class="identifier-syntax">special</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_number_symbol) WRITE("</span><span class="identifier-syntax">number</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_noun_symbol) WRITE("</span><span class="identifier-syntax">noun</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_multi_symbol) WRITE("</span><span class="identifier-syntax">multi</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_multiinside_symbol) WRITE("</span><span class="identifier-syntax">multiinside</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_multiheld_symbol) WRITE("</span><span class="identifier-syntax">multiheld</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_held_symbol) WRITE("</span><span class="identifier-syntax">held</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_creature_symbol) WRITE("</span><span class="identifier-syntax">creature</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_topic_symbol) WRITE("</span><span class="identifier-syntax">topic</span><span class="string-syntax">");</span>
<span class="string-syntax"> else if (aliased == verb_directive_multiexcept_symbol) WRITE("</span><span class="identifier-syntax">multiexcept</span><span class="string-syntax">");</span>
<span class="string-syntax"> else {</span>
<span class="string-syntax"> if ((unsub) &amp;&amp; (Inter::Symbols::read_annotation(aliased, SCOPE_FILTER_IANN) == 1))</span>
<span class="string-syntax"> WRITE("</span><span class="identifier-syntax">scope</span><span class="plain-syntax">=</span><span class="string-syntax">");</span>
<span class="string-syntax"> if ((unsub) &amp;&amp; (Inter::Symbols::read_annotation(aliased, NOUN_FILTER_IANN) == 1))</span>
<span class="string-syntax"> WRITE("</span><span class="identifier-syntax">noun</span><span class="plain-syntax">=</span><span class="string-syntax">");</span>
<span class="string-syntax"> text_stream *S = CodeGen::CL::name(aliased);</span>
<span class="string-syntax"> if ((unsub) &amp;&amp; (Str::begins_with_wide_string(S, L"</span><span class="plain-syntax">##</span><span class="string-syntax">"))) {</span>
<span class="string-syntax"> LOOP_THROUGH_TEXT(pos, S)</span>
<span class="string-syntax"> if (pos.index &gt;= 2)</span>
<span class="string-syntax"> PUT(Str::get(pos));</span>
<span class="string-syntax"> } else {</span>
<span class="string-syntax"> CodeGen::Targets::mangle(gen, OUT, S);</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> }</span>
<span class="string-syntax"> } else if (val1 == DIVIDER_IVAL) {</span>
<span class="string-syntax"> text_stream *divider_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax"> ! %</span><span class="identifier-syntax">S</span><span class="plain-syntax">\</span><span class="identifier-syntax">n</span><span class="plain-syntax">\</span><span class="identifier-syntax">t</span><span class="string-syntax">", divider_text);</span>
<span class="string-syntax"> } else if (val1 == REAL_IVAL) {</span>
<span class="string-syntax"> text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);</span>
<span class="string-syntax"> CodeGen::Targets::compile_literal_real(gen, glob_text);</span>
<span class="string-syntax"> } else if (val1 == DWORD_IVAL) {</span>
<span class="string-syntax"> text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);</span>
<span class="string-syntax"> CodeGen::Targets::compile_dictionary_word(gen, glob_text, FALSE);</span>
<span class="string-syntax"> } else if (val1 == PDWORD_IVAL) {</span>
<span class="string-syntax"> text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);</span>
<span class="string-syntax"> CodeGen::Targets::compile_dictionary_word(gen, glob_text, TRUE);</span>
<span class="string-syntax"> } else if (val1 == LITERAL_TEXT_IVAL) {</span>
<span class="string-syntax"> text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);</span>
<span class="string-syntax"> CodeGen::Targets::compile_literal_text(gen, glob_text, printing_mode, box_mode, TRUE);</span>
<span class="string-syntax"> } else if (val1 == GLOB_IVAL) {</span>
<span class="string-syntax"> text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);</span>
<span class="string-syntax"> WRITE("</span><span class="plain-syntax">%</span><span class="identifier-syntax">S</span><span class="string-syntax">", glob_text);</span>
<span class="string-syntax"> } else internal_error("</span><span class="identifier-syntax">unimplemented</span><span class="plain-syntax"> </span><span class="identifier-syntax">direct</span><span class="plain-syntax"> </span><span class="identifier-syntax">constant</span><span class="string-syntax">");</span>
<span class="string-syntax">}</span>
<span class="string-syntax">text_stream *CodeGen::CL::name(inter_symbol *symb) {</span>
<span class="string-syntax"> if (symb == NULL) return NULL;</span>
<span class="string-syntax"> if (Inter::Symbols::get_translate(symb)) return Inter::Symbols::get_translate(symb);</span>
<span class="string-syntax"> return symb-&gt;symbol_name;</span>
<span class="string-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The function CodeGen::CL::constant_depth appears nowhere else.</li><li>The function CodeGen::CL::constant_depth_inner appears nowhere else.</li><li>The function CodeGen::CL::literal_text_at is used in Frame Control (<a href="2-fc.html#SP1">&#167;1</a>).</li><li>The function CodeGen::CL::compare_tlh appears nowhere else.</li><li>The function CodeGen::CL::sort_literals is used in Code Generation (<a href="2-cg.html#SP8_3">&#167;8.3</a>).</li><li>The function CodeGen::CL::enter_box_mode is used in Frame Control (<a href="2-fc.html#SP3">&#167;3</a>).</li><li>The function CodeGen::CL::exit_box_mode is used in Frame Control (<a href="2-fc.html#SP3">&#167;3</a>).</li><li>The function CodeGen::CL::enter_print_mode is used in Frame Control (<a href="2-fc.html#SP3">&#167;3</a>).</li><li>The function CodeGen::CL::exit_print_mode is used in Frame Control (<a href="2-fc.html#SP3">&#167;3</a>).</li><li>The function CodeGen::CL::evaluate appears nowhere else.</li><li>The function CodeGen::CL::literal is used in Frame Control (<a href="2-fc.html#SP2">&#167;2</a>), Instances and Properties (<a href="2-iap.html#SP5_8_5_1_1">&#167;5.8.5.1.1</a>, <a href="2-iap.html#SP8">&#167;8</a>), Generating Inform 6 (<a href="4-fi6.html#SP8">&#167;8</a>), C Global Variables (<a href="5-cgv.html#SP2">&#167;2</a>).</li><li>The function CodeGen::CL::name is used in Frame Control (<a href="2-fc.html#SP2">&#167;2</a>), Instances and Properties (<a href="2-iap.html#SP4_5">&#167;4.5</a>, <a href="2-iap.html#SP4_6">&#167;4.6</a>, <a href="2-iap.html#SP5_5">&#167;5.5</a>, <a href="2-iap.html#SP5_7">&#167;5.7</a>, <a href="2-iap.html#SP5_8_4">&#167;5.8.4</a>, <a href="2-iap.html#SP5_9">&#167;5.9</a>, <a href="2-iap.html#SP5_11">&#167;5.11</a>, <a href="2-iap.html#SP5_11_2">&#167;5.11.2</a>, <a href="2-iap.html#SP5_11_2_1">&#167;5.11.2.1</a>, <a href="2-iap.html#SP5_11_2_2">&#167;5.11.2.2</a>, <a href="2-iap.html#SP6">&#167;6</a>, <a href="2-iap.html#SP8">&#167;8</a>), Generating Inform 6 (<a href="4-fi6.html#SP7">&#167;7</a>, <a href="4-fi6.html#SP8">&#167;8</a>), C Object Model (<a href="5-com.html#SP6">&#167;6</a>), C Function Model (<a href="5-cfm.html#SP1">&#167;1</a>), C Global Variables (<a href="5-cgv.html#SP2">&#167;2</a>).</li><li>The structure text_literal_holder is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">CodeGen::CL::node_is_ref_to</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">CodeGen::CL::node_is_ref_to</span></span>:<br/>C Memory Model - <a href="5-cmm.html#SP12">&#167;12</a><br/>C Object Model - <a href="5-com.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">inter_tree</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_tree_node</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">seek_bip</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">reffed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">ID_IFLD</span><span class="plain-syntax">] == </span><span class="identifier-syntax">REFERENCE_IST</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">InterTree::first_child</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">reffed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">ID_IFLD</span><span class="plain-syntax">] == </span><span class="identifier-syntax">INV_IST</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">W</span><span class="plain-syntax">.</span><span class="identifier-syntax">data</span><span class="plain-syntax">[</span><span class="identifier-syntax">METHOD_INV_IFLD</span><span class="plain-syntax">] == </span><span class="identifier-syntax">INVOKED_PRIMITIVE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_symbol</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prim</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Inter::Inv::invokee</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">inter_ti</span><span class="plain-syntax"> </span><span class="identifier-syntax">bip</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Primitives::to_bip</span><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">prim</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">bip</span><span class="plain-syntax"> == </span><span class="identifier-syntax">seek_bip</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">reffed</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="2-fc.html">&#10094;</a></li><li class="progresschapter"><a href="1-fm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-cg.html">cg</a></li><li class="progresssection"><a href="2-fc.html">fc</a></li><li class="progresscurrent">cal</li><li class="progresssection"><a href="2-iap.html">iap</a></li><li class="progresssection"><a href="2-vrb.html">vrb</a></li><li class="progresssection"><a href="2-ft.html">ft</a></li><li class="progresschapter"><a href="3-fti.html">3</a></li><li class="progresschapter"><a href="4-fi6.html">4</a></li><li class="progresschapter"><a href="5-fnc.html">5</a></li><li class="progressnext"><a href="2-iap.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>