about summary refs log blame commit diff stats
path: root/064rewrite_literal_string.cc
blob: 86a18e816c0b597c4aff802d53cbb3dae8b202c6 (plain) (tree)




















































                                                                                                  
//: 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';
}