about summary refs log tree commit diff stats
path: root/071rewrite_stash.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-03-14 01:00:48 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-03-14 01:00:48 -0700
commit2badd89a58b9666563746d71069abf16f05709ea (patch)
tree779c9feb243fc8d0f33051cd8323fd23f912f373 /071rewrite_stash.cc
parent8b095f802129f8c328a3a4dc3de4443890d34d59 (diff)
downloadmu-2badd89a58b9666563746d71069abf16f05709ea.tar.gz
2778 - fix all layers
Diffstat (limited to '071rewrite_stash.cc')
-rw-r--r--071rewrite_stash.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/071rewrite_stash.cc b/071rewrite_stash.cc
new file mode 100644
index 00000000..ea7c140f
--- /dev/null
+++ b/071rewrite_stash.cc
@@ -0,0 +1,50 @@
+//: when encountering other types, try to convert them to strings using
+//: 'to-text'
+
+:(scenarios transform)
+:(scenario rewrite_stashes_to_text)
+recipe main [
+  local-scope
+  n:number <- copy 34
+  stash n
+]
++transform: stash_2_0:address:shared:array:character <- to-text-line n
++transform: stash stash_2_0:address:shared:array:character
+
+:(before "End Instruction Inserting/Deleting Transforms")
+Transform.push_back(rewrite_stashes_to_text);
+
+:(code)
+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_numeric_locations(caller)) return;
+  rewrite_stashes_to_text(caller);
+}
+
+void rewrite_stashes_to_text(recipe& caller) {
+  vector<instruction> new_instructions;
+  for (int i = 0; i < SIZE(caller.steps); ++i) {
+    instruction& inst = caller.steps.at(i);
+    if (inst.name == "stash") {
+      for (int j = 0; j < SIZE(inst.ingredients); ++j) {
+        if (is_literal(inst.ingredients.at(j))) continue;
+        if (is_mu_string(inst.ingredients.at(j))) continue;
+        instruction def;
+        def.name = "to-text-line";
+        def.ingredients.push_back(inst.ingredients.at(j));
+        ostringstream ingredient_name;
+        ingredient_name << "stash_" << i << '_' << j << ":address:shared:array:character";
+        def.products.push_back(reagent(ingredient_name.str()));
+        trace(9993, "transform") << to_string(def) << end();
+        new_instructions.push_back(def);
+        inst.ingredients.at(j).clear();  // reclaim old memory
+        inst.ingredients.at(j) = reagent(ingredient_name.str());
+      }
+    }
+    trace(9993, "transform") << to_string(inst) << end();
+    new_instructions.push_back(inst);
+  }
+  caller.steps.swap(new_instructions);
+}