about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-03-13 23:29:50 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-03-13 23:29:50 -0700
commit8b095f802129f8c328a3a4dc3de4443890d34d59 (patch)
tree43aa08d9e25bab2879c0ecc1c8c037f8d4ec99cc
parentf466a648b7a424d96c14bd671f9915f274397e04 (diff)
downloadmu-8b095f802129f8c328a3a4dc3de4443890d34d59.tar.gz
2777 - pass literal strings into functions
-rw-r--r--053rewrite_stash.cc8
-rw-r--r--064rewrite_literal_string.cc53
-rw-r--r--edit/010-errors.mu19
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                                              .
+    .┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┊━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━.
     .                                                  ┊                                                 .
   ]
 ]