diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-01-26 23:47:23 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-01-26 23:47:23 -0800 |
commit | d009e158803956c76adbf8f58a62884c3e7affb3 (patch) | |
tree | b88198e28d15cd1fc064f5300365a190decc4c50 /html/059shape_shifting_recipe.cc.html | |
parent | 2da43c9462c7b7c1bb78d2f2826b3b97b4874973 (diff) | |
download | mu-d009e158803956c76adbf8f58a62884c3e7affb3.tar.gz |
2605
Diffstat (limited to 'html/059shape_shifting_recipe.cc.html')
-rw-r--r-- | html/059shape_shifting_recipe.cc.html | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/html/059shape_shifting_recipe.cc.html b/html/059shape_shifting_recipe.cc.html index 4b895042..dcbcd680 100644 --- a/html/059shape_shifting_recipe.cc.html +++ b/html/059shape_shifting_recipe.cc.html @@ -109,32 +109,28 @@ if <span class="Delimiter">(</span>best_score == -<span class="Constant">1</span if <span class="Delimiter">(</span>exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="CommentedCode">//? cerr << "specializing " << inst.name << '\n';</span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"found variant to specialize: "</span> << exemplar << <span class="Constant">' '</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> - LOG << <span class="Constant">"found variant to specialize: "</span> << exemplar << <span class="Constant">' '</span> << header<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> recipe_ordinal new_recipe_ordinal = new_variant<span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span> + if <span class="Delimiter">(</span>new_recipe_ordinal == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">goto</span> done_constructing_variant<span class="Delimiter">;</span> variants<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>new_recipe_ordinal<span class="Delimiter">);</span> <span class="Comment">// perform all transforms on the new specialization</span> const string& new_name = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>back<span class="Delimiter">()).</span>name<span class="Delimiter">;</span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"transforming new specialization: "</span> << new_name << end<span class="Delimiter">();</span> - LOG << <span class="Constant">"transforming new specialization: "</span> << header<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>back<span class="Delimiter">()))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> for <span class="Delimiter">(</span>long long int t = <span class="Constant">0</span><span class="Delimiter">;</span> t < SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Delimiter">(</span>*Transform<span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span> <span class="Delimiter">}</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">).</span>transformed_until = SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span> - LOG << <span class="Constant">"replacing "</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">" with "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>back<span class="Delimiter">()).</span>name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> inst<span class="Delimiter">.</span>name = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variants<span class="Delimiter">.</span>back<span class="Delimiter">()).</span>name<span class="Delimiter">;</span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"new specialization: "</span> << inst<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> - LOG << <span class="Constant">"new specialization: "</span> << inst<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> + done_constructing_variant:<span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Comment">//: make sure we have no unspecialized shape-shifting recipes being called</span> <span class="Comment">//: before running mu programs</span> <span class="Delimiter">:(before "End Instruction Operation Checks")</span> -<span class="CommentedCode">//? LOG << inst.operation << " " << contains_key(Recipe, inst.operation) << '\n';</span> if <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> && inst<span class="Delimiter">.</span>operation >= MAX_PRIMITIVE_RECIPES && any_type_ingredient_in_header<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span class="CommentedCode">//? LOG << header(caller) << "instruction " << inst.name << " has no valid specialization\n";</span> raise_error << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"instruction "</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">" has no valid specialization</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> @@ -319,7 +315,7 @@ recipe_ordinal new_variant<span class="Delimiter">(</span>recipe_ordinal exempla if <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> for <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> const string_tree*>::iterator p = mappings<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != mappings<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> delete p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> - if <span class="Delimiter">(</span>error<span class="Delimiter">)</span> <span class="Identifier">return</span> exemplar<span class="Delimiter">;</span> + if <span class="Delimiter">(</span>error<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Comment">// todo: delete new_recipe_ordinal from Recipes and other global state</span> <span class="Delimiter">}</span> ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span> <span class="Identifier">return</span> new_recipe_ordinal<span class="Delimiter">;</span> @@ -574,14 +570,14 @@ container foo:_t [ <span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient)</span> recipe main [ - <span class="Constant">1</span>:address:foo:point<span class="Special"> <- </span>bar <span class="Constant">3</span> - <span class="Constant">11</span>:foo:point<span class="Special"> <- </span>copy *<span class="Constant">1</span>:address:foo:point + <span class="Constant">1</span>:address:shared:foo:point<span class="Special"> <- </span>bar <span class="Constant">3</span> + <span class="Constant">11</span>:foo:point<span class="Special"> <- </span>copy *<span class="Constant">1</span>:address:shared:foo:point ] container foo:_t [ x:_t y:number ] -recipe bar x:number <span class="Delimiter">-></span> result:address:foo:_t [ +recipe bar x:number <span class="Delimiter">-></span> result:address:shared:foo:_t [ local-scope load-ingredients <span class="Comment"># new refers to _t in its ingredient *value*</span> @@ -593,10 +589,10 @@ recipe bar x:number <span class="Delimiter">-></span> result:address:foo:_t [ <span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient_2)</span> recipe main [ - <span class="Constant">1</span>:address:foo:point<span class="Special"> <- </span>bar <span class="Constant">3</span> - <span class="Constant">11</span>:foo:point<span class="Special"> <- </span>copy *<span class="Constant">1</span>:address:foo:point + <span class="Constant">1</span>:address:shared:foo:point<span class="Special"> <- </span>bar <span class="Constant">3</span> + <span class="Constant">11</span>:foo:point<span class="Special"> <- </span>copy *<span class="Constant">1</span>:address:shared:foo:point ] -recipe bar x:number <span class="Delimiter">-></span> result:address:foo:_t [ +recipe bar x:number <span class="Delimiter">-></span> result:address:shared:foo:_t [ local-scope load-ingredients <span class="Comment"># new refers to _t in its ingredient *value*</span> @@ -613,11 +609,11 @@ container foo:_t [ <span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types)</span> recipe main [ - <span class="Constant">1</span>:address:point<span class="Special"> <- </span>new point:type - <span class="Constant">2</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">1</span>:address:point<span class="Delimiter">,</span> y:offset + <span class="Constant">1</span>:address:shared:point<span class="Special"> <- </span>new point:type + <span class="Constant">2</span>:address:number<span class="Special"> <- </span>get-address *<span class="Constant">1</span>:address:shared:point<span class="Delimiter">,</span> y:offset *<span class="Constant">2</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">34</span> - <span class="Constant">3</span>:address:point<span class="Special"> <- </span>bar <span class="Constant">1</span>:address:point <span class="Comment"># specialize _t to address:point</span> - <span class="Constant">4</span>:point<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:point + <span class="Constant">3</span>:address:shared:point<span class="Special"> <- </span>bar <span class="Constant">1</span>:address:shared:point <span class="Comment"># specialize _t to address:shared:point</span> + <span class="Constant">4</span>:point<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:shared:point ] recipe bar a:_t <span class="Delimiter">-></span> result:_t [ local-scope @@ -630,13 +626,13 @@ recipe bar a:_t <span class="Delimiter">-></span> result:_t [ <span class="Special">% Hide_errors = true;</span> recipe main [ a:number<span class="Special"> <- </span>copy <span class="Constant">3</span> - b:address:number<span class="Special"> <- </span>foo a + b:address:shared:number<span class="Special"> <- </span>foo a ] recipe foo a:_t <span class="Delimiter">-></span> b:_t [ load-ingredients b<span class="Special"> <- </span>copy a ] -<span class="traceContains">+error: main: no call found for 'b:address:number <- foo a'</span> +<span class="traceContains">+error: main: no call found for 'b:address:shared:number <- foo a'</span> <span class="Delimiter">:(scenario specialize_inside_recipe_without_header)</span> recipe main [ @@ -685,7 +681,7 @@ recipe foo x:_elem <span class="Delimiter">-></span> y:_elem [ recipe main [ local-scope <span class="Comment"># permit '0' to map to address to shape-shifting type-ingredient</span> - <span class="Constant">1</span>:address:character/<span class="Special">raw <- </span>foo <span class="Constant">0</span> + <span class="Constant">1</span>:address:shared:character/<span class="Special">raw <- </span>foo <span class="Constant">0</span> ] recipe foo x:address:_elem <span class="Delimiter">-></span> y:address:_elem [ local-scope @@ -755,7 +751,7 @@ container d2:_elem [ <span class="Comment"># static dispatch between shape-shifting variants, _including pointer lookups_</span> recipe main [ e1:d1:number<span class="Special"> <- </span>merge <span class="Constant">3</span> - e2:address:d2:number<span class="Special"> <- </span>new <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> + e2:address:shared:d2:number<span class="Special"> <- </span>new <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span class="Constant">1</span>:number/<span class="Special">raw <- </span>foo e1 <span class="Constant">2</span>:number/<span class="Special">raw <- </span>foo *e2 <span class="Comment"># different from previous scenario</span> ] @@ -838,15 +834,15 @@ recipe foo x:_elem <span class="Delimiter">-></span> y:number [ <span class="Delimiter">:(scenarios run)</span> <span class="Delimiter">:(scenario specialize_most_similar_variant)</span> recipe main [ - <span class="Constant">1</span>:address:number<span class="Special"> <- </span>new number:type - <span class="Constant">2</span>:number<span class="Special"> <- </span>foo <span class="Constant">1</span>:address:number + <span class="Constant">1</span>:address:shared:number<span class="Special"> <- </span>new number:type + <span class="Constant">2</span>:number<span class="Special"> <- </span>foo <span class="Constant">1</span>:address:shared:number ] recipe foo x:_elem <span class="Delimiter">-></span> y:number [ local-scope load-ingredients reply <span class="Constant">34</span> ] -recipe foo x:address:_elem <span class="Delimiter">-></span> y:number [ +recipe foo x:address:shared:_elem <span class="Delimiter">-></span> y:number [ local-scope load-ingredients reply <span class="Constant">35</span> |