diff options
-rw-r--r-- | 053rewrite_stash.cc | 8 | ||||
-rw-r--r-- | 064rewrite_literal_string.cc | 53 | ||||
-rw-r--r-- | edit/010-errors.mu | 19 |
3 files changed, 67 insertions, 13 deletions
diff --git a/053rewrite_stash.cc b/053rewrite_stash.cc index 66352224..e753050e 100644 --- a/053rewrite_stash.cc +++ b/053rewrite_stash.cc @@ -19,18 +19,18 @@ void rewrite_stashes_to_text(recipe_ordinal r) { recipe& caller = get(Recipe, r); trace(9991, "transform") << "--- rewrite 'stash' instructions in recipe " << caller.name << end(); // in recipes without named locations, 'stash' is still not extensible - if (!contains_named_locations(caller)) return; + if (contains_numeric_locations(caller)) return; rewrite_stashes_to_text(caller); } -bool contains_named_locations(const recipe& caller) { +bool contains_numeric_locations(const recipe& caller) { for (int i = 0; i < SIZE(caller.steps); ++i) { const instruction& inst = caller.steps.at(i); for (int in = 0; in < SIZE(inst.ingredients); ++in) - if (is_named_location(inst.ingredients.at(in))) + if (is_numeric_location(inst.ingredients.at(in))) return true; for (int out = 0; out < SIZE(inst.products); ++out) - if (is_named_location(inst.products.at(out))) + if (is_numeric_location(inst.products.at(out))) return true; } return false; diff --git a/064rewrite_literal_string.cc b/064rewrite_literal_string.cc new file mode 100644 index 00000000..86a18e81 --- /dev/null +++ b/064rewrite_literal_string.cc @@ -0,0 +1,53 @@ +//: allow using literal strings anywhere that will accept immutable strings + +:(before "End Instruction Inserting/Deleting Transforms") +initialize_transform_rewrite_literal_string_to_text(); +Transform.push_back(rewrite_literal_string_to_text); + +:(before "End Globals") +set<string> recipes_taking_literal_strings; +:(code) +void initialize_transform_rewrite_literal_string_to_text() { + recipes_taking_literal_strings.insert("$print"); + recipes_taking_literal_strings.insert("trace"); + recipes_taking_literal_strings.insert("stash"); + recipes_taking_literal_strings.insert("assert"); + recipes_taking_literal_strings.insert("new"); + recipes_taking_literal_strings.insert("run"); + recipes_taking_literal_strings.insert("assume-console"); + recipes_taking_literal_strings.insert("memory-should-contain"); + recipes_taking_literal_strings.insert("trace-should-contain"); + recipes_taking_literal_strings.insert("trace-should-not-contain"); + recipes_taking_literal_strings.insert("check-trace-count-for-label"); + recipes_taking_literal_strings.insert("screen-should-contain"); + recipes_taking_literal_strings.insert("screen-should-contain-in-color"); +} + +void rewrite_literal_string_to_text(recipe_ordinal r) { + recipe& caller = get(Recipe, r); + trace(9991, "transform") << "--- rewrite literal strings in recipe " << caller.name << end(); +//? cerr << "--- rewrite literal strings in recipe " << caller.name << '\n'; + if (contains_numeric_locations(caller)) return; +//? cerr << "00\n"; + vector<instruction> new_instructions; + for (int i = 0; i < SIZE(caller.steps); ++i) { + instruction& inst = caller.steps.at(i); + if (recipes_taking_literal_strings.find(inst.name) == recipes_taking_literal_strings.end()) { + for (int j = 0; j < SIZE(inst.ingredients); ++j) { + if (!is_literal_string(inst.ingredients.at(j))) continue; + instruction def; + ostringstream ingredient_name; + ingredient_name << inst.name << '_' << i << '_' << j << ":address:shared:array:character"; + def.name = "new"; + def.ingredients.push_back(inst.ingredients.at(j)); + def.products.push_back(reagent(ingredient_name.str())); + new_instructions.push_back(def); + inst.ingredients.at(j).clear(); // reclaim old memory + inst.ingredients.at(j) = reagent(ingredient_name.str()); + } + } + new_instructions.push_back(inst); + } + caller.steps.swap(new_instructions); +//? cerr << "aa: " << to_string(caller) << '\n'; +} diff --git a/edit/010-errors.mu b/edit/010-errors.mu index aa4283e1..d913302c 100644 --- a/edit/010-errors.mu +++ b/edit/010-errors.mu @@ -250,7 +250,8 @@ scenario run-updates-errors-for-shape-shifting-recipes [ 1:address:shared:array:character <- new [recipe foo x:_elem -> z:_elem [ local-scope load-ingredients -z <- add x, [a] +y:address:number <- copy 0 +z <- add x, y ]] 2:address:shared:array:character <- new [foo 2] 3:address:shared:programming-environment-data <- new-programming-environment screen:address:shared:screen, 1:address:shared:array:character, 2:address:shared:array:character @@ -263,10 +264,10 @@ z <- add x, [a] .recipe foo x:_elem -> z:_elem [ ┊ . .local-scope ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .load-ingredients ┊0 x. - .z <- add x, [a] ┊foo 2 . - .] ┊foo_2: 'add' requires number ingredients, but go↩. - .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊t [a] . - . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + .y:address:number <- copy 0 ┊foo 2 . + .z <- add x, y ┊foo_2: 'add' requires number ingredients, but go↩. + .] ┊t y . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] # now rerun everything @@ -282,10 +283,10 @@ z <- add x, [a] .recipe foo x:_elem -> z:_elem [ ┊ . .local-scope ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. .load-ingredients ┊0 x. - .z <- add x, [a] ┊foo 2 . - .] ┊foo_2: 'add' requires number ingredients, but go↩. - .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊t [a] . - . ┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. + .y:address:number <- copy 0 ┊foo 2 . + .z <- add x, y ┊foo_2: 'add' requires number ingredients, but go↩. + .] ┊t y . + .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━. . ┊ . ] ] |