mirror of
https://github.com/ganelson/inform.git
synced 2024-07-16 22:14:23 +03:00
414 lines
78 KiB
HTML
414 lines
78 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Stack Frames</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="index.html"><span class="selectedlink">core</span></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="../codegen-module/index.html">codegen</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 'Stack Frames' generated by Inweb-->
|
|
<div class="breadcrumbs">
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="../compiler.html">Inform7 Modules</a></li><li><a href="index.html">core</a></li><li><a href="index.html#24">Chapter 24: Compilation Context</a></li><li><b>Stack Frames</b></li></ul></div>
|
|
<p class="purpose">When Inform compiles phrase invocations, or implied forms of these such as text substitutions, it does so in the context of a "stack frame". This provides for local "let" values, manages loop blocks, and in general looks after any information shared between a whole sequence of invocations.</p>
|
|
|
|
<ul class="toc"><li><a href="24-sf.html#SP4">§4. Creation</a></li><li><a href="24-sf.html#SP7">§7. The current stack frame</a></li><li><a href="24-sf.html#SP8">§8. Kinds</a></li><li><a href="24-sf.html#SP10">§10. Stacked variables</a></li><li><a href="24-sf.html#SP11">§11. Past tense</a></li><li><a href="24-sf.html#SP12">§12. Logging</a></li><li><a href="24-sf.html#SP13">§13. Formal parameter allocation</a></li><li><a href="24-sf.html#SP14">§14. Pointer value allocation</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. </b>As we've seen, each phrase has its own stack frame, which is a structure
|
|
inside the <span class="extract"><span class="extract-syntax">phrase</span></span> structure. But they can also exist independently, for
|
|
other occasions when compilation occurs. They keep track of which variables
|
|
are visible, and also of the current values of the kind variables A to Z,
|
|
if any, and the consequent return kind.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">locals_slate</span><span class="plain-syntax"> </span><span class="identifier-syntax">local_value_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> those in scope here</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">local_stvol</span><span class="plain-syntax">; </span><span class="comment-syntax"> those in scope here</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">allocated_pointers</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">no_formal_parameters_needed</span><span class="plain-syntax">; </span><span class="comment-syntax"> usually 0, unless there are ambiguities</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kind_returned</span><span class="plain-syntax">; </span><span class="comment-syntax"> or </span><span class="extract"><span class="extract-syntax">NULL</span></span><span class="comment-syntax"> for no return value</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax">; </span><span class="comment-syntax"> points to an array indexed 1 to 26</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">determines_past_conditions</span><span class="plain-syntax">; </span><span class="comment-syntax"> or rather, in the present, but for future use</span>
|
|
<span class="plain-syntax">} </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>The structure ph_stack_frame is accessed in 24/lv, 26/rt and here.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>§2. </b>Stack frames are often made fleetingly and then thrown away, but sometimes
|
|
we need to make one and keep it around. For this, we have the ability to box
|
|
up a stack frame: by allocating an instance of the following structure, we
|
|
can have a permanently valid pointer to a unique new PHSF.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">boxed_phsf</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
|
<span class="plain-syntax">} </span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>The structure ph_stack_frame_box is private to this section.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>§3. </b>Within each stack frame is a linked list of notes about pointer values
|
|
for which memory allocation and deallocation will be needed:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">heap_allocation</span><span class="plain-syntax"> </span><span class="identifier-syntax">allocation</span><span class="plain-syntax">; </span><span class="comment-syntax"> needed to compile a function call returning a pointer to a new value</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">local_reference_code</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 lvalue for the storage holding the pointer</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">escaped_local_reference_code</span><span class="plain-syntax">; </span><span class="comment-syntax"> the same, but suitable for schema use</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">schema_for_promotion</span><span class="plain-syntax">; </span><span class="comment-syntax"> an I6 schema for promoting this value</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_index</span><span class="plain-syntax">; </span><span class="comment-syntax"> start of small block wrt current stack frame</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">offset_past</span><span class="plain-syntax">; </span><span class="comment-syntax"> just past the end of the small block</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax">; </span><span class="comment-syntax"> within the linked list</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">CLASS_DEFINITION</span>
|
|
<span class="plain-syntax">} </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax">;</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>The structure pointer_allocation is accessed in 26/rt and here.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>§4. Creation. </b>A completely black stack frame...
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::new</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">Frames::new</span></span>:<br/><a href="24-sf.html#SP5">§5</a><br/>Text Substitutions - <a href="17-ts.html#SP4">§4</a><br/>Phrases - <a href="22-ph.html#SP5_5">§5.5</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">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax"> = </span><a href="24-lv.html#SP4" class="function-link"><span class="function-syntax">LocalVariables::blank_slate</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_stvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">determines_past_conditions</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">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">allocated_pointers</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">kind_returned</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">.</span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</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">phsf</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>§5. </b>...can be useful all by itself. The following is used to make a temporary
|
|
stack frame suitable for "nonphrasal" compilation, that is, for when Inform
|
|
wants to compile an I6 routine for some purpose other than to define a phrase.
|
|
</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">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::new_nonphrasal</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">Frames::new_nonphrasal</span></span>:<br/>Routines - <a href="26-rt.html#SP3_1">§3.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">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't nest nonphrasal stack frames"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP4" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::make_current</span></a><span class="plain-syntax">(&</span><span class="identifier-syntax">nonphrasal_stack_frame</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">nonphrasal_stack_frame</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">Frames::remove_nonphrase_stack_frame</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">Frames::remove_nonphrase_stack_frame</span></span>:<br/>Phrase Usage - <a href="22-pu.html#SP20_1_1">§20.1.1</a><br/>Routines - <a href="26-rt.html#SP4">§4</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="identifier-syntax">nonphrasal_stack_frame</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP4" class="function-link"><span class="function-syntax">Frames::new</span></a><span class="plain-syntax">(); </span><span class="comment-syntax"> to prevent accidental lucky misuse</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">nonphrasal_stack_frame_is_current</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::remove_current</span></a><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>§6. </b>Another way to get hold of a PHSF is to request a boxed one, as noted above:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::boxed_frame</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">Frames::boxed_frame</span></span>:<br/>Text Substitutions - <a href="17-ts.html#SP4">§4</a>, <a href="17-ts.html#SP7">§7</a><br/>Responses - <a href="17-rs.html#SP4">§4</a>, <a href="17-rs.html#SP11_1_1">§11.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsfb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame_box</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">-></span><span class="identifier-syntax">boxed_phsf</span><span class="plain-syntax"> = *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="24-lv.html#SP5" class="function-link"><span class="function-syntax">LocalVariables::deep_copy_locals_slate</span></a><span class="plain-syntax">(&(</span><span class="identifier-syntax">phsfb</span><span class="plain-syntax">-></span><span class="element-syntax">boxed_phsf</span><span class="plain-syntax">.</span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">),</span>
|
|
<span class="plain-syntax"> &(</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_value_variables</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">phsfb</span><span class="plain-syntax">-></span><span class="element-syntax">boxed_phsf</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. The current stack frame. </b>At any given time, a single stack frame is valid for local variable names
|
|
and phrase option names used as conditions. It will be the nonphrasal one
|
|
if that's active, and otherwise must be set as needed.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::current_stack_frame</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Frames::current_stack_frame</span></span>:<br/><a href="24-sf.html#SP8">§8</a>, <a href="24-sf.html#SP9">§9</a>, <a href="24-sf.html#SP10">§10</a>, <a href="24-sf.html#SP11">§11</a>, <a href="24-sf.html#SP13">§13</a>, <a href="24-sf.html#SP14">§14</a><br/>Adjective Meanings - <a href="7-am.html#SP35_2">§35.2</a>, <a href="7-am.html#SP35_2_1">§35.2.1</a><br/>Relations - <a href="7-rlt.html#SP24">§24</a><br/>Constants and Descriptions - <a href="10-cad.html#SP19_2">§19.2</a><br/>Type Expressions and Values - <a href="10-teav.html#SP14">§14</a>, <a href="10-teav.html#SP15">§15</a><br/>Measurement Adjectives - <a href="15-ma.html#SP12">§12</a><br/>Text Substitutions - <a href="17-ts.html#SP4">§4</a>, <a href="17-ts.html#SP7">§7</a>, <a href="17-ts.html#SP9">§9</a>, <a href="17-ts.html#SP11">§11</a><br/>Responses - <a href="17-rs.html#SP11_1_1">§11.1.1</a><br/>Equations - <a href="20-eq.html#SP45_3">§45.3</a><br/>Phrase Usage - <a href="22-pu.html#SP20_1_1">§20.1.1</a><br/>Local Variables - <a href="24-lv.html#SP9">§9</a>, <a href="24-lv.html#SP10">§10</a>, <a href="24-lv.html#SP19">§19</a>, <a href="24-lv.html#SP20">§20</a>, <a href="24-lv.html#SP21">§21</a>, <a href="24-lv.html#SP22">§22</a>, <a href="24-lv.html#SP25">§25</a>, <a href="24-lv.html#SP26">§26</a>, <a href="24-lv.html#SP29">§29</a>, <a href="24-lv.html#SP30">§30</a>, <a href="24-lv.html#SP32">§32</a>, <a href="24-lv.html#SP32_3">§32.3</a>, <a href="24-lv.html#SP40">§40</a>, <a href="24-lv.html#SP41">§41</a><br/>Phrase Blocks - <a href="24-pb.html#SP7">§7</a>, <a href="24-pb.html#SP17">§17</a>, <a href="24-pb.html#SP18">§18</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">current_frame</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">Frames::make_current</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Frames::make_current</span></span>:<br/><a href="24-sf.html#SP5">§5</a><br/>Construction Sequence - <a href="22-cs.html#SP7">§7</a><br/>Phrase Runtime Context Data - <a href="22-prcd.html#SP8">§8</a><br/>Compile Phrases - <a href="25-cp.html#SP2_2">§2.2</a><br/>Routines - <a href="26-rt.html#SP3_1">§3.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"can't select null stack frame"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</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">Frames::remove_current</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">Frames::remove_current</span></span>:<br/><a href="24-sf.html#SP5">§5</a><br/>Construction Sequence - <a href="22-cs.html#SP7">§7</a><br/>Routines - <a href="26-rt.html#SP4">§4</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="identifier-syntax">current_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>§8. Kinds. </b>The kind of value we expect to return from within this stack frame, if any.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_kind_returned</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">Frames::set_kind_returned</span></span>:<br/>Phrase Type Data - <a href="22-ptd.html#SP19">§19</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="identifier-syntax">kind_returned</span><span class="plain-syntax"> = </span><span class="identifier-syntax">K</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_kind_returned</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">Frames::get_kind_returned</span></span>:<br/>Compile Invocations Inline - <a href="25-cii.html#SP3_1_1_4_7_1">§3.1.1.4.7.1</a>, <a href="25-cii.html#SP7">§7</a><br/>Compile Phrases - <a href="25-cp.html#SP2_3_1">§2.3.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">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</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">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">kind_returned</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>§9. </b>And the values of the kind variables A to Z:
|
|
</p>
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">KIND_VARIABLE_FROM_CONTEXT</span><span class="plain-syntax"> </span><a href="24-sf.html#SP9" class="function-link"><span class="function-syntax">Frames::get_kind_variable</span></a>
|
|
</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">Frames::set_kind_variables</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">Frames::set_kind_variables</span></span>:<br/>Compile Phrases - <a href="25-cp.html#SP2_2">§2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">vars</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vars</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_kind_variable</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Frames::get_kind_variable</span></span>:<br/>Compile Invocations Inline - <a href="25-cii.html#SP3_1_1_1">§3.1.1.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_kind_variables</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">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">[</span><span class="identifier-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="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="function-syntax">Frames::temporarily_set_kvs</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Frames::temporarily_set_kvs</span></span>:<br/>Compile Invocations Inline - <a href="25-cii.html#SP3_1_1">§3.1.1</a>, <a href="25-cii.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">vars</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> **</span><span class="identifier-syntax">prev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_kind_variables</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="identifier-syntax">local_kind_variables</span><span class="plain-syntax"> = </span><span class="identifier-syntax">vars</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">prev</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>§10. Stacked variables. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::set_stvol</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Frames::set_stvol</span></span>:<br/>Phrase Usage - <a href="22-pu.html#SP20_1_1">§20.1.1</a><br/>Phrase Runtime Context Data - <a href="22-prcd.html#SP8">§8</a><br/>Compile Phrases - <a href="25-cp.html#SP2_2">§2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">, </span><span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stvol</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="identifier-syntax">local_stvol</span><span class="plain-syntax"> = </span><span class="identifier-syntax">stvol</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
|
|
<span class="reserved-syntax">stacked_variable_owner_list</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::get_stvol</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Frames::get_stvol</span></span>:<br/>Type Expressions and Values - <a href="10-teav.html#SP15">§15</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">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_stvol</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">NULL</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>§11. Past tense. </b>All we do here is to make a note if anything compiled in this context makes
|
|
reference to the past.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::determines_the_past</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Frames::determines_the_past</span></span>:<br/>Chronology - <a href="24-ch.html#SP6">§6</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">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span>
|
|
<span class="plain-syntax"> </span><span class="string-syntax">"tried to determine past where no stack frame exists"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="identifier-syntax">determines_past_conditions</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOGIF</span><span class="plain-syntax">(</span><span class="identifier-syntax">LOCAL_VARIABLES</span><span class="plain-syntax">, </span><span class="string-syntax">"Stack frame determines past\n"</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">Frames::used_for_past_tense</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Frames::used_for_past_tense</span></span>:<br/>Compile Atoms - <a href="12-ca.html#SP4_1_2">§4.1.2</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">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</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><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">determines_past_conditions</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="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>
|
|
<p class="commentary firstcommentary"><a id="SP12" class="paragraph-anchor"></a><b>§12. Logging. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::log</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Frames::log</span></span>:<br/>Text Substitutions - <a href="17-ts.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) { </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"<null stack frame>\n"</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Stack frame at %08x: it:%s, dpc:%s\n"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">it_variable_exists</span><span class="plain-syntax">)?</span><span class="string-syntax">"yes"</span><span class="plain-syntax">:</span><span class="string-syntax">"no"</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> (</span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">determines_past_conditions</span><span class="plain-syntax">)?</span><span class="string-syntax">"yes"</span><span class="plain-syntax">:</span><span class="string-syntax">"no"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">local_variable</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">local_value_variables</span><span class="plain-syntax">.</span><span class="element-syntax">local_variable_allocation</span><span class="plain-syntax">; </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">; </span><span class="identifier-syntax">lvar</span><span class="plain-syntax"> = </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">-></span><span class="element-syntax">next</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">switch</span><span class="plain-syntax"> (</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">-></span><span class="element-syntax">lv_purpose</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">LET_VALUE_LV:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Let/loop value: "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">TOKEN_CALL_PARAMETER_LV:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Call value: "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">case</span><span class="plain-syntax"> </span><span class="identifier-syntax">INTERNAL_USE_LV:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Internal use: "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">default:</span><span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Other: "</span><span class="plain-syntax">); </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"%~L: "</span><span class="plain-syntax">, </span><span class="identifier-syntax">lvar</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="24-lv.html#SP34" class="function-link"><span class="function-syntax">LocalVariables::log</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">lvar</span><span class="plain-syntax">); </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP13" class="paragraph-anchor"></a><b>§13. Formal parameter allocation. </b>Some stack frames need access to additional variables to handle run-time
|
|
invocation ambiguities, and this is how they're requested:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Frames::need_at_least_this_many_formals</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Frames::need_at_least_this_many_formals</span></span>:<br/>Compile Invocations - <a href="25-ci.html#SP2_2">§2.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">N</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"requested formal parameters outside all stack frames"</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">N</span><span class="plain-syntax"> > </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">no_formal_parameters_needed</span><span class="plain-syntax"> = </span><span class="identifier-syntax">N</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP14" class="paragraph-anchor"></a><b>§14. Pointer value allocation. </b>Values such as lists, which have to stored in whole blocks rather than single
|
|
words of memory, are sometimes called pointer values because all we can
|
|
immediately handle is a pointer to the block. When these arise in the
|
|
compilation of a routine, we have to make a note of this, because special
|
|
code will be needed to allocate and deallocate the memory storing the block.
|
|
The following is the routine called to make this note.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::add_allocation</span><button class="popup" onclick="togglePopup('usagePopup19')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup19">Usage of <span class="code-font"><span class="function-syntax">Frames::add_allocation</span></span>:<br/>Runtime Support for Kinds - <a href="13-rsfk.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">proto</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">ph_stack_frame</span><span class="plain-syntax"> *</span><span class="identifier-syntax">phsf</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP7" class="function-link"><span class="function-syntax">Frames::current_stack_frame</span></a><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">phsf</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOG</span><span class="plain-syntax">(</span><span class="string-syntax">"Tried to allocate: %u\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"tried to allocate block kind outside all stack frames"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="identifier-syntax">next_in_frame</span><span class="plain-syntax"> = </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="element-syntax">allocated_pointers</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">phsf</span><span class="plain-syntax">-></span><span class="identifier-syntax">allocated_pointers</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">next_in_frame</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">next_in_frame</span><span class="plain-syntax">-></span><span class="element-syntax">offset_past</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="identifier-syntax">offset_past</span><span class="plain-syntax"> = </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</span><span class="plain-syntax"> + </span><span class="identifier-syntax">Kinds::Behaviour::get_small_block_size</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="24-sf.html#SP14_1" class="named-paragraph-link"><span class="named-paragraph">Work out heap allocation code for this pointer value</span><span class="named-paragraph-number">14.1</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="24-sf.html#SP14_2" class="named-paragraph-link"><span class="named-paragraph">Work out local reference code for this pointer value</span><span class="named-paragraph-number">14.2</span></a></span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="24-sf.html#SP14_3" class="named-paragraph-link"><span class="named-paragraph">Work out promotion schema for this pointer value</span><span class="named-paragraph-number">14.3</span></a></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">pall</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">Frames::compile_allocation</span><button class="popup" onclick="togglePopup('usagePopup20')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup20">Usage of <span class="code-font"><span class="function-syntax">Frames::compile_allocation</span></span>:<br/>Runtime Support for Kinds - <a href="13-rsfk.html#SP9">§9</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::add_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">"%S"</span><span class="plain-syntax">, </span><a href="24-sf.html#SP15" class="function-link"><span class="function-syntax">Frames::pall_get_local_reference</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">pall</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">Frames::emit_allocation</span><button class="popup" onclick="togglePopup('usagePopup21')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup21">Usage of <span class="code-font"><span class="function-syntax">Frames::emit_allocation</span></span>:<br/>Deciding to Defer - <a href="12-dtd.html#SP15">§15</a>, <a href="12-dtd.html#SP16">§16</a><br/>Runtime Support for Kinds - <a href="13-rsfk.html#SP9">§9</a><br/>Compiling from Specifications - <a href="14-cfs.html#SP6">§6</a><br/>Text Substitutions - <a href="17-ts.html#SP7">§7</a><br/>Compile Invocations As Calls - <a href="25-ciac.html#SP2_1">§2.1</a><br/>Compile Invocations Inline - <a href="25-cii.html#SP1_2_1">§1.2.1</a>, <a href="25-cii.html#SP3_2_1">§3.2.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</span><span class="plain-syntax"> = </span><a href="24-sf.html#SP14" class="function-link"><span class="function-syntax">Frames::add_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">i6_schema</span><span class="plain-syntax"> *</span><span class="identifier-syntax">all_sch</span><span class="plain-syntax"> = </span><a href="12-is.html#SP3" class="function-link"><span class="function-syntax">Calculus::Schemas::new</span></a><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="12-is.html#SP5" class="function-link"><span class="function-syntax">Calculus::Schemas::emit_expand_from_terms</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">all_sch</span><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">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre>
|
|
<p class="commentary firstcommentary"><a id="SP14_1" class="paragraph-anchor"></a><b>§14.1. </b>The following works out a call to <span class="extract"><span class="extract-syntax">BlkValueCreate</span></span> which will return a
|
|
default value of the given kind.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out heap allocation code for this pointer value</span><span class="named-paragraph-number">14.1</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="identifier-syntax">allocation</span><span class="plain-syntax"> = </span><a href="13-rsfk.html#SP21" class="function-link"><span class="function-syntax">Kinds::RunTime::make_heap_allocation</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="24-sf.html#SP14">§14</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP14_2" class="paragraph-anchor"></a><b>§14.2. </b>This is the storage used to hold the pointer. For each frame, we have
|
|
a subarray of short blocks, indexed by the offset.
|
|
</p>
|
|
|
|
<p class="commentary"><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out local reference code for this pointer value</span><span class="named-paragraph-number">14.2</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="identifier-syntax">local_reference_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</span><span class="plain-syntax">();</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="identifier-syntax">escaped_local_reference_code</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"I7SFRAME"</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"I7SFRAME"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</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_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE)"</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE)"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE*%d)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">, </span><span class="string-syntax">"(I7SFRAME+WORDSIZE**%d)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">offset_index</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="24-sf.html#SP14">§14</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP14_3" class="paragraph-anchor"></a><b>§14.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Work out promotion schema for this pointer value</span><span class="named-paragraph-number">14.3</span></span><span class="comment-syntax"> =</span>
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="identifier-syntax">schema_for_promotion</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Str::new</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">proto</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]; </span><span class="identifier-syntax">i</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">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">+1] == </span><span class="character-syntax">'#'</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">+2] == </span><span class="character-syntax">'#'</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">schema_for_promotion</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">escaped_local_reference_code</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">+=2;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">pall</span><span class="plain-syntax">-></span><span class="element-syntax">schema_for_promotion</span><span class="plain-syntax">, </span><span class="identifier-syntax">proto</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre>
|
|
<ul class="endnotetexts"><li>This code is used in <a href="24-sf.html#SP14">§14</a>.</li></ul>
|
|
<p class="commentary firstcommentary"><a id="SP15" class="paragraph-anchor"></a><b>§15. </b></p>
|
|
|
|
<pre class="displayed-code all-displayed-code code-font">
|
|
<span class="identifier-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="function-syntax">Frames::pall_get_local_reference</span><button class="popup" onclick="togglePopup('usagePopup22')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup22">Usage of <span class="code-font"><span class="function-syntax">Frames::pall_get_local_reference</span></span>:<br/><a href="24-sf.html#SP14">§14</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">local_reference_code</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="function-syntax">Frames::pall_get_expanded_schema</span><button class="popup" onclick="togglePopup('usagePopup23')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup23">Usage of <span class="code-font"><span class="function-syntax">Frames::pall_get_expanded_schema</span></span>:<br/>Runtime Support for Kinds - <a href="13-rsfk.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">pointer_allocation</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pall</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">pall</span><span class="plain-syntax">-></span><span class="element-syntax">schema_for_promotion</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="24-pb.html">❮</a></li><li class="progresschapter"><a href="P-wtmd.html">P</a></li><li class="progresschapter"><a href="1-cm.html">1</a></li><li class="progresschapter"><a href="2-up.html">2</a></li><li class="progresschapter"><a href="3-bv.html">3</a></li><li class="progresschapter"><a href="4-dlr.html">4</a></li><li class="progresschapter"><a href="5-rpt.html">5</a></li><li class="progresschapter"><a href="6-lp.html">6</a></li><li class="progresschapter"><a href="7-am.html">7</a></li><li class="progresschapter"><a href="8-ptu.html">8</a></li><li class="progresschapter"><a href="9-ef.html">9</a></li><li class="progresschapter"><a href="10-its.html">10</a></li><li class="progresschapter"><a href="11-pr.html">11</a></li><li class="progresschapter"><a href="12-ter.html">12</a></li><li class="progresschapter"><a href="13-kak.html">13</a></li><li class="progresschapter"><a href="14-sp.html">14</a></li><li class="progresschapter"><a href="15-pr.html">15</a></li><li class="progresschapter"><a href="16-is.html">16</a></li><li class="progresschapter"><a href="17-tl.html">17</a></li><li class="progresschapter"><a href="18-lc.html">18</a></li><li class="progresschapter"><a href="19-tc.html">19</a></li><li class="progresschapter"><a href="20-eq.html">20</a></li><li class="progresschapter"><a href="21-rl.html">21</a></li><li class="progresschapter"><a href="22-itp.html">22</a></li><li class="progresschapter"><a href="23-ad.html">23</a></li><li class="progresscurrentchapter">24</li><li class="progresssection"><a href="24-lv.html">lv</a></li><li class="progresssection"><a href="24-pb.html">pb</a></li><li class="progresscurrent">sf</li><li class="progresssection"><a href="24-ch.html">ch</a></li><li class="progresschapter"><a href="25-in.html">25</a></li><li class="progresschapter"><a href="26-fc.html">26</a></li><li class="progresschapter"><a href="27-hr.html">27</a></li><li class="progressnext"><a href="24-ch.html">❯</a></li></ul></div>
|
|
</nav><!--End of weave-->
|
|
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|