diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-03-13 23:29:50 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-03-13 23:29:50 -0700 |
commit | 8b095f802129f8c328a3a4dc3de4443890d34d59 (patch) | |
tree | 43aa08d9e25bab2879c0ecc1c8c037f8d4ec99cc /064rewrite_literal_string.cc | |
parent | f466a648b7a424d96c14bd671f9915f274397e04 (diff) | |
download | mu-8b095f802129f8c328a3a4dc3de4443890d34d59.tar.gz |
2777 - pass literal strings into functions
Diffstat (limited to '064rewrite_literal_string.cc')
-rw-r--r-- | 064rewrite_literal_string.cc | 53 |
1 files changed, 53 insertions, 0 deletions
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'; +} |