diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2013-06-04 13:12:59 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-02-15 18:38:24 +0100 |
commit | 5e9281841257716820079c2758ae573f2e18c851 (patch) | |
tree | 6ea0647ca8e8952f537eaeaea8232d05669b3864 /src/expressions.cpp | |
parent | 707acef9b3b83a1ecf945a40e14d83cce947b766 (diff) | |
download | sciteco-5e9281841257716820079c2758ae573f2e18c851.tar.gz |
catch division by zero errors
* C++ runtime does not automatically throw an exception
Diffstat (limited to 'src/expressions.cpp')
-rw-r--r-- | src/expressions.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/expressions.cpp b/src/expressions.cpp index 8d15d73..6e9846a 100644 --- a/src/expressions.cpp +++ b/src/expressions.cpp @@ -23,6 +23,7 @@ #include "sciteco.h" #include "undo.h" +#include "parser.h" // State::Error #include "expressions.h" Expressions expressions; @@ -132,14 +133,34 @@ Expressions::calc(void) tecoInt vleft = pop_num(); switch (op) { - case OP_POW: for (result = 1; vright--; result *= vleft); break; - case OP_MUL: result = vleft * vright; break; - case OP_DIV: result = vleft / vright; break; - case OP_MOD: result = vleft % vright; break; - case OP_ADD: result = vleft + vright; break; - case OP_SUB: result = vleft - vright; break; - case OP_AND: result = vleft & vright; break; - case OP_OR: result = vleft | vright; break; + case OP_POW: + for (result = 1; vright--; result *= vleft); + break; + case OP_MUL: + result = vleft * vright; + break; + case OP_DIV: + if (!vright) + throw State::Error("Division by zero"); + result = vleft / vright; + break; + case OP_MOD: + if (!vright) + throw State::Error("Remainder of division by zero"); + result = vleft % vright; + break; + case OP_ADD: + result = vleft + vright; + break; + case OP_SUB: + result = vleft - vright; + break; + case OP_AND: + result = vleft & vright; + break; + case OP_OR: + result = vleft | vright; + break; default: /* shouldn't happen */ g_assert(false); |