about summary refs log tree commit diff stats
path: root/028call_reply.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-04-27 15:23:44 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-04-27 15:23:44 -0700
commite765f9e74abc81b738e8670c6d77d363894107b1 (patch)
tree3decf1582c59e590e8d71f12963e06f487dd7d76 /028call_reply.cc
parentb61557347aac31e6ba98dedbc16e49a69ff30912 (diff)
downloadmu-e765f9e74abc81b738e8670c6d77d363894107b1.tar.gz
2873 - fix a bug in converting conditional returns
This was an interaction between two transforms. The first turned:

  return-if ...

into:

  jump-unless ..., 1:offset  # skip next instruction
  return ...

The second added an unconditional return at the end of the recipe if it
didn't already exist (so that functions always end with a return).
However, it was getting confused by the return instructions generated
above, which look unconditional but sometimes get skipped.

To fix this, conditional returns are now transformed into this:

  {
    break-unless ...
    return ...
  }

Since the final instruction is now no longer a reply (but rather the '}'
label), the second transform triggers and adds the unconditional return
after it.

This commit removes the final place marked 'BUG:' in the codebase
yesterday (see commit 2870).
Diffstat (limited to '028call_reply.cc')
-rw-r--r--028call_reply.cc70
1 files changed, 0 insertions, 70 deletions
diff --git a/028call_reply.cc b/028call_reply.cc
index df5fa557..09360d25 100644
--- a/028call_reply.cc
+++ b/028call_reply.cc
@@ -158,73 +158,3 @@ string to_string(const vector<double>& in) {
   out << "]";
   return out.str();
 }
-
-//: Conditional reply.
-
-:(scenario reply_if)
-def main [
-  1:number <- test1
-]
-def test1 [
-  return-if 0, 34
-  return 35
-]
-+mem: storing 35 in location 1
-
-:(scenario reply_if_2)
-def main [
-  1:number <- test1
-]
-def test1 [
-  return-if 1, 34
-  return 35
-]
-+mem: storing 34 in location 1
-
-:(before "End Rewrite Instruction(curr, recipe result)")
-// rewrite `reply-if a, b, c, ...` to
-//   ```
-//   jump-unless a, 1:offset
-//   reply b, c, ...
-//   ```
-if (curr.name == "reply-if" || curr.name == "return-if") {
-  if (curr.products.empty()) {
-    curr.operation = get(Recipe_ordinal, "jump-unless");
-    curr.name = "jump-unless";
-    vector<reagent> results;
-    copy(++curr.ingredients.begin(), curr.ingredients.end(), inserter(results, results.end()));
-    curr.ingredients.resize(1);
-    curr.ingredients.push_back(reagent("1:offset"));
-    result.steps.push_back(curr);
-    curr.clear();
-    curr.operation = get(Recipe_ordinal, "reply");
-    curr.name = "reply";
-    curr.ingredients.swap(results);
-  }
-  else {
-    raise << "'" << curr.name << "' never yields any products\n" << end();
-  }
-}
-// rewrite `reply-unless a, b, c, ...` to
-//   ```
-//   jump-if a, 1:offset
-//   reply b, c, ...
-//   ```
-if (curr.name == "reply-unless" || curr.name == "return-unless") {
-  if (curr.products.empty()) {
-    curr.operation = get(Recipe_ordinal, "jump-if");
-    curr.name = "jump-if";
-    vector<reagent> results;
-    copy(++curr.ingredients.begin(), curr.ingredients.end(), inserter(results, results.end()));
-    curr.ingredients.resize(1);
-    curr.ingredients.push_back(reagent("1:offset"));
-    result.steps.push_back(curr);
-    curr.clear();
-    curr.operation = get(Recipe_ordinal, "reply");
-    curr.name = "reply";
-    curr.ingredients.swap(results);
-  }
-  else {
-    raise << "'" << curr.name << "' never yields any products\n" << end();
-  }
-}