mu/html/056shape_shifting_recipe.cc.html
Kartik Agaram 08a0eed699 4891
Couple more tweaks to html rendering:
a) SubX definitions no longer link redundantly to themselves. This long-standing
issue turns out to be tractable to solve for SubX files since the syntax
is so simple.
b) Fix links to SubX definitions in other directories. I forgot that I
have to always generate tags from the directory of the file being linkified.
c) Fix link colors. Before we lost all syntax highlighting for functions
and Globals. Now they maintain their colors, just add an underline.
2018-12-30 00:02:42 -08:00

1223 lines
189 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 056shape_shifting_recipe.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.LineNr { }
.Delimiter { color: #c000c0; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.SalientComment { color: #0000af; }
.CommentedCode { color: #8a8a8a; }
.muRecipe { color: #ff8700; }
.Constant { color: #008787; }
.Special { color: #d70000; }
.Identifier { color: #af5f00; }
.traceContains { color: #005f00; }
.muData { color: #ffff00; }
.Comment { color: #005faf; }
.cSpecial { color: #008000; }
-->
</style>
<script type='text/javascript'>
<!--
/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
var lineNum;
lineNum = window.location.hash;
lineNum = lineNum.substr(1); /* strip off '#' */
if (lineNum.indexOf('L') == -1) {
lineNum = 'L'+lineNum;
}
lineElem = document.getElementById(lineNum);
/* Always jump to new location even if the line was hidden inside a fold, or
* we corrected the raw number to a line ID.
*/
if (lineElem) {
lineElem.scrollIntoView(true);
}
return true;
}
if ('onhashchange' in window) {
window.onhashchange = JumpToLine;
}
-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/056shape_shifting_recipe.cc'>https://github.com/akkartik/mu/blob/master/056shape_shifting_recipe.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="SalientComment">//:: Like container definitions, recipes too can contain type parameters.</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario shape_shifting_recipe)</span>
<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L5" class="LineNr"> 5 </span> <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span>
<span id="L6" class="LineNr"> 6 </span> <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point
<span id="L7" class="LineNr"> 7 </span>]
<span id="L8" class="LineNr"> 8 </span><span class="Comment"># non-matching variant</span>
<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -&gt; </span>result:num [
<span id="L10" class="LineNr"> 10 </span> local-scope
<span id="L11" class="LineNr"> 11 </span> load-ingredients
<span id="L12" class="LineNr"> 12 </span> result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L13" class="LineNr"> 13 </span>]
<span id="L14" class="LineNr"> 14 </span><span class="Comment"># matching shape-shifting variant</span>
<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [
<span id="L16" class="LineNr"> 16 </span> local-scope
<span id="L17" class="LineNr"> 17 </span> load-ingredients
<span id="L18" class="LineNr"> 18 </span> result<span class="Special"> &lt;- </span>copy a
<span id="L19" class="LineNr"> 19 </span>]
<span id="L20" class="LineNr"> 20 </span><span class="traceContains">+mem: storing 14 in location 12</span>
<span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 15 in location 13</span>
<span id="L22" class="LineNr"> 22 </span>
<span id="L23" class="LineNr"> 23 </span><span class="Comment">//: Before anything else, disable transforms for shape-shifting recipes and</span>
<span id="L24" class="LineNr"> 24 </span><span class="Comment">//: make sure we never try to actually run a shape-shifting recipe. We should</span>
<span id="L25" class="LineNr"> 25 </span><span class="Comment">//: be rewriting such instructions to *specializations* with the type</span>
<span id="L26" class="LineNr"> 26 </span><span class="Comment">//: ingredients filled in.</span>
<span id="L27" class="LineNr"> 27 </span>
<span id="L28" class="LineNr"> 28 </span><span class="Comment">//: One exception (and this makes things very ugly): we need to expand type</span>
<span id="L29" class="LineNr"> 29 </span><span class="Comment">//: abbreviations in shape-shifting recipes because we need them types for</span>
<span id="L30" class="LineNr"> 30 </span><span class="Comment">//: deciding which variant to specialize.</span>
<span id="L31" class="LineNr"> 31 </span>
<span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End Transform Checks&quot;)</span>
<span id="L33" class="LineNr"> 33 </span>r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span>
<span id="L34" class="LineNr"> 34 </span><span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">)</span> != <span class="Normal">static_cast</span>&lt;transform_fn&gt;<span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">)</span> &amp;&amp; <a href='056shape_shifting_recipe.cc.html#L156'>any_type_ingredient_in_header</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment"><a href='010vm.cc.html#L14'>recipe_ordinal</a></span><span class="Comment">*/</span>p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L35" class="LineNr"> 35 </span>
<span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(after &quot;Running One Instruction&quot;)</span>
<span id="L37" class="LineNr"> 37 </span><span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index == <span class="Constant">0</span>
<span id="L38" class="LineNr"> 38 </span> &amp;&amp; <a href='056shape_shifting_recipe.cc.html#L156'>any_type_ingredient_in_header</a><span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L39" class="LineNr"> 39 </span><span class="CommentedCode">//? DUMP(&quot;&quot;);</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;ran into unspecialized shape-shifting <a href='010vm.cc.html#L19'>recipe</a> &quot;</span> &lt;&lt; <a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span><span class="CommentedCode">//? exit(0);</span>
<span id="L42" class="LineNr"> 42 </span><span class="Delimiter">}</span>
<span id="L43" class="LineNr"> 43 </span>
<span id="L44" class="LineNr"> 44 </span><span class="Comment">//: Make sure we don't match up literals with type ingredients without</span>
<span id="L45" class="LineNr"> 45 </span><span class="Comment">//: specialization.</span>
<span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before &quot;End Matching Types For Literal(to)&quot;)</span>
<span id="L47" class="LineNr"> 47 </span><span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L48" class="LineNr"> 48 </span>
<span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(after &quot;Static Dispatch Phase 2&quot;)</span>
<span id="L50" class="LineNr"> 50 </span>candidates = <a href='056shape_shifting_recipe.cc.html#L73'>strictly_matching_shape_shifting_variants</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span>
<span id="L51" class="LineNr"> 51 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L52" class="LineNr"> 52 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> exemplar = <a href='056shape_shifting_recipe.cc.html#L106'>best_shape_shifting_variant</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">);</span>
<span id="L53" class="LineNr"> 53 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;found variant to specialize: &quot;</span> &lt;&lt; exemplar &lt;&lt; <span class="Constant">' '</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L54" class="LineNr"> 54 </span> string new_recipe_name = <a href='056shape_shifting_recipe.cc.html#L241'>insert_new_variant</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_recipe_name != <span class="Constant">&quot;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L56" class="LineNr"> 56 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new specialization: &quot;</span> &lt;&lt; new_recipe_name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Identifier">return</span> new_recipe_name<span class="Delimiter">;</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Delimiter">}</span>
<span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span>
<span id="L60" class="LineNr"> 60 </span>
<span id="L61" class="LineNr"> 61 </span><span class="Comment">//: before running Mu programs, make sure no unspecialized shape-shifting</span>
<span id="L62" class="LineNr"> 62 </span><span class="Comment">//: recipes can be called</span>
<span id="L63" class="LineNr"> 63 </span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">:(before &quot;End Instruction Operation Checks&quot;)</span>
<span id="L65" class="LineNr"> 65 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> &amp;&amp; !is_primitive<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span>
<span id="L66" class="LineNr"> 66 </span> &amp;&amp; <a href='056shape_shifting_recipe.cc.html#L156'>any_type_ingredient_in_header</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L67" class="LineNr"> 67 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has no valid specialization\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span>
<span id="L70" class="LineNr"> 70 </span>
<span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(code)</span>
<span id="L72" class="LineNr"> 72 </span><span class="Comment">// phase 3 of static dispatch</span>
<span id="L73" class="LineNr"> 73 </span>vector&lt;recipe_ordinal&gt; <a href='056shape_shifting_recipe.cc.html#L73'>strictly_matching_shape_shifting_variants</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L74" class="LineNr"> 74 </span> vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span>
<span id="L75" class="LineNr"> 75 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L77" class="LineNr"> 77 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!any_type_ingredient_in_header<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!all_concrete_header_reagents_strictly_match<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L79" class="LineNr"> 79 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Delimiter">}</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span>
<span id="L83" class="LineNr"> 83 </span>
<span id="L84" class="LineNr"> 84 </span><span class="Normal">bool</span> <a href='056shape_shifting_recipe.cc.html#L84'>all_concrete_header_reagents_strictly_match</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!concrete_type_names_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L87" class="LineNr"> 87 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">}</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Delimiter">}</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!concrete_type_names_strictly_match<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: product &quot;</span> &lt;&lt; i &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Delimiter">}</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span>
<span id="L100" class="LineNr"> 100 </span>
<span id="L101" class="LineNr"> 101 </span><span class="Comment">// manual prototype</span>
<span id="L102" class="LineNr"> 102 </span>vector&lt;recipe_ordinal&gt; <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp;<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp;<span class="Delimiter">,</span>
<span id="L103" class="LineNr"> 103 </span> <span class="Normal">int</span> <span class="Delimiter">(</span>*<span class="Delimiter">)(</span><span class="Normal">const</span> instruction&amp;<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">));</span>
<span id="L104" class="LineNr"> 104 </span>
<span id="L105" class="LineNr"> 105 </span><span class="Comment">// tie-breaker for phase 3</span>
<span id="L106" class="LineNr"> 106 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> <a href='056shape_shifting_recipe.cc.html#L106'>best_shape_shifting_variant</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L107" class="LineNr"> 107 </span> assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L108" class="LineNr"> 108 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L109" class="LineNr"> 109 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;A picking shape-shifting variant:\n&quot;;</span>
<span id="L110" class="LineNr"> 110 </span> vector&lt;recipe_ordinal&gt; result1 = <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">,</span> number_of_concrete_type_names<span class="Delimiter">);</span>
<span id="L111" class="LineNr"> 111 </span> assert<span class="Delimiter">(</span>!result1<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L112" class="LineNr"> 112 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>result1<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> result1<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L113" class="LineNr"> 113 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;B picking shape-shifting variant:\n&quot;;</span>
<span id="L114" class="LineNr"> 114 </span> vector&lt;recipe_ordinal&gt; result2 = <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> result1<span class="Delimiter">,</span> <a href='056shape_shifting_recipe.cc.html#L150'>arity_fit</a><span class="Delimiter">);</span>
<span id="L115" class="LineNr"> 115 </span> assert<span class="Delimiter">(</span>!result2<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L116" class="LineNr"> 116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>result2<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> result2<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L117" class="LineNr"> 117 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;C picking shape-shifting variant:\n&quot;;</span>
<span id="L118" class="LineNr"> 118 </span> vector&lt;recipe_ordinal&gt; result3 = <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> result2<span class="Delimiter">,</span> number_of_type_ingredients<span class="Delimiter">);</span>
<span id="L119" class="LineNr"> 119 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>result3<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L120" class="LineNr"> 120 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;\nCouldn't decide the best shape-shifting variant for instruction '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L121" class="LineNr"> 121 </span> cerr &lt;&lt; <span class="Constant">&quot;This is a hole in Mu. Please copy the following candidates into an email to Kartik Agaram &lt;mu@akkartik.com&gt;\n&quot;</span><span class="Delimiter">;</span>
<span id="L122" class="LineNr"> 122 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L123" class="LineNr"> 123 </span> cerr &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L124" class="LineNr"> 124 </span> <span class="Delimiter">}</span>
<span id="L125" class="LineNr"> 125 </span> <span class="Identifier">return</span> result3<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L126" class="LineNr"> 126 </span><span class="Delimiter">}</span>
<span id="L127" class="LineNr"> 127 </span>
<span id="L128" class="LineNr"> 128 </span>vector&lt;recipe_ordinal&gt; <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; in<span class="Delimiter">,</span>
<span id="L129" class="LineNr"> 129 </span> <span class="Normal">int</span> <span class="Delimiter">(</span>*scorer<span class="Delimiter">)(</span><span class="Normal">const</span> instruction&amp;<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L130" class="LineNr"> 130 </span> assert<span class="Delimiter">(</span>!in<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
<span id="L131" class="LineNr"> 131 </span> vector&lt;recipe_ordinal&gt; out<span class="Delimiter">;</span>
<span id="L132" class="LineNr"> 132 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
<span id="L133" class="LineNr"> 133 </span> <span class="Normal">int</span> best_score = <span class="Delimiter">(</span>*scorer<span class="Delimiter">)(</span>inst<span class="Delimiter">,</span> in<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
<span id="L134" class="LineNr"> 134 </span><span class="CommentedCode">//? cerr &lt;&lt; best_score &lt;&lt; &quot; &quot; &lt;&lt; header_label(get(Recipe, in.at(0))) &lt;&lt; '\n';</span>
<span id="L135" class="LineNr"> 135 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L136" class="LineNr"> 136 </span> <span class="Normal">int</span> score = <span class="Delimiter">(</span>*scorer<span class="Delimiter">)(</span>inst<span class="Delimiter">,</span> in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L137" class="LineNr"> 137 </span><span class="CommentedCode">//? cerr &lt;&lt; score &lt;&lt; &quot; &quot; &lt;&lt; header_label(get(Recipe, in.at(i))) &lt;&lt; '\n';</span>
<span id="L138" class="LineNr"> 138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>score == best_score<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L139" class="LineNr"> 139 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L140" class="LineNr"> 140 </span> <span class="Delimiter">}</span>
<span id="L141" class="LineNr"> 141 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>score &gt; best_score<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L142" class="LineNr"> 142 </span> best_score = score<span class="Delimiter">;</span>
<span id="L143" class="LineNr"> 143 </span> out<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L144" class="LineNr"> 144 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
<span id="L145" class="LineNr"> 145 </span> <span class="Delimiter">}</span>
<span id="L146" class="LineNr"> 146 </span> <span class="Delimiter">}</span>
<span id="L147" class="LineNr"> 147 </span> <span class="Identifier">return</span> out<span class="Delimiter">;</span>
<span id="L148" class="LineNr"> 148 </span><span class="Delimiter">}</span>
<span id="L149" class="LineNr"> 149 </span>
<span id="L150" class="LineNr"> 150 </span><span class="Normal">int</span> <a href='056shape_shifting_recipe.cc.html#L150'>arity_fit</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> candidate<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L151" class="LineNr"> 151 </span> <span class="Normal">const</span> recipe&amp; r = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> candidate<span class="Delimiter">);</span>
<span id="L152" class="LineNr"> 152 </span> <span class="Identifier">return</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> - <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>products<span class="Delimiter">))</span>
<span id="L153" class="LineNr"> 153 </span> + <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> - <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
<span id="L154" class="LineNr"> 154 </span><span class="Delimiter">}</span>
<span id="L155" class="LineNr"> 155 </span>
<span id="L156" class="LineNr"> 156 </span><span class="Normal">bool</span> <a href='056shape_shifting_recipe.cc.html#L156'>any_type_ingredient_in_header</a><span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L157" class="LineNr"> 157 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
<span id="L158" class="LineNr"> 158 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L159" class="LineNr"> 159 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
<span id="L160" class="LineNr"> 160 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L161" class="LineNr"> 161 </span> <span class="Delimiter">}</span>
<span id="L162" class="LineNr"> 162 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L163" class="LineNr"> 163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_type_ingredient_name<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
<span id="L164" class="LineNr"> 164 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L165" class="LineNr"> 165 </span> <span class="Delimiter">}</span>
<span id="L166" class="LineNr"> 166 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L167" class="LineNr"> 167 </span><span class="Delimiter">}</span>
<span id="L168" class="LineNr"> 168 </span>
<span id="L169" class="LineNr"> 169 </span><span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> to<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> from<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L170" class="LineNr"> 170 </span> canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">);</span>
<span id="L171" class="LineNr"> 171 </span> canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">);</span>
<span id="L172" class="LineNr"> 172 </span> <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">);</span>
<span id="L173" class="LineNr"> 173 </span><span class="Delimiter">}</span>
<span id="L174" class="LineNr"> 174 </span>
<span id="L175" class="LineNr"> 175 </span><span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* to<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* from<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; rhs_reagent<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L176" class="LineNr"> 176 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">)</span> <span class="Identifier">return</span> !from<span class="Delimiter">;</span>
<span id="L177" class="LineNr"> 177 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">)</span> <span class="Identifier">return</span> !to<span class="Delimiter">;</span>
<span id="L178" class="LineNr"> 178 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span class="Comment">// type ingredient matches anything</span>
<span id="L179" class="LineNr"> 179 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L180" class="LineNr"> 180 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span>
<span id="L181" class="LineNr"> 181 </span> <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal-address&quot;</span> &amp;&amp; rhs_reagent<span class="Delimiter">.</span>name == <span class="Constant">&quot;null&quot;</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr"> 182 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">-&gt;</span>atom &amp;&amp; !to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L183" class="LineNr"> 183 </span> <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">)</span>
<span id="L184" class="LineNr"> 184 </span> &amp;&amp; concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">);</span>
<span id="L185" class="LineNr"> 185 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom != to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L186" class="LineNr"> 186 </span> <span class="Comment">// both from and to are atoms</span>
<span id="L187" class="LineNr"> 187 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
<span id="L188" class="LineNr"> 188 </span> <span class="Identifier">return</span> <span class="Special">Literal_type_names</span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != <span class="Special">Literal_type_names</span><span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L189" class="LineNr"> 189 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span>
<span id="L190" class="LineNr"> 190 </span> <span class="Identifier">return</span> <span class="Special">Literal_type_names</span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != <span class="Special">Literal_type_names</span><span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L191" class="LineNr"> 191 </span> <span class="Identifier">return</span> to<span class="Delimiter">-&gt;</span>name == from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
<span id="L192" class="LineNr"> 192 </span><span class="Delimiter">}</span>
<span id="L193" class="LineNr"> 193 </span>
<span id="L194" class="LineNr"> 194 </span><span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L195" class="LineNr"> 195 </span> <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
<span id="L196" class="LineNr"> 196 </span><span class="Delimiter">}</span>
<span id="L197" class="LineNr"> 197 </span>
<span id="L198" class="LineNr"> 198 </span><span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr"> 199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L200" class="LineNr"> 200 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L201" class="LineNr"> 201 </span> <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
<span id="L202" class="LineNr"> 202 </span><span class="Delimiter">}</span>
<span id="L203" class="LineNr"> 203 </span>
<span id="L204" class="LineNr"> 204 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L205" class="LineNr"> 205 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">);</span>
<span id="L206" class="LineNr"> 206 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L207" class="LineNr"> 207 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L208" class="LineNr"> 208 </span> result += number_of_concrete_type_names<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
<span id="L209" class="LineNr"> 209 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L210" class="LineNr"> 210 </span> result += number_of_concrete_type_names<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
<span id="L211" class="LineNr"> 211 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L212" class="LineNr"> 212 </span><span class="Delimiter">}</span>
<span id="L213" class="LineNr"> 213 </span>
<span id="L214" class="LineNr"> 214 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L215" class="LineNr"> 215 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L216" class="LineNr"> 216 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L217" class="LineNr"> 217 </span> <span class="Identifier">return</span> is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> ? <span class="Constant">0</span> : <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L218" class="LineNr"> 218 </span> <span class="Identifier">return</span> number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
<span id="L219" class="LineNr"> 219 </span> + number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
<span id="L220" class="LineNr"> 220 </span><span class="Delimiter">}</span>
<span id="L221" class="LineNr"> 221 </span>
<span id="L222" class="LineNr"> 222 </span><span class="Normal">int</span> number_of_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L223" class="LineNr"> 223 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">);</span>
<span id="L224" class="LineNr"> 224 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L225" class="LineNr"> 225 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L226" class="LineNr"> 226 </span> result += number_of_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
<span id="L227" class="LineNr"> 227 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L228" class="LineNr"> 228 </span> result += number_of_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
<span id="L229" class="LineNr"> 229 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L230" class="LineNr"> 230 </span><span class="Delimiter">}</span>
<span id="L231" class="LineNr"> 231 </span>
<span id="L232" class="LineNr"> 232 </span><span class="Normal">int</span> number_of_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L233" class="LineNr"> 233 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L234" class="LineNr"> 234 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L235" class="LineNr"> 235 </span> <span class="Identifier">return</span> is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> ? <span class="Constant">1</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L236" class="LineNr"> 236 </span> <span class="Identifier">return</span> number_of_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
<span id="L237" class="LineNr"> 237 </span> + number_of_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
<span id="L238" class="LineNr"> 238 </span><span class="Delimiter">}</span>
<span id="L239" class="LineNr"> 239 </span>
<span id="L240" class="LineNr"> 240 </span><span class="Comment">// returns name of new variant</span>
<span id="L241" class="LineNr"> 241 </span>string <a href='056shape_shifting_recipe.cc.html#L241'>insert_new_variant</a><span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L242" class="LineNr"> 242 </span> string new_name = <a href='054static_dispatch.cc.html#L111'>next_unused_recipe_name</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
<span id="L243" class="LineNr"> 243 </span> assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Recipe_ordinal</span><span class="Delimiter">,</span> new_name<span class="Delimiter">));</span>
<span id="L244" class="LineNr"> 244 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> new_recipe_ordinal = <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span><span class="Special">Recipe_ordinal</span><span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> <span class="Special">Next_recipe_ordinal</span>++<span class="Delimiter">);</span>
<span id="L245" class="LineNr"> 245 </span> <span class="Comment">// make a copy</span>
<span id="L246" class="LineNr"> 246 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
<span id="L247" class="LineNr"> 247 </span> assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">));</span>
<span id="L248" class="LineNr"> 248 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
<span id="L249" class="LineNr"> 249 </span> recipe&amp; new_recipe = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">);</span>
<span id="L250" class="LineNr"> 250 </span> new_recipe<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span>
<span id="L251" class="LineNr"> 251 </span> new_recipe<span class="Delimiter">.</span>ordinal = new_recipe_ordinal<span class="Delimiter">;</span>
<span id="L252" class="LineNr"> 252 </span> new_recipe<span class="Delimiter">.</span>is_autogenerated =<span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L253" class="LineNr"> 253 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;switching &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; to specialized &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>new_recipe<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L254" class="LineNr"> 254 </span>
<span id="L255" class="LineNr"> 255 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;transforming new specialization: &quot;</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L256" class="LineNr"> 256 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: performing transforms until check_or_set_types_by_name&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L257" class="LineNr"> 257 </span> <span class="Normal">int</span> transform_index = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L258" class="LineNr"> 258 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>transform_index = <span class="Constant">0</span><span class="Delimiter">;</span> transform_index &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">);</span> ++transform_index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L259" class="LineNr"> 259 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>transform_index<span class="Delimiter">)</span> == <a href='046check_type_by_name.cc.html#L35'>check_or_set_types_by_name</a><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L260" class="LineNr"> 260 </span> <span class="Delimiter">(</span>*<span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>transform_index<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span>
<span id="L261" class="LineNr"> 261 </span> <span class="Delimiter">}</span>
<span id="L262" class="LineNr"> 262 </span> new_recipe<span class="Delimiter">.</span>transformed_until = transform_index-<span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L263" class="LineNr"> 263 </span>
<span id="L264" class="LineNr"> 264 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: performing type-ingredient-aware version of <a href='012transform.cc.html#L99'>transform</a> check_or_set_types_by_name&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L265" class="LineNr"> 265 </span> <a href='056shape_shifting_recipe.cc.html#L290'>compute_type_names</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span>
<span id="L266" class="LineNr"> 266 </span> new_recipe<span class="Delimiter">.</span>transformed_until++<span class="Delimiter">;</span>
<span id="L267" class="LineNr"> 267 </span>
<span id="L268" class="LineNr"> 268 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: replacing type ingredients&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L269" class="LineNr"> 269 </span> <span class="Delimiter">{</span>
<span id="L270" class="LineNr"> 270 </span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt; mappings<span class="Delimiter">;</span>
<span id="L271" class="LineNr"> 271 </span> <span class="Normal">bool</span> error =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L272" class="LineNr"> 272 </span> <a href='056shape_shifting_recipe.cc.html#L328'>compute_type_ingredient_mappings</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">),</span> inst<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> &amp;error<span class="Delimiter">);</span>
<span id="L273" class="LineNr"> 273 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!error<span class="Delimiter">)</span> error = <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>mappings<span class="Delimiter">)</span> != <a href='056shape_shifting_recipe.cc.html#L466'>type_ingredient_count_in_header</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">));</span>
<span id="L274" class="LineNr"> 274 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!error<span class="Delimiter">)</span> replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
<span id="L275" class="LineNr"> 275 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;::iterator p = mappings<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != mappings<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L276" class="LineNr"> 276 </span> <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
<span id="L277" class="LineNr"> 277 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>error<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L278" class="LineNr"> 278 </span> <span class="Delimiter">}</span>
<span id="L279" class="LineNr"> 279 </span> ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span>
<span id="L280" class="LineNr"> 280 </span>
<span id="L281" class="LineNr"> 281 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: recording the new variant before recursively calling resolve_ambiguous_calls&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L282" class="LineNr"> 282 </span> get<span class="Delimiter">(</span><span class="Special">Recipe_variants</span><span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>new_recipe_ordinal<span class="Delimiter">);</span>
<span id="L283" class="LineNr"> 283 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: performing remaining transforms (including resolve_ambiguous_calls)&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L284" class="LineNr"> 284 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span> transform_index &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">);</span> ++transform_index<span class="Delimiter">)</span>
<span id="L285" class="LineNr"> 285 </span> <span class="Delimiter">(</span>*<span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>transform_index<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span>
<span id="L286" class="LineNr"> 286 </span> new_recipe<span class="Delimiter">.</span>transformed_until = <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L287" class="LineNr"> 287 </span> <span class="Identifier">return</span> new_recipe<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
<span id="L288" class="LineNr"> 288 </span><span class="Delimiter">}</span>
<span id="L289" class="LineNr"> 289 </span>
<span id="L290" class="LineNr"> 290 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L290'>compute_type_names</a><span class="Delimiter">(</span>recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr"> 291 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- compute type names: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L292" class="LineNr"> 292 </span> map&lt;string<span class="Delimiter">,</span> type_tree*&gt; type_names<span class="Delimiter">;</span>
<span id="L293" class="LineNr"> 293 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L294" class="LineNr"> 294 </span> <a href='056shape_shifting_recipe.cc.html#L307'>save_or_deduce_type_name</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L295" class="LineNr"> 295 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L296" class="LineNr"> 296 </span> <a href='056shape_shifting_recipe.cc.html#L307'>save_or_deduce_type_name</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
<span id="L297" class="LineNr"> 297 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L298" class="LineNr"> 298 </span> instruction&amp; inst = variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L299" class="LineNr"> 299 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; <a href='010vm.cc.html#L33'>instruction</a>: &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L300" class="LineNr"> 300 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span> in &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span>
<span id="L301" class="LineNr"> 301 </span> <a href='056shape_shifting_recipe.cc.html#L307'>save_or_deduce_type_name</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot; in '&quot;</span> + to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
<span id="L302" class="LineNr"> 302 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span> out &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span>
<span id="L303" class="LineNr"> 303 </span> <a href='056shape_shifting_recipe.cc.html#L307'>save_or_deduce_type_name</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">),</span> type_names<span class="Delimiter">,</span> variant<span class="Delimiter">,</span> <span class="Constant">&quot; in '&quot;</span> + to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
<span id="L304" class="LineNr"> 304 </span> <span class="Delimiter">}</span>
<span id="L305" class="LineNr"> 305 </span><span class="Delimiter">}</span>
<span id="L306" class="LineNr"> 306 </span>
<span id="L307" class="LineNr"> 307 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L307'>save_or_deduce_type_name</a><span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_tree*&gt;&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; context<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L308" class="LineNr"> 308 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; checking &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L309" class="LineNr"> 309 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type &amp;&amp; <a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L310" class="LineNr"> 310 </span> x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*get<span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
<span id="L311" class="LineNr"> 311 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; deducing type to &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L312" class="LineNr"> 312 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L313" class="LineNr"> 313 </span> <span class="Delimiter">}</span>
<span id="L314" class="LineNr"> 314 </span> <span class="Comment">// Type Check in Type-ingredient-aware check_or_set_types_by_name</span>
<span id="L315" class="LineNr"> 315 </span> <span class="Comment">// This is different from check_or_set_types_by_name.</span>
<span id="L316" class="LineNr"> 316 </span> <span class="Comment">// We've found it useful in the past for tracking down bugs in</span>
<span id="L317" class="LineNr"> 317 </span> <span class="Comment">// specialization.</span>
<span id="L318" class="LineNr"> 318 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L319" class="LineNr"> 319 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>original_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unknown type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; context &lt;&lt; <span class="Constant">&quot; (check the name for typos)\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L320" class="LineNr"> 320 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L321" class="LineNr"> 321 </span> <span class="Delimiter">}</span>
<span id="L322" class="LineNr"> 322 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L323" class="LineNr"> 323 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;offset&quot;</span> || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;variant&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// special-case for container-access instructions</span>
<span id="L324" class="LineNr"> 324 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">,</span> x<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
<span id="L325" class="LineNr"> 325 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L326" class="LineNr"> 326 </span><span class="Delimiter">}</span>
<span id="L327" class="LineNr"> 327 </span>
<span id="L328" class="LineNr"> 328 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L328'>compute_type_ingredient_mappings</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L329" class="LineNr"> 329 </span> <span class="Normal">int</span> limit = min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span>
<span id="L330" class="LineNr"> 330 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; limit<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L331" class="LineNr"> 331 </span> <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L332" class="LineNr"> 332 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L333" class="LineNr"> 333 </span> canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span>
<span id="L334" class="LineNr"> 334 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">)</span> &amp;&amp; ingredient<span class="Delimiter">.</span>name == <span class="Constant">&quot;null&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// assume it matches</span>
<span id="L335" class="LineNr"> 335 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> ingredient<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
<span id="L336" class="LineNr"> 336 </span> <span class="Delimiter">}</span>
<span id="L337" class="LineNr"> 337 </span> limit = min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>products<span class="Delimiter">));</span>
<span id="L338" class="LineNr"> 338 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; limit<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L339" class="LineNr"> 339 </span> <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L340" class="LineNr"> 340 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L341" class="LineNr"> 341 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L342" class="LineNr"> 342 </span> canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span>
<span id="L343" class="LineNr"> 343 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> product<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
<span id="L344" class="LineNr"> 344 </span> <span class="Delimiter">}</span>
<span id="L345" class="LineNr"> 345 </span><span class="Delimiter">}</span>
<span id="L346" class="LineNr"> 346 </span>
<span id="L347" class="LineNr"> 347 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> reagent&amp; refinement<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L348" class="LineNr"> 348 </span> assert<span class="Delimiter">(</span>refinement<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
<span id="L349" class="LineNr"> 349 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">.</span>type<span class="Delimiter">,</span> refinement<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
<span id="L350" class="LineNr"> 350 </span><span class="Delimiter">}</span>
<span id="L351" class="LineNr"> 351 </span>
<span id="L352" class="LineNr"> 352 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* exemplar_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* refinement_type<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr"> 353 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L354" class="LineNr"> 354 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!refinement_type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L355" class="LineNr"> 355 </span> <span class="Comment">// probably a bug in mu</span>
<span id="L356" class="LineNr"> 356 </span> <span class="Comment">// todo: make this smarter; only flag an error if exemplar_type contains some *new* type ingredient</span>
<span id="L357" class="LineNr"> 357 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type ingredient for &quot;</span> &lt;&lt; exemplar_reagent<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L358" class="LineNr"> 358 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot; (called from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L359" class="LineNr"> 359 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L360" class="LineNr"> 360 </span> <span class="Delimiter">}</span>
<span id="L361" class="LineNr"> 361 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; exemplar_type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; !refinement_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; refinement_type<span class="Delimiter">-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L362" class="LineNr"> 362 </span> exemplar_type = exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
<span id="L363" class="LineNr"> 363 </span> <a href='003trace.cc.html#L199'>assert_for_now</a><span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L364" class="LineNr"> 364 </span> <span class="Delimiter">}</span>
<span id="L365" class="LineNr"> 365 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L366" class="LineNr"> 366 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L367" class="LineNr"> 367 </span> <span class="Normal">const</span> type_tree* curr_refinement_type = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span class="Comment">// temporary heap allocation; must always be deleted before it goes out of scope</span>
<span id="L368" class="LineNr"> 368 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span>
<span id="L369" class="LineNr"> 369 </span> curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">);</span>
<span id="L370" class="LineNr"> 370 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L371" class="LineNr"> 371 </span> assert<span class="Delimiter">(</span>!refinement_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
<span id="L372" class="LineNr"> 372 </span> curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span>
<span id="L373" class="LineNr"> 373 </span> <span class="Delimiter">}</span>
<span id="L374" class="LineNr"> 374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L375" class="LineNr"> 375 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding mapping from &quot;</span> &lt;&lt; exemplar_type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>curr_refinement_type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L376" class="LineNr"> 376 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span>
<span id="L377" class="LineNr"> 377 </span> <span class="Delimiter">}</span>
<span id="L378" class="LineNr"> 378 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L379" class="LineNr"> 379 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">),</span> curr_refinement_type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L380" class="LineNr"> 380 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;no call found for '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L381" class="LineNr"> 381 </span> *error =<span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L382" class="LineNr"> 382 </span> <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span>
<span id="L383" class="LineNr"> 383 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L384" class="LineNr"> 384 </span> <span class="Delimiter">}</span>
<span id="L385" class="LineNr"> 385 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L386" class="LineNr"> 386 </span> <span class="Normal">delete</span> get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L387" class="LineNr"> 387 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span>
<span id="L388" class="LineNr"> 388 </span> <span class="Delimiter">}</span>
<span id="L389" class="LineNr"> 389 </span> <span class="Delimiter">}</span>
<span id="L390" class="LineNr"> 390 </span> <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span>
<span id="L391" class="LineNr"> 391 </span> <span class="Delimiter">}</span>
<span id="L392" class="LineNr"> 392 </span> <span class="Delimiter">}</span>
<span id="L393" class="LineNr"> 393 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L394" class="LineNr"> 394 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
<span id="L395" class="LineNr"> 395 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span>
<span id="L396" class="LineNr"> 396 </span> <span class="Delimiter">}</span>
<span id="L397" class="LineNr"> 397 </span><span class="Delimiter">}</span>
<span id="L398" class="LineNr"> 398 </span>
<span id="L399" class="LineNr"> 399 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L400" class="LineNr"> 400 </span> <span class="Comment">// update its header</span>
<span id="L401" class="LineNr"> 401 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>mappings<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L402" class="LineNr"> 402 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in <a href='010vm.cc.html#L19'>recipe</a> header ingredients&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L403" class="LineNr"> 403 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L404" class="LineNr"> 404 </span> replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
<span id="L405" class="LineNr"> 405 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in <a href='010vm.cc.html#L19'>recipe</a> header products&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L406" class="LineNr"> 406 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L407" class="LineNr"> 407 </span> replace_type_ingredients<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
<span id="L408" class="LineNr"> 408 </span> <span class="Comment">// update its body</span>
<span id="L409" class="LineNr"> 409 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L410" class="LineNr"> 410 </span> instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L411" class="LineNr"> 411 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in <a href='010vm.cc.html#L33'>instruction</a> '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L412" class="LineNr"> 412 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span>
<span id="L413" class="LineNr"> 413 </span> replace_type_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
<span id="L414" class="LineNr"> 414 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span>
<span id="L415" class="LineNr"> 415 </span> replace_type_ingredients<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> mappings<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span>
<span id="L416" class="LineNr"> 416 </span> <span class="Comment">// special-case for new: replace type ingredient in first ingredient *value*</span>
<span id="L417" class="LineNr"> 417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L418" class="LineNr"> 418 </span> type_tree* type = <a href='056shape_shifting_recipe.cc.html#L483'>parse_type_tree</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span>
<span id="L419" class="LineNr"> 419 </span> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
<span id="L420" class="LineNr"> 420 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name = inspect<span class="Delimiter">(</span>type<span class="Delimiter">);</span>
<span id="L421" class="LineNr"> 421 </span> <span class="Normal">delete</span> type<span class="Delimiter">;</span>
<span id="L422" class="LineNr"> 422 </span> <span class="Delimiter">}</span>
<span id="L423" class="LineNr"> 423 </span> <span class="Delimiter">}</span>
<span id="L424" class="LineNr"> 424 </span><span class="Delimiter">}</span>
<span id="L425" class="LineNr"> 425 </span>
<span id="L426" class="LineNr"> 426 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L427" class="LineNr"> 427 </span> string before = <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span>
<span id="L428" class="LineNr"> 428 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in ingredient &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L429" class="LineNr"> 429 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L430" class="LineNr"> 430 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;specializing &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>original_name &lt;&lt; <span class="Constant">&quot;: missing type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L431" class="LineNr"> 431 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L432" class="LineNr"> 432 </span> <span class="Delimiter">}</span>
<span id="L433" class="LineNr"> 433 </span> replace_type_ingredients<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
<span id="L434" class="LineNr"> 434 </span><span class="Delimiter">}</span>
<span id="L435" class="LineNr"> 435 </span>
<span id="L436" class="LineNr"> 436 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L437" class="LineNr"> 437 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L438" class="LineNr"> 438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L439" class="LineNr"> 439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; <a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> &amp;&amp; !get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>atom &amp;&amp; get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L440" class="LineNr"> 440 </span> *type = *get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L441" class="LineNr"> 441 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L442" class="LineNr"> 442 </span> <span class="Delimiter">}</span>
<span id="L443" class="LineNr"> 443 </span> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
<span id="L444" class="LineNr"> 444 </span> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span>
<span id="L445" class="LineNr"> 445 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L446" class="LineNr"> 446 </span> <span class="Delimiter">}</span>
<span id="L447" class="LineNr"> 447 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Comment">// todo: ugly side effect</span>
<span id="L448" class="LineNr"> 448 </span> type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L449" class="LineNr"> 449 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
<span id="L450" class="LineNr"> 450 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L451" class="LineNr"> 451 </span> <span class="Normal">const</span> type_tree* replacement = get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L452" class="LineNr"> 452 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>replacement<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L453" class="LineNr"> 453 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L454" class="LineNr"> 454 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L455" class="LineNr"> 455 </span> <span class="Comment">// error in program; should be reported elsewhere</span>
<span id="L456" class="LineNr"> 456 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L457" class="LineNr"> 457 </span> <span class="Delimiter">}</span>
<span id="L458" class="LineNr"> 458 </span> type<span class="Delimiter">-&gt;</span>name = <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> ? <span class="Constant">&quot;number&quot;</span> : replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
<span id="L459" class="LineNr"> 459 </span> type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L460" class="LineNr"> 460 </span> <span class="Delimiter">}</span>
<span id="L461" class="LineNr"> 461 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L462" class="LineNr"> 462 </span> *type = *replacement<span class="Delimiter">;</span>
<span id="L463" class="LineNr"> 463 </span> <span class="Delimiter">}</span>
<span id="L464" class="LineNr"> 464 </span><span class="Delimiter">}</span>
<span id="L465" class="LineNr"> 465 </span>
<span id="L466" class="LineNr"> 466 </span><span class="Normal">int</span> <a href='056shape_shifting_recipe.cc.html#L466'>type_ingredient_count_in_header</a><span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> variant<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L467" class="LineNr"> 467 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> variant<span class="Delimiter">);</span>
<span id="L468" class="LineNr"> 468 </span> set&lt;string&gt; type_ingredients<span class="Delimiter">;</span>
<span id="L469" class="LineNr"> 469 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L470" class="LineNr"> 470 </span> accumulate_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> type_ingredients<span class="Delimiter">);</span>
<span id="L471" class="LineNr"> 471 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L472" class="LineNr"> 472 </span> accumulate_type_ingredients<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> type_ingredients<span class="Delimiter">);</span>
<span id="L473" class="LineNr"> 473 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>type_ingredients<span class="Delimiter">);</span>
<span id="L474" class="LineNr"> 474 </span><span class="Delimiter">}</span>
<span id="L475" class="LineNr"> 475 </span>
<span id="L476" class="LineNr"> 476 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;string&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L477" class="LineNr"> 477 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L478" class="LineNr"> 478 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
<span id="L479" class="LineNr"> 479 </span> accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L480" class="LineNr"> 480 </span> accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L481" class="LineNr"> 481 </span><span class="Delimiter">}</span>
<span id="L482" class="LineNr"> 482 </span>
<span id="L483" class="LineNr"> 483 </span>type_tree* <a href='056shape_shifting_recipe.cc.html#L483'>parse_type_tree</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L484" class="LineNr"> 484 </span> string_tree* s2 = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
<span id="L485" class="LineNr"> 485 </span> type_tree* result = <a href='019type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>s2<span class="Delimiter">);</span>
<span id="L486" class="LineNr"> 486 </span> <span class="Normal">delete</span> s2<span class="Delimiter">;</span>
<span id="L487" class="LineNr"> 487 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L488" class="LineNr"> 488 </span><span class="Delimiter">}</span>
<span id="L489" class="LineNr"> 489 </span>
<span id="L490" class="LineNr"> 490 </span>string inspect<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L491" class="LineNr"> 491 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L492" class="LineNr"> 492 </span> <a href='056shape_shifting_recipe.cc.html#L496'>dump_inspect</a><span class="Delimiter">(</span>x<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L493" class="LineNr"> 493 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L494" class="LineNr"> 494 </span><span class="Delimiter">}</span>
<span id="L495" class="LineNr"> 495 </span>
<span id="L496" class="LineNr"> 496 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L496'>dump_inspect</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L497" class="LineNr"> 497 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>left &amp;&amp; !x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L498" class="LineNr"> 498 </span> out &lt;&lt; x<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
<span id="L499" class="LineNr"> 499 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L500" class="LineNr"> 500 </span> <span class="Delimiter">}</span>
<span id="L501" class="LineNr"> 501 </span> out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span>
<span id="L502" class="LineNr"> 502 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span> curr<span class="Delimiter">;</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L503" class="LineNr"> 503 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr != x<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span>
<span id="L504" class="LineNr"> 504 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span>
<span id="L505" class="LineNr"> 505 </span> <a href='056shape_shifting_recipe.cc.html#L496'>dump_inspect</a><span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L506" class="LineNr"> 506 </span> <span class="Normal">else</span>
<span id="L507" class="LineNr"> 507 </span> out &lt;&lt; curr<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span>
<span id="L508" class="LineNr"> 508 </span> <span class="Delimiter">}</span>
<span id="L509" class="LineNr"> 509 </span> out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L510" class="LineNr"> 510 </span><span class="Delimiter">}</span>
<span id="L511" class="LineNr"> 511 </span>
<span id="L512" class="LineNr"> 512 </span><span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L513" class="LineNr"> 513 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- ensure all concrete types in <a href='010vm.cc.html#L19'>recipe</a> &quot;</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L514" class="LineNr"> 514 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L515" class="LineNr"> 515 </span> ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
<span id="L516" class="LineNr"> 516 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L517" class="LineNr"> 517 </span> ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
<span id="L518" class="LineNr"> 518 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L519" class="LineNr"> 519 </span> instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L520" class="LineNr"> 520 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span>
<span id="L521" class="LineNr"> 521 </span> ensure_all_concrete_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
<span id="L522" class="LineNr"> 522 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span>
<span id="L523" class="LineNr"> 523 </span> ensure_all_concrete_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">),</span> exemplar<span class="Delimiter">);</span>
<span id="L524" class="LineNr"> 524 </span> <span class="Delimiter">}</span>
<span id="L525" class="LineNr"> 525 </span><span class="Delimiter">}</span>
<span id="L526" class="LineNr"> 526 </span>
<span id="L527" class="LineNr"> 527 </span><span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L528" class="LineNr"> 528 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type || contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L529" class="LineNr"> 529 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L530" class="LineNr"> 530 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;added_by_ensure_all_concrete_types&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// just to prevent crashes later</span>
<span id="L531" class="LineNr"> 531 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L532" class="LineNr"> 532 </span> <span class="Delimiter">}</span>
<span id="L533" class="LineNr"> 533 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L534" class="LineNr"> 534 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to the unknown &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L535" class="LineNr"> 535 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L536" class="LineNr"> 536 </span> <span class="Delimiter">}</span>
<span id="L537" class="LineNr"> 537 </span><span class="Delimiter">}</span>
<span id="L538" class="LineNr"> 538 </span>
<span id="L539" class="LineNr"> 539 </span><span class="Delimiter">:(scenario shape_shifting_recipe_2)</span>
<span id="L540" class="LineNr"> 540 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L541" class="LineNr"> 541 </span> <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span>
<span id="L542" class="LineNr"> 542 </span> <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point
<span id="L543" class="LineNr"> 543 </span>]
<span id="L544" class="LineNr"> 544 </span><span class="Comment"># non-matching shape-shifting variant</span>
<span id="L545" class="LineNr"> 545 </span><span class="muRecipe">def</span> foo a:_t<span class="Delimiter">,</span> b:_t<span class="muRecipe"> -&gt; </span>result:num [
<span id="L546" class="LineNr"> 546 </span> local-scope
<span id="L547" class="LineNr"> 547 </span> load-ingredients
<span id="L548" class="LineNr"> 548 </span> result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L549" class="LineNr"> 549 </span>]
<span id="L550" class="LineNr"> 550 </span><span class="Comment"># matching shape-shifting variant</span>
<span id="L551" class="LineNr"> 551 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [
<span id="L552" class="LineNr"> 552 </span> local-scope
<span id="L553" class="LineNr"> 553 </span> load-ingredients
<span id="L554" class="LineNr"> 554 </span> result<span class="Special"> &lt;- </span>copy a
<span id="L555" class="LineNr"> 555 </span>]
<span id="L556" class="LineNr"> 556 </span><span class="traceContains">+mem: storing 14 in location 12</span>
<span id="L557" class="LineNr"> 557 </span><span class="traceContains">+mem: storing 15 in location 13</span>
<span id="L558" class="LineNr"> 558 </span>
<span id="L559" class="LineNr"> 559 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nonroot)</span>
<span id="L560" class="LineNr"> 560 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L561" class="LineNr"> 561 </span> <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L562" class="LineNr"> 562 </span> <span class="Constant">20</span>:point<span class="Special"> &lt;- </span>bar <span class="Constant">10</span>:foo:point
<span id="L563" class="LineNr"> 563 </span>]
<span id="L564" class="LineNr"> 564 </span><span class="Comment"># shape-shifting recipe with type ingredient following some other type</span>
<span id="L565" class="LineNr"> 565 </span><span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
<span id="L566" class="LineNr"> 566 </span> local-scope
<span id="L567" class="LineNr"> 567 </span> load-ingredients
<span id="L568" class="LineNr"> 568 </span> result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span>
<span id="L569" class="LineNr"> 569 </span>]
<span id="L570" class="LineNr"> 570 </span><span class="muData">container</span> foo:_t [
<span id="L571" class="LineNr"> 571 </span> <span class="Normal">x</span>:_t
<span id="L572" class="LineNr"> 572 </span> <span class="Normal">y</span>:num
<span id="L573" class="LineNr"> 573 </span>]
<span id="L574" class="LineNr"> 574 </span><span class="traceContains">+mem: storing 14 in location 20</span>
<span id="L575" class="LineNr"> 575 </span><span class="traceContains">+mem: storing 15 in location 21</span>
<span id="L576" class="LineNr"> 576 </span>
<span id="L577" class="LineNr"> 577 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nested)</span>
<span id="L578" class="LineNr"> 578 </span><span class="muData">container</span> c:_a:_b [
<span id="L579" class="LineNr"> 579 </span> <span class="Normal">a</span>:_a
<span id="L580" class="LineNr"> 580 </span> <span class="Normal">b</span>:_b
<span id="L581" class="LineNr"> 581 </span>]
<span id="L582" class="LineNr"> 582 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L583" class="LineNr"> 583 </span> <span class="Normal">s</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L584" class="LineNr"> 584 </span> <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>c <span class="Delimiter">(</span><a href='043space.cc.html#L101'>address</a> array character<span class="Delimiter">)</span> number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>merge s<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L585" class="LineNr"> 585 </span> foo x
<span id="L586" class="LineNr"> 586 </span>]
<span id="L587" class="LineNr"> 587 </span><span class="muRecipe">def</span> foo x:c:_bar:_baz [
<span id="L588" class="LineNr"> 588 </span> local-scope
<span id="L589" class="LineNr"> 589 </span> load-ingredients
<span id="L590" class="LineNr"> 590 </span>]
<span id="L591" class="LineNr"> 591 </span><span class="Comment"># no errors</span>
<span id="L592" class="LineNr"> 592 </span>
<span id="L593" class="LineNr"> 593 </span><span class="Delimiter">:(scenario shape_shifting_recipe_type_deduction_ignores_offsets)</span>
<span id="L594" class="LineNr"> 594 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L595" class="LineNr"> 595 </span> <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span>
<span id="L596" class="LineNr"> 596 </span> <span class="Constant">20</span>:point<span class="Special"> &lt;- </span>bar <span class="Constant">10</span>:foo:point
<span id="L597" class="LineNr"> 597 </span>]
<span id="L598" class="LineNr"> 598 </span><span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
<span id="L599" class="LineNr"> 599 </span> local-scope
<span id="L600" class="LineNr"> 600 </span> load-ingredients
<span id="L601" class="LineNr"> 601 </span> <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>
<span id="L602" class="LineNr"> 602 </span> result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span class="Comment"># shouldn't collide with other variable</span>
<span id="L603" class="LineNr"> 603 </span>]
<span id="L604" class="LineNr"> 604 </span><span class="muData">container</span> foo:_t [
<span id="L605" class="LineNr"> 605 </span> <span class="Normal">x</span>:_t
<span id="L606" class="LineNr"> 606 </span> <span class="Normal">y</span>:num
<span id="L607" class="LineNr"> 607 </span>]
<span id="L608" class="LineNr"> 608 </span><span class="traceContains">+mem: storing 14 in location 20</span>
<span id="L609" class="LineNr"> 609 </span><span class="traceContains">+mem: storing 15 in location 21</span>
<span id="L610" class="LineNr"> 610 </span>
<span id="L611" class="LineNr"> 611 </span><span class="Delimiter">:(scenario shape_shifting_recipe_empty)</span>
<span id="L612" class="LineNr"> 612 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L613" class="LineNr"> 613 </span> foo <span class="Constant">1</span>
<span id="L614" class="LineNr"> 614 </span>]
<span id="L615" class="LineNr"> 615 </span><span class="Comment"># shape-shifting recipe with no body</span>
<span id="L616" class="LineNr"> 616 </span><span class="muRecipe">def</span> foo a:_t [
<span id="L617" class="LineNr"> 617 </span>]
<span id="L618" class="LineNr"> 618 </span><span class="Comment"># shouldn't crash</span>
<span id="L619" class="LineNr"> 619 </span>
<span id="L620" class="LineNr"> 620 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient)</span>
<span id="L621" class="LineNr"> 621 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L622" class="LineNr"> 622 </span> <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span>
<span id="L623" class="LineNr"> 623 </span> <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point
<span id="L624" class="LineNr"> 624 </span>]
<span id="L625" class="LineNr"> 625 </span><span class="muData">container</span> foo:_t [
<span id="L626" class="LineNr"> 626 </span> <span class="Normal">x</span>:_t
<span id="L627" class="LineNr"> 627 </span> <span class="Normal">y</span>:num
<span id="L628" class="LineNr"> 628 </span>]
<span id="L629" class="LineNr"> 629 </span><span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [
<span id="L630" class="LineNr"> 630 </span> local-scope
<span id="L631" class="LineNr"> 631 </span> load-ingredients
<span id="L632" class="LineNr"> 632 </span> <span class="Comment"># new refers to _t in its ingredient *value*</span>
<span id="L633" class="LineNr"> 633 </span> result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span>
<span id="L634" class="LineNr"> 634 </span>]
<span id="L635" class="LineNr"> 635 </span><span class="traceContains">+mem: storing 0 in location 11</span>
<span id="L636" class="LineNr"> 636 </span><span class="traceContains">+mem: storing 0 in location 12</span>
<span id="L637" class="LineNr"> 637 </span><span class="traceContains">+mem: storing 0 in location 13</span>
<span id="L638" class="LineNr"> 638 </span>
<span id="L639" class="LineNr"> 639 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient_2)</span>
<span id="L640" class="LineNr"> 640 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L641" class="LineNr"> 641 </span> <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span>
<span id="L642" class="LineNr"> 642 </span> <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point
<span id="L643" class="LineNr"> 643 </span>]
<span id="L644" class="LineNr"> 644 </span><span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [
<span id="L645" class="LineNr"> 645 </span> local-scope
<span id="L646" class="LineNr"> 646 </span> load-ingredients
<span id="L647" class="LineNr"> 647 </span> <span class="Comment"># new refers to _t in its ingredient *value*</span>
<span id="L648" class="LineNr"> 648 </span> result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span>
<span id="L649" class="LineNr"> 649 </span>]
<span id="L650" class="LineNr"> 650 </span><span class="Comment"># container defined after use</span>
<span id="L651" class="LineNr"> 651 </span><span class="muData">container</span> foo:_t [
<span id="L652" class="LineNr"> 652 </span> <span class="Normal">x</span>:_t
<span id="L653" class="LineNr"> 653 </span> <span class="Normal">y</span>:num
<span id="L654" class="LineNr"> 654 </span>]
<span id="L655" class="LineNr"> 655 </span><span class="traceContains">+mem: storing 0 in location 11</span>
<span id="L656" class="LineNr"> 656 </span><span class="traceContains">+mem: storing 0 in location 12</span>
<span id="L657" class="LineNr"> 657 </span><span class="traceContains">+mem: storing 0 in location 13</span>
<span id="L658" class="LineNr"> 658 </span>
<span id="L659" class="LineNr"> 659 </span><span class="Delimiter">:(scenario shape_shifting_recipe_called_with_dummy)</span>
<span id="L660" class="LineNr"> 660 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L661" class="LineNr"> 661 </span> _<span class="Special"> &lt;- </span>bar <span class="Constant">34</span>
<span id="L662" class="LineNr"> 662 </span>]
<span id="L663" class="LineNr"> 663 </span><span class="muRecipe">def</span> bar x:_t<span class="muRecipe"> -&gt; </span>result:&amp;:_t [
<span id="L664" class="LineNr"> 664 </span> local-scope
<span id="L665" class="LineNr"> 665 </span> load-ingredients
<span id="L666" class="LineNr"> 666 </span> result<span class="Special"> &lt;- </span>copy<span class="Constant"> null</span>
<span id="L667" class="LineNr"> 667 </span>]
<span id="L668" class="LineNr"> 668 </span>$error: <span class="Constant">0</span>
<span id="L669" class="LineNr"> 669 </span>
<span id="L670" class="LineNr"> 670 </span><span class="Delimiter">:(code)</span>
<span id="L671" class="LineNr"> 671 </span><span class="Comment">// this one needs a little more fine-grained control</span>
<span id="L672" class="LineNr"> 672 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L672'>test_shape_shifting_new_ingredient_does_not_pollute_global_namespace</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L673" class="LineNr"> 673 </span> <span class="Comment">// if you specialize a shape-shifting recipe that allocates a type-ingredient..</span>
<span id="L674" class="LineNr"> 674 </span> <a href='012transform.cc.html#L99'>transform</a><span class="Delimiter">(</span><span class="Constant">&quot;def barz x:_elem [\n&quot;</span>
<span id="L675" class="LineNr"> 675 </span> <span class="Constant">&quot; local-scope\n&quot;</span>
<span id="L676" class="LineNr"> 676 </span> <span class="Constant">&quot; load-ingredients\n&quot;</span>
<span id="L677" class="LineNr"> 677 </span> <span class="Constant">&quot; y:&amp;:num &lt;- new _elem:type\n&quot;</span>
<span id="L678" class="LineNr"> 678 </span> <span class="Constant">&quot;]\n&quot;</span>
<span id="L679" class="LineNr"> 679 </span> <span class="Constant">&quot;def fooz [\n&quot;</span>
<span id="L680" class="LineNr"> 680 </span> <span class="Constant">&quot; local-scope\n&quot;</span>
<span id="L681" class="LineNr"> 681 </span> <span class="Constant">&quot; barz 34\n&quot;</span>
<span id="L682" class="LineNr"> 682 </span> <span class="Constant">&quot;]\n&quot;</span><span class="Delimiter">);</span>
<span id="L683" class="LineNr"> 683 </span> <span class="Comment">// ..and if you then try to load a new shape-shifting container with that</span>
<span id="L684" class="LineNr"> 684 </span> <span class="Comment">// type-ingredient</span>
<span id="L685" class="LineNr"> 685 </span> run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [\n&quot;</span>
<span id="L686" class="LineNr"> 686 </span> <span class="Constant">&quot; x:_elem\n&quot;</span>
<span id="L687" class="LineNr"> 687 </span> <span class="Constant">&quot; y:num\n&quot;</span>
<span id="L688" class="LineNr"> 688 </span> <span class="Constant">&quot;]\n&quot;</span><span class="Delimiter">);</span>
<span id="L689" class="LineNr"> 689 </span> <span class="Comment">// then it should work as usual</span>
<span id="L690" class="LineNr"> 690 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span>
<span id="L691" class="LineNr"> 691 </span> reagent element = <a href='030container.cc.html#L212'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L692" class="LineNr"> 692 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;x&quot;</span><span class="Delimiter">);</span>
<span id="L693" class="LineNr"> 693 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">);</span>
<span id="L694" class="LineNr"> 694 </span> <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
<span id="L695" class="LineNr"> 695 </span><span class="Delimiter">}</span>
<span id="L696" class="LineNr"> 696 </span>
<span id="L697" class="LineNr"> 697 </span><span class="Comment">//: specializing a type ingredient with a compound type</span>
<span id="L698" class="LineNr"> 698 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types)</span>
<span id="L699" class="LineNr"> 699 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L700" class="LineNr"> 700 </span> <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span>
<span id="L701" class="LineNr"> 701 </span> *<span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span><a href='001help.cc.html#L221'>put</a> *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L702" class="LineNr"> 702 </span> <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:point <span class="Comment"># specialize _t to address:point</span>
<span id="L703" class="LineNr"> 703 </span> <span class="Constant">5</span>:point<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:&amp;:point
<span id="L704" class="LineNr"> 704 </span>]
<span id="L705" class="LineNr"> 705 </span><span class="muRecipe">def</span> bar a:_t<span class="muRecipe"> -&gt; </span>result:_t [
<span id="L706" class="LineNr"> 706 </span> local-scope
<span id="L707" class="LineNr"> 707 </span> load-ingredients
<span id="L708" class="LineNr"> 708 </span> result<span class="Special"> &lt;- </span>copy a
<span id="L709" class="LineNr"> 709 </span>]
<span id="L710" class="LineNr"> 710 </span><span class="traceContains">+mem: storing 34 in location 6</span>
<span id="L711" class="LineNr"> 711 </span>
<span id="L712" class="LineNr"> 712 </span><span class="Comment">//: specializing a type ingredient with a compound type -- while *inside* another compound type</span>
<span id="L713" class="LineNr"> 713 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types_2)</span>
<span id="L714" class="LineNr"> 714 </span><span class="muData">container</span> foo:_t [
<span id="L715" class="LineNr"> 715 </span> <span class="Normal">value</span>:_t
<span id="L716" class="LineNr"> 716 </span>]
<span id="L717" class="LineNr"> 717 </span><span class="muRecipe">def</span> bar x:&amp;:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [
<span id="L718" class="LineNr"> 718 </span> local-scope
<span id="L719" class="LineNr"> 719 </span> load-ingredients
<span id="L720" class="LineNr"> 720 </span> result<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span>
<span id="L721" class="LineNr"> 721 </span>]
<span id="L722" class="LineNr"> 722 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L723" class="LineNr"> 723 </span> <span class="Constant">1</span>:&amp;:foo:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo <a href='043space.cc.html#L101'>address</a> point<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
<span id="L724" class="LineNr"> 724 </span> <span class="Constant">2</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:foo:&amp;:point
<span id="L725" class="LineNr"> 725 </span>]
<span id="L726" class="LineNr"> 726 </span><span class="Comment"># no errors; call to 'bar' successfully specialized</span>
<span id="L727" class="LineNr"> 727 </span>
<span id="L728" class="LineNr"> 728 </span><span class="Delimiter">:(scenario shape_shifting_recipe_error)</span>
<span id="L729" class="LineNr"> 729 </span><span class="Special">% Hide_errors = true;</span>
<span id="L730" class="LineNr"> 730 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L731" class="LineNr"> 731 </span> <span class="Normal">a</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span>
<span id="L732" class="LineNr"> 732 </span> <span class="Normal">b</span>:&amp;:num<span class="Special"> &lt;- </span>foo a
<span id="L733" class="LineNr"> 733 </span>]
<span id="L734" class="LineNr"> 734 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>b:_t [
<span id="L735" class="LineNr"> 735 </span> load-ingredients
<span id="L736" class="LineNr"> 736 </span> b<span class="Special"> &lt;- </span>copy a
<span id="L737" class="LineNr"> 737 </span>]
<span id="L738" class="LineNr"> 738 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: no call found for 'b:&amp;:num &lt;- foo a'</span>
<span id="L739" class="LineNr"> 739 </span>
<span id="L740" class="LineNr"> 740 </span><span class="Delimiter">:(scenario specialize_inside_recipe_without_header)</span>
<span id="L741" class="LineNr"> 741 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L742" class="LineNr"> 742 </span> foo <span class="Constant">3</span>
<span id="L743" class="LineNr"> 743 </span>]
<span id="L744" class="LineNr"> 744 </span><span class="muRecipe">def</span> foo [
<span id="L745" class="LineNr"> 745 </span> local-scope
<span id="L746" class="LineNr"> 746 </span> <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>next-ingredient <span class="Comment"># ensure no header</span>
<span id="L747" class="LineNr"> 747 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>bar x <span class="Comment"># call a shape-shifting recipe</span>
<span id="L748" class="LineNr"> 748 </span>]
<span id="L749" class="LineNr"> 749 </span><span class="muRecipe">def</span> bar x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
<span id="L750" class="LineNr"> 750 </span> local-scope
<span id="L751" class="LineNr"> 751 </span> load-ingredients
<span id="L752" class="LineNr"> 752 </span> y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
<span id="L753" class="LineNr"> 753 </span>]
<span id="L754" class="LineNr"> 754 </span><span class="traceContains">+mem: storing 4 in location 1</span>
<span id="L755" class="LineNr"> 755 </span>
<span id="L756" class="LineNr"> 756 </span><span class="Delimiter">:(scenario specialize_with_literal)</span>
<span id="L757" class="LineNr"> 757 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L758" class="LineNr"> 758 </span> local-scope
<span id="L759" class="LineNr"> 759 </span> <span class="Comment"># permit literal to map to number</span>
<span id="L760" class="LineNr"> 760 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span>
<span id="L761" class="LineNr"> 761 </span>]
<span id="L762" class="LineNr"> 762 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
<span id="L763" class="LineNr"> 763 </span> local-scope
<span id="L764" class="LineNr"> 764 </span> load-ingredients
<span id="L765" class="LineNr"> 765 </span> y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
<span id="L766" class="LineNr"> 766 </span>]
<span id="L767" class="LineNr"> 767 </span><span class="traceContains">+mem: storing 4 in location 1</span>
<span id="L768" class="LineNr"> 768 </span>
<span id="L769" class="LineNr"> 769 </span><span class="Delimiter">:(scenario specialize_with_literal_2)</span>
<span id="L770" class="LineNr"> 770 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L771" class="LineNr"> 771 </span> local-scope
<span id="L772" class="LineNr"> 772 </span> <span class="Comment"># permit literal to map to character</span>
<span id="L773" class="LineNr"> 773 </span> <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span>
<span id="L774" class="LineNr"> 774 </span>]
<span id="L775" class="LineNr"> 775 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
<span id="L776" class="LineNr"> 776 </span> local-scope
<span id="L777" class="LineNr"> 777 </span> load-ingredients
<span id="L778" class="LineNr"> 778 </span> y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span>
<span id="L779" class="LineNr"> 779 </span>]
<span id="L780" class="LineNr"> 780 </span><span class="traceContains">+mem: storing 4 in location 1</span>
<span id="L781" class="LineNr"> 781 </span>
<span id="L782" class="LineNr"> 782 </span><span class="Delimiter">:(scenario specialize_with_literal_3)</span>
<span id="L783" class="LineNr"> 783 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L784" class="LineNr"> 784 </span> local-scope
<span id="L785" class="LineNr"> 785 </span> <span class="Comment"># permit '0' to map to address to shape-shifting type-ingredient</span>
<span id="L786" class="LineNr"> 786 </span> <span class="Constant">1</span>:&amp;:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo<span class="Constant"> null</span>
<span id="L787" class="LineNr"> 787 </span>]
<span id="L788" class="LineNr"> 788 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [
<span id="L789" class="LineNr"> 789 </span> local-scope
<span id="L790" class="LineNr"> 790 </span> load-ingredients
<span id="L791" class="LineNr"> 791 </span> y<span class="Special"> &lt;- </span>copy x
<span id="L792" class="LineNr"> 792 </span>]
<span id="L793" class="LineNr"> 793 </span><span class="traceContains">+mem: storing 0 in location 1</span>
<span id="L794" class="LineNr"> 794 </span>$error: <span class="Constant">0</span>
<span id="L795" class="LineNr"> 795 </span>
<span id="L796" class="LineNr"> 796 </span><span class="Delimiter">:(scenario specialize_with_literal_4)</span>
<span id="L797" class="LineNr"> 797 </span><span class="Special">% Hide_errors = true;</span>
<span id="L798" class="LineNr"> 798 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L799" class="LineNr"> 799 </span> local-scope
<span id="L800" class="LineNr"> 800 </span> <span class="Comment"># ambiguous call: what's the type of its ingredient?!</span>
<span id="L801" class="LineNr"> 801 </span> foo <span class="Constant">0</span>
<span id="L802" class="LineNr"> 802 </span>]
<span id="L803" class="LineNr"> 803 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [
<span id="L804" class="LineNr"> 804 </span> local-scope
<span id="L805" class="LineNr"> 805 </span> load-ingredients
<span id="L806" class="LineNr"> 806 </span> y<span class="Special"> &lt;- </span>copy x
<span id="L807" class="LineNr"> 807 </span>]
<span id="L808" class="LineNr"> 808 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L33'>instruction</a> 'foo' has no valid specialization</span>
<span id="L809" class="LineNr"> 809 </span>
<span id="L810" class="LineNr"> 810 </span><span class="Delimiter">:(scenario specialize_with_literal_5)</span>
<span id="L811" class="LineNr"> 811 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L812" class="LineNr"> 812 </span> foo <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span class="Comment"># recipe mapping two variables to literals</span>
<span id="L813" class="LineNr"> 813 </span>]
<span id="L814" class="LineNr"> 814 </span><span class="muRecipe">def</span> foo x:_elem<span class="Delimiter">,</span> y:_elem [
<span id="L815" class="LineNr"> 815 </span> local-scope
<span id="L816" class="LineNr"> 816 </span> load-ingredients
<span id="L817" class="LineNr"> 817 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add x<span class="Delimiter">,</span> y
<span id="L818" class="LineNr"> 818 </span>]
<span id="L819" class="LineNr"> 819 </span><span class="traceContains">+mem: storing 7 in location 1</span>
<span id="L820" class="LineNr"> 820 </span>
<span id="L821" class="LineNr"> 821 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants)</span>
<span id="L822" class="LineNr"> 822 </span><span class="Comment"># try to call two different shape-shifting recipes with the same name</span>
<span id="L823" class="LineNr"> 823 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L824" class="LineNr"> 824 </span> <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
<span id="L825" class="LineNr"> 825 </span> <span class="Normal">e2</span>:d2:num<span class="Special"> &lt;- </span>merge <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span>
<span id="L826" class="LineNr"> 826 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1
<span id="L827" class="LineNr"> 827 </span> <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo e2
<span id="L828" class="LineNr"> 828 </span>]
<span id="L829" class="LineNr"> 829 </span><span class="Comment"># the two shape-shifting definitions</span>
<span id="L830" class="LineNr"> 830 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
<span id="L831" class="LineNr"> 831 </span> local-scope
<span id="L832" class="LineNr"> 832 </span> load-ingredients
<span id="L833" class="LineNr"> 833 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L834" class="LineNr"> 834 </span>]
<span id="L835" class="LineNr"> 835 </span><span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [
<span id="L836" class="LineNr"> 836 </span> local-scope
<span id="L837" class="LineNr"> 837 </span> load-ingredients
<span id="L838" class="LineNr"> 838 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L839" class="LineNr"> 839 </span>]
<span id="L840" class="LineNr"> 840 </span><span class="Comment"># the shape-shifting containers they use</span>
<span id="L841" class="LineNr"> 841 </span><span class="muData">container</span> d1:_elem [
<span id="L842" class="LineNr"> 842 </span> <span class="Normal">x</span>:_elem
<span id="L843" class="LineNr"> 843 </span>]
<span id="L844" class="LineNr"> 844 </span><span class="muData">container</span> d2:_elem [
<span id="L845" class="LineNr"> 845 </span> <span class="Normal">x</span>:num
<span id="L846" class="LineNr"> 846 </span> <span class="Normal">y</span>:_elem
<span id="L847" class="LineNr"> 847 </span>]
<span id="L848" class="LineNr"> 848 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L849" class="LineNr"> 849 </span><span class="traceContains">+mem: storing 35 in location 2</span>
<span id="L850" class="LineNr"> 850 </span>
<span id="L851" class="LineNr"> 851 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants_2)</span>
<span id="L852" class="LineNr"> 852 </span><span class="Comment"># static dispatch between shape-shifting variants, _including pointer lookups_</span>
<span id="L853" class="LineNr"> 853 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L854" class="LineNr"> 854 </span> <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
<span id="L855" class="LineNr"> 855 </span> <span class="Normal">e2</span>:&amp;:d2:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span>
<span id="L856" class="LineNr"> 856 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1
<span id="L857" class="LineNr"> 857 </span> <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo *e2 <span class="Comment"># different from previous scenario</span>
<span id="L858" class="LineNr"> 858 </span>]
<span id="L859" class="LineNr"> 859 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
<span id="L860" class="LineNr"> 860 </span> local-scope
<span id="L861" class="LineNr"> 861 </span> load-ingredients
<span id="L862" class="LineNr"> 862 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L863" class="LineNr"> 863 </span>]
<span id="L864" class="LineNr"> 864 </span><span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [
<span id="L865" class="LineNr"> 865 </span> local-scope
<span id="L866" class="LineNr"> 866 </span> load-ingredients
<span id="L867" class="LineNr"> 867 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L868" class="LineNr"> 868 </span>]
<span id="L869" class="LineNr"> 869 </span><span class="muData">container</span> d1:_elem [
<span id="L870" class="LineNr"> 870 </span> <span class="Normal">x</span>:_elem
<span id="L871" class="LineNr"> 871 </span>]
<span id="L872" class="LineNr"> 872 </span><span class="muData">container</span> d2:_elem [
<span id="L873" class="LineNr"> 873 </span> <span class="Normal">x</span>:num
<span id="L874" class="LineNr"> 874 </span> <span class="Normal">y</span>:_elem
<span id="L875" class="LineNr"> 875 </span>]
<span id="L876" class="LineNr"> 876 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L877" class="LineNr"> 877 </span><span class="traceContains">+mem: storing 35 in location 2</span>
<span id="L878" class="LineNr"> 878 </span>
<span id="L879" class="LineNr"> 879 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe)</span>
<span id="L880" class="LineNr"> 880 </span><span class="Special">% Hide_errors = true;</span>
<span id="L881" class="LineNr"> 881 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L882" class="LineNr"> 882 </span> <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
<span id="L883" class="LineNr"> 883 </span> foo a
<span id="L884" class="LineNr"> 884 </span>]
<span id="L885" class="LineNr"> 885 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
<span id="L886" class="LineNr"> 886 </span> local-scope
<span id="L887" class="LineNr"> 887 </span> load-ingredients
<span id="L888" class="LineNr"> 888 </span> copy e <span class="Comment"># no such variable</span>
<span id="L889" class="LineNr"> 889 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L890" class="LineNr"> 890 </span>]
<span id="L891" class="LineNr"> 891 </span><span class="muData">container</span> d1:_elem [
<span id="L892" class="LineNr"> 892 </span> <span class="Normal">x</span>:_elem
<span id="L893" class="LineNr"> 893 </span>]
<span id="L894" class="LineNr"> 894 </span><span class="traceContains">+error: foo: unknown type for 'e' in 'copy e' (check the name for typos)</span>
<span id="L895" class="LineNr"> 895 </span><span class="traceContains">+error: specializing foo: missing type for 'e'</span>
<span id="L896" class="LineNr"> 896 </span><span class="Comment"># and it doesn't crash</span>
<span id="L897" class="LineNr"> 897 </span>
<span id="L898" class="LineNr"> 898 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe_2)</span>
<span id="L899" class="LineNr"> 899 </span><span class="Special">% Hide_errors = true;</span>
<span id="L900" class="LineNr"> 900 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L901" class="LineNr"> 901 </span> <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span>
<span id="L902" class="LineNr"> 902 </span> foo a
<span id="L903" class="LineNr"> 903 </span>]
<span id="L904" class="LineNr"> 904 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [
<span id="L905" class="LineNr"> 905 </span> local-scope
<span id="L906" class="LineNr"> 906 </span> load-ingredients
<span id="L907" class="LineNr"> 907 </span> get e<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span class="Comment"># unknown variable in a 'get', which does some extra checking</span>
<span id="L908" class="LineNr"> 908 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L909" class="LineNr"> 909 </span>]
<span id="L910" class="LineNr"> 910 </span><span class="muData">container</span> d1:_elem [
<span id="L911" class="LineNr"> 911 </span> <span class="Normal">x</span>:_elem
<span id="L912" class="LineNr"> 912 </span>]
<span id="L913" class="LineNr"> 913 </span><span class="traceContains">+error: foo: unknown type for 'e' in 'get e, x:offset' (check the name for typos)</span>
<span id="L914" class="LineNr"> 914 </span><span class="traceContains">+error: specializing foo: missing type for 'e'</span>
<span id="L915" class="LineNr"> 915 </span><span class="Comment"># and it doesn't crash</span>
<span id="L916" class="LineNr"> 916 </span>
<span id="L917" class="LineNr"> 917 </span><span class="Delimiter">:(scenarios transform)</span>
<span id="L918" class="LineNr"> 918 </span><span class="Delimiter">:(scenario specialize_recursive_shape_shifting_recipe)</span>
<span id="L919" class="LineNr"> 919 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L920" class="LineNr"> 920 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L921" class="LineNr"> 921 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:num
<span id="L922" class="LineNr"> 922 </span>]
<span id="L923" class="LineNr"> 923 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
<span id="L924" class="LineNr"> 924 </span> local-scope
<span id="L925" class="LineNr"> 925 </span> load-ingredients
<span id="L926" class="LineNr"> 926 </span> <span class="Delimiter">{</span>
<span id="L927" class="LineNr"> 927 </span> <span class="Identifier">break</span>
<span id="L928" class="LineNr"> 928 </span> <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>foo x
<span id="L929" class="LineNr"> 929 </span> <span class="Delimiter">}</span>
<span id="L930" class="LineNr"> 930 </span> <span class="Identifier">return</span> y
<span id="L931" class="LineNr"> 931 </span>]
<span id="L932" class="LineNr"> 932 </span><span class="traceContains">+transform: new specialization: foo_2</span>
<span id="L933" class="LineNr"> 933 </span><span class="Comment"># transform terminates</span>
<span id="L934" class="LineNr"> 934 </span>
<span id="L935" class="LineNr"> 935 </span><span class="Delimiter">:(scenarios run)</span>
<span id="L936" class="LineNr"> 936 </span><span class="Delimiter">:(scenario specialize_most_similar_variant)</span>
<span id="L937" class="LineNr"> 937 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L938" class="LineNr"> 938 </span> <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
<span id="L939" class="LineNr"> 939 </span> <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:&amp;:num
<span id="L940" class="LineNr"> 940 </span>]
<span id="L941" class="LineNr"> 941 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
<span id="L942" class="LineNr"> 942 </span> local-scope
<span id="L943" class="LineNr"> 943 </span> load-ingredients
<span id="L944" class="LineNr"> 944 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L945" class="LineNr"> 945 </span>]
<span id="L946" class="LineNr"> 946 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
<span id="L947" class="LineNr"> 947 </span> local-scope
<span id="L948" class="LineNr"> 948 </span> load-ingredients
<span id="L949" class="LineNr"> 949 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L950" class="LineNr"> 950 </span>]
<span id="L951" class="LineNr"> 951 </span><span class="traceContains">+mem: storing 35 in location 10</span>
<span id="L952" class="LineNr"> 952 </span>
<span id="L953" class="LineNr"> 953 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_2)</span>
<span id="L954" class="LineNr"> 954 </span><span class="Comment"># version with headers padded with lots of unrelated concrete types</span>
<span id="L955" class="LineNr"> 955 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L956" class="LineNr"> 956 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span>
<span id="L957" class="LineNr"> 957 </span> <span class="Constant">2</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy<span class="Constant"> null</span>
<span id="L958" class="LineNr"> 958 </span> <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">2</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num
<span id="L959" class="LineNr"> 959 </span>]
<span id="L960" class="LineNr"> 960 </span><span class="Comment"># variant with concrete type</span>
<span id="L961" class="LineNr"> 961 </span><span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:num<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [
<span id="L962" class="LineNr"> 962 </span> local-scope
<span id="L963" class="LineNr"> 963 </span> load-ingredients
<span id="L964" class="LineNr"> 964 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L965" class="LineNr"> 965 </span>]
<span id="L966" class="LineNr"> 966 </span><span class="Comment"># shape-shifting variant</span>
<span id="L967" class="LineNr"> 967 </span><span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [
<span id="L968" class="LineNr"> 968 </span> local-scope
<span id="L969" class="LineNr"> 969 </span> load-ingredients
<span id="L970" class="LineNr"> 970 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L971" class="LineNr"> 971 </span>]
<span id="L972" class="LineNr"> 972 </span><span class="Comment"># prefer the concrete variant</span>
<span id="L973" class="LineNr"> 973 </span><span class="traceContains">+mem: storing 34 in location 4</span>
<span id="L974" class="LineNr"> 974 </span>
<span id="L975" class="LineNr"> 975 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_3)</span>
<span id="L976" class="LineNr"> 976 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L977" class="LineNr"> 977 </span> <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L978" class="LineNr"> 978 </span> foo <span class="Constant">1</span>:text
<span id="L979" class="LineNr"> 979 </span>]
<span id="L980" class="LineNr"> 980 </span><span class="muRecipe">def</span> foo x:text [
<span id="L981" class="LineNr"> 981 </span> <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L982" class="LineNr"> 982 </span>]
<span id="L983" class="LineNr"> 983 </span><span class="muRecipe">def</span> foo x:&amp;:_elem [
<span id="L984" class="LineNr"> 984 </span> <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
<span id="L985" class="LineNr"> 985 </span>]
<span id="L986" class="LineNr"> 986 </span><span class="Comment"># make sure the more precise version was used</span>
<span id="L987" class="LineNr"> 987 </span><span class="traceContains">+mem: storing 34 in location 10</span>
<span id="L988" class="LineNr"> 988 </span>
<span id="L989" class="LineNr"> 989 </span><span class="Delimiter">:(scenario specialize_literal_as_number)</span>
<span id="L990" class="LineNr"> 990 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L991" class="LineNr"> 991 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">23</span>
<span id="L992" class="LineNr"> 992 </span>]
<span id="L993" class="LineNr"> 993 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [
<span id="L994" class="LineNr"> 994 </span> local-scope
<span id="L995" class="LineNr"> 995 </span> load-ingredients
<span id="L996" class="LineNr"> 996 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L997" class="LineNr"> 997 </span>]
<span id="L998" class="LineNr"> 998 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [
<span id="L999" class="LineNr"> 999 </span> local-scope
<span id="L1000" class="LineNr">1000 </span> load-ingredients
<span id="L1001" class="LineNr">1001 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L1002" class="LineNr">1002 </span>]
<span id="L1003" class="LineNr">1003 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L1004" class="LineNr">1004 </span>
<span id="L1005" class="LineNr">1005 </span><span class="Delimiter">:(scenario specialize_literal_as_number_2)</span>
<span id="L1006" class="LineNr">1006 </span><span class="Comment"># version calling with literal</span>
<span id="L1007" class="LineNr">1007 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1008" class="LineNr">1008 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span>
<span id="L1009" class="LineNr">1009 </span>]
<span id="L1010" class="LineNr">1010 </span><span class="Comment"># variant with concrete type</span>
<span id="L1011" class="LineNr">1011 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [
<span id="L1012" class="LineNr">1012 </span> local-scope
<span id="L1013" class="LineNr">1013 </span> load-ingredients
<span id="L1014" class="LineNr">1014 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L1015" class="LineNr">1015 </span>]
<span id="L1016" class="LineNr">1016 </span><span class="Comment"># shape-shifting variant</span>
<span id="L1017" class="LineNr">1017 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
<span id="L1018" class="LineNr">1018 </span> local-scope
<span id="L1019" class="LineNr">1019 </span> load-ingredients
<span id="L1020" class="LineNr">1020 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L1021" class="LineNr">1021 </span>]
<span id="L1022" class="LineNr">1022 </span><span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span>
<span id="L1023" class="LineNr">1023 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L1024" class="LineNr">1024 </span>
<span id="L1025" class="LineNr">1025 </span><span class="Delimiter">:(scenario specialize_literal_as_address)</span>
<span id="L1026" class="LineNr">1026 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1027" class="LineNr">1027 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo<span class="Constant"> null</span>
<span id="L1028" class="LineNr">1028 </span>]
<span id="L1029" class="LineNr">1029 </span><span class="Comment"># variant with concrete address type</span>
<span id="L1030" class="LineNr">1030 </span><span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [
<span id="L1031" class="LineNr">1031 </span> local-scope
<span id="L1032" class="LineNr">1032 </span> load-ingredients
<span id="L1033" class="LineNr">1033 </span> <span class="Identifier">return</span> <span class="Constant">34</span>
<span id="L1034" class="LineNr">1034 </span>]
<span id="L1035" class="LineNr">1035 </span><span class="Comment"># shape-shifting variant</span>
<span id="L1036" class="LineNr">1036 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [
<span id="L1037" class="LineNr">1037 </span> local-scope
<span id="L1038" class="LineNr">1038 </span> load-ingredients
<span id="L1039" class="LineNr">1039 </span> <span class="Identifier">return</span> <span class="Constant">35</span>
<span id="L1040" class="LineNr">1040 </span>]
<span id="L1041" class="LineNr">1041 </span><span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span>
<span id="L1042" class="LineNr">1042 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L1043" class="LineNr">1043 </span>
<span id="L1044" class="LineNr">1044 </span><span class="Delimiter">:(scenario missing_type_during_specialization)</span>
<span id="L1045" class="LineNr">1045 </span><span class="Special">% Hide_errors = true;</span>
<span id="L1046" class="LineNr">1046 </span><span class="Comment"># define a shape-shifting recipe</span>
<span id="L1047" class="LineNr">1047 </span><span class="muRecipe">def</span> foo a:_elem [
<span id="L1048" class="LineNr">1048 </span>]
<span id="L1049" class="LineNr">1049 </span><span class="Comment"># define a container with field 'z'</span>
<span id="L1050" class="LineNr">1050 </span><span class="muData">container</span> foo2 [
<span id="L1051" class="LineNr">1051 </span> <span class="Normal">z</span>:num
<span id="L1052" class="LineNr">1052 </span>]
<span id="L1053" class="LineNr">1053 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1054" class="LineNr">1054 </span> local-scope
<span id="L1055" class="LineNr">1055 </span> <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
<span id="L1056" class="LineNr">1056 </span> <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse <span class="Comment"># typo in 'offset'</span>
<span id="L1057" class="LineNr">1057 </span> <span class="Comment"># define a variable with the same name 'z'</span>
<span id="L1058" class="LineNr">1058 </span> <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L1059" class="LineNr">1059 </span> <span class="Comment"># trigger specialization of the shape-shifting recipe</span>
<span id="L1060" class="LineNr">1060 </span> foo z
<span id="L1061" class="LineNr">1061 </span>]
<span id="L1062" class="LineNr">1062 </span><span class="Comment"># shouldn't crash</span>
<span id="L1063" class="LineNr">1063 </span>
<span id="L1064" class="LineNr">1064 </span><span class="Delimiter">:(scenario missing_type_during_specialization2)</span>
<span id="L1065" class="LineNr">1065 </span><span class="Special">% Hide_errors = true;</span>
<span id="L1066" class="LineNr">1066 </span><span class="Comment"># define a shape-shifting recipe</span>
<span id="L1067" class="LineNr">1067 </span><span class="muRecipe">def</span> foo a:_elem [
<span id="L1068" class="LineNr">1068 </span>]
<span id="L1069" class="LineNr">1069 </span><span class="Comment"># define a container with field 'z'</span>
<span id="L1070" class="LineNr">1070 </span><span class="muData">container</span> foo2 [
<span id="L1071" class="LineNr">1071 </span> <span class="Normal">z</span>:num
<span id="L1072" class="LineNr">1072 </span>]
<span id="L1073" class="LineNr">1073 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1074" class="LineNr">1074 </span> local-scope
<span id="L1075" class="LineNr">1075 </span> <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span>
<span id="L1076" class="LineNr">1076 </span> <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse <span class="Comment"># typo in 'offset'</span>
<span id="L1077" class="LineNr">1077 </span> <span class="Comment"># define a variable with the same name 'z'</span>
<span id="L1078" class="LineNr">1078 </span> <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
<span id="L1079" class="LineNr">1079 </span> <span class="Comment"># trigger specialization of the shape-shifting recipe</span>
<span id="L1080" class="LineNr">1080 </span> foo *z
<span id="L1081" class="LineNr">1081 </span>]
<span id="L1082" class="LineNr">1082 </span><span class="Comment"># shouldn't crash</span>
<span id="L1083" class="LineNr">1083 </span>
<span id="L1084" class="LineNr">1084 </span><span class="Delimiter">:(scenario tangle_shape_shifting_recipe)</span>
<span id="L1085" class="LineNr">1085 </span><span class="Comment"># shape-shifting recipe</span>
<span id="L1086" class="LineNr">1086 </span><span class="muRecipe">def</span> foo a:_elem [
<span id="L1087" class="LineNr">1087 </span> local-scope
<span id="L1088" class="LineNr">1088 </span> load-ingredients
<span id="L1089" class="LineNr">1089 </span> &lt;label1&gt;
<span id="L1090" class="LineNr">1090 </span>]
<span id="L1091" class="LineNr">1091 </span><span class="Comment"># tangle some code that refers to the type ingredient</span>
<span id="L1092" class="LineNr">1092 </span><span class="muRecipe">after</span> &lt;label1&gt; [
<span id="L1093" class="LineNr">1093 </span> <span class="Normal">b</span>:_elem<span class="Special"> &lt;- </span>copy a
<span id="L1094" class="LineNr">1094 </span>]
<span id="L1095" class="LineNr">1095 </span><span class="Comment"># trigger specialization</span>
<span id="L1096" class="LineNr">1096 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1097" class="LineNr">1097 </span> local-scope
<span id="L1098" class="LineNr">1098 </span> foo <span class="Constant">34</span>
<span id="L1099" class="LineNr">1099 </span>]
<span id="L1100" class="LineNr">1100 </span>$error: <span class="Constant">0</span>
<span id="L1101" class="LineNr">1101 </span>
<span id="L1102" class="LineNr">1102 </span><span class="Delimiter">:(scenario tangle_shape_shifting_recipe_with_type_abbreviation)</span>
<span id="L1103" class="LineNr">1103 </span><span class="Comment"># shape-shifting recipe</span>
<span id="L1104" class="LineNr">1104 </span><span class="muRecipe">def</span> foo a:_elem [
<span id="L1105" class="LineNr">1105 </span> local-scope
<span id="L1106" class="LineNr">1106 </span> load-ingredients
<span id="L1107" class="LineNr">1107 </span> &lt;label1&gt;
<span id="L1108" class="LineNr">1108 </span>]
<span id="L1109" class="LineNr">1109 </span><span class="Comment"># tangle some code that refers to the type ingredient</span>
<span id="L1110" class="LineNr">1110 </span><span class="muRecipe">after</span> &lt;label1&gt; [
<span id="L1111" class="LineNr">1111 </span> <span class="Normal">b</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy<span class="Constant"> false</span> <span class="Comment"># type abbreviation</span>
<span id="L1112" class="LineNr">1112 </span>]
<span id="L1113" class="LineNr">1113 </span><span class="Comment"># trigger specialization</span>
<span id="L1114" class="LineNr">1114 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1115" class="LineNr">1115 </span> local-scope
<span id="L1116" class="LineNr">1116 </span> foo <span class="Constant">34</span>
<span id="L1117" class="LineNr">1117 </span>]
<span id="L1118" class="LineNr">1118 </span>$error: <span class="Constant">0</span>
<span id="L1119" class="LineNr">1119 </span>
<span id="L1120" class="LineNr">1120 </span><span class="Delimiter">:(scenario shape_shifting_recipe_coexists_with_primitive)</span>
<span id="L1121" class="LineNr">1121 </span><span class="Comment"># recipe overloading a primitive with a generic type</span>
<span id="L1122" class="LineNr">1122 </span><span class="muRecipe">def</span> add a:&amp;:foo:_elem [
<span id="L1123" class="LineNr">1123 </span> assert <span class="Constant">0</span><span class="Delimiter">,</span> [should <span class="Normal">not</span> get here]
<span id="L1124" class="LineNr">1124 </span>]
<span id="L1125" class="LineNr">1125 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1126" class="LineNr">1126 </span> <span class="Comment"># call primitive add with literal 0</span>
<span id="L1127" class="LineNr">1127 </span> add <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span>
<span id="L1128" class="LineNr">1128 </span>]
<span id="L1129" class="LineNr">1129 </span>$error: <span class="Constant">0</span>
<span id="L1130" class="LineNr">1130 </span>
<span id="L1131" class="LineNr">1131 </span><span class="Delimiter">:(scenario specialization_heuristic_test_1)</span>
<span id="L1132" class="LineNr">1132 </span><span class="Comment"># modeled on the 'buffer' container in text.mu</span>
<span id="L1133" class="LineNr">1133 </span><span class="muData">container</span> foo_buffer:_elem [
<span id="L1134" class="LineNr">1134 </span> <span class="Normal">x</span>:num
<span id="L1135" class="LineNr">1135 </span>]
<span id="L1136" class="LineNr">1136 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L1137" class="LineNr">1137 </span> append <span class="Constant">1</span>:&amp;:foo_buffer:<span class="Normal">char</span>/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:text/<span class="Special">raw</span>
<span id="L1138" class="LineNr">1138 </span>]
<span id="L1139" class="LineNr">1139 </span><span class="muRecipe">def</span> append buf:&amp;:foo_buffer:_elem<span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:foo_buffer:_elem [
<span id="L1140" class="LineNr">1140 </span> local-scope
<span id="L1141" class="LineNr">1141 </span> load-ingredients
<span id="L1142" class="LineNr">1142 </span> stash <span class="Constant">34</span>
<span id="L1143" class="LineNr">1143 </span>]
<span id="L1144" class="LineNr">1144 </span><span class="muRecipe">def</span> append buf:&amp;:foo_buffer:<span class="Normal">char</span><span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:foo_buffer:<span class="Normal">char</span> [
<span id="L1145" class="LineNr">1145 </span> local-scope
<span id="L1146" class="LineNr">1146 </span> load-ingredients
<span id="L1147" class="LineNr">1147 </span> stash <span class="Constant">35</span>
<span id="L1148" class="LineNr">1148 </span>]
<span id="L1149" class="LineNr">1149 </span><span class="muRecipe">def</span> append buf:&amp;:foo_buffer:_elem<span class="Delimiter">,</span> x:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:foo_buffer:_elem [
<span id="L1150" class="LineNr">1150 </span> local-scope
<span id="L1151" class="LineNr">1151 </span> load-ingredients
<span id="L1152" class="LineNr">1152 </span> stash <span class="Constant">36</span>
<span id="L1153" class="LineNr">1153 </span>]
<span id="L1154" class="LineNr">1154 </span><span class="traceContains">+app: 36</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->