diff options
author | Kartik Agaram <vc@akkartik.com> | 2018-06-15 22:12:03 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2018-06-15 22:12:03 -0700 |
commit | 0edd9b9fc60440213e4df926ea511419ee291f1e (patch) | |
tree | 84b22f7afdeb9110ad7105c5fc070dacff178502 /023boolean.cc | |
parent | 3f34ac9369978b396d00a4fd02c9fb06b8eea621 (diff) | |
download | mu-0edd9b9fc60440213e4df926ea511419ee291f1e.tar.gz |
4257 - abortive attempt at safe fat pointers
I've been working on this slowly over several weeks, but it's too hard to support 0 as the null value for addresses. I constantly have to add exceptions for scalar value corresponding to an address type (now occupying 2 locations). The final straw is the test for 'reload': x:num <- reload text 'reload' returns an address. But there's no way to know that for arbitrary instructions. New plan: let's put this off for a bit and first create support for literals. Then use 'null' instead of '0' for addresses everywhere. Then it'll be easy to just change what 'null' means.
Diffstat (limited to '023boolean.cc')
-rw-r--r-- | 023boolean.cc | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/023boolean.cc b/023boolean.cc index 3d51fd7a..976cbff9 100644 --- a/023boolean.cc +++ b/023boolean.cc @@ -26,7 +26,7 @@ case AND: { case AND: { bool result = true; for (int i = 0; i < SIZE(ingredients); ++i) - result = result && ingredients.at(i).at(0); + result = result && scalar_ingredient(ingredients, i); products.resize(1); products.at(0).push_back(result); break; @@ -84,7 +84,7 @@ case OR: { case OR: { bool result = false; for (int i = 0; i < SIZE(ingredients); ++i) - result = result || ingredients.at(i).at(0); + result = result || scalar_ingredient(ingredients, i); products.resize(1); products.at(0).push_back(result); break; @@ -127,8 +127,8 @@ case NOT: { break; } for (int i = 0; i < SIZE(inst.ingredients); ++i) { - if (!is_mu_scalar(inst.ingredients.at(i))) { - raise << maybe(get(Recipe, r).name) << "'not' requires boolean ingredients, but got '" << inst.ingredients.at(i).original_string << "'\n" << end(); + if (!is_mu_scalar(inst.ingredients.at(i)) && !is_mu_address(inst.ingredients.at(i))) { + raise << maybe(get(Recipe, r).name) << "'not' requires ingredients that can be interpreted as boolean, but got '" << inst.ingredients.at(i).original_string << "'\n" << end(); goto finish_checking_instruction; } } @@ -145,7 +145,7 @@ case NOT: { case NOT: { products.resize(SIZE(ingredients)); for (int i = 0; i < SIZE(ingredients); ++i) { - products.at(i).push_back(!ingredients.at(i).at(0)); + products.at(i).push_back(!scalar_ingredient(ingredients, i)); } break; } |