diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2015-11-14 22:59:09 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2015-11-14 22:59:09 -0800 |
commit | 5bbd91a06eb2e315682a77fb4845c3321a0b3920 (patch) | |
tree | 676e45c0f0d50f4f2e7d92c33bd12787389cabdd | |
parent | 687f871a932cefbb66b8eb189d312058f4e02a99 (diff) | |
download | mu-5bbd91a06eb2e315682a77fb4845c3321a0b3920.tar.gz |
2438 - specialize inside header-less recipes
What was I thinking with 2366? Thanks Caleb Couch. It turned out we couldn't call shape-shifting recipes inside the edit/ or sandbox/ apps.
-rw-r--r-- | 057static_dispatch.cc | 1 | ||||
-rw-r--r-- | 059shape_shifting_recipe.cc | 27 |
2 files changed, 26 insertions, 2 deletions
diff --git a/057static_dispatch.cc b/057static_dispatch.cc index 082452ff..54da5354 100644 --- a/057static_dispatch.cc +++ b/057static_dispatch.cc @@ -111,7 +111,6 @@ Transform.push_back(resolve_ambiguous_calls); // idempotent :(code) void resolve_ambiguous_calls(recipe_ordinal r) { recipe& caller_recipe = get(Recipe, r); - if (!caller_recipe.has_header) return; trace(9991, "transform") << "--- resolve ambiguous calls for recipe " << caller_recipe.name << end(); for (long long int index = 0; index < SIZE(caller_recipe.steps); ++index) { instruction& inst = caller_recipe.steps.at(index); diff --git a/059shape_shifting_recipe.cc b/059shape_shifting_recipe.cc index e308be3a..bc63d616 100644 --- a/059shape_shifting_recipe.cc +++ b/059shape_shifting_recipe.cc @@ -20,11 +20,20 @@ recipe foo a:_t -> result:_t [ +mem: storing 14 in location 11 +mem: storing 15 in location 12 -//: Before anything else, disable transforms for shape-shifting recipes. +//: Before anything else, disable transforms for shape-shifting recipes and +//: make sure we never try to actually run a shape-shifting recipe. We should +//: be rewriting such instructions to *specializations* with the type +//: ingredients filled in. :(before "End Transform Checks") if (any_type_ingredient_in_header(/*recipe_ordinal*/p->first)) continue; +:(after "Running One Instruction") +if (Current_routine->calls.front().running_step_index == 0 + && any_type_ingredient_in_header(Current_routine->calls.front().running_recipe)) { + raise_error << "ran into unspecialized shape-shifting recipe " << current_recipe_name() << '\n' << end(); +} + //: We'll be creating recipes without loading them from anywhere by //: *specializing* existing recipes, so make sure we don't clear any of those //: when we start running tests. @@ -442,3 +451,19 @@ recipe foo a:_t -> b:_t [ b <- copy a ] +error: main: no call found for 'b:address:number <- foo a' + +:(scenario specialize_inside_recipe_without_header) +recipe main [ + foo 3 +] +recipe foo [ + local-scope + x:number <- next-ingredient # ensure no header + 1:number/raw <- bar x # call a shape-shifting recipe +] +recipe bar x:_elem -> y:_elem [ + local-scope + load-ingredients + y <- add x, 1 +] ++mem: storing 4 in location 1 |