summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2007-06-15 10:02:24 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2007-06-15 10:02:24 +0000
commitc2c50bd0a0778217d18ebe7ed36bbb88985a9736 (patch)
tree196fbe95de2b8769c7e01140048462713909f3e7
parent1e77d338fbb95855760b65e06ad69913f7571212 (diff)
downloadzsh-c2c50bd0a0778217d18ebe7ed36bbb88985a9736.tar.gz
zsh-c2c50bd0a0778217d18ebe7ed36bbb88985a9736.zip
23553: bit missed out
-rw-r--r--ChangeLog3
-rw-r--r--Doc/Zsh/arith.yo2
-rw-r--r--Src/math.c13
3 files changed, 15 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index a9fd645f2..d6d0ec43a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
2007-06-15 Peter Stephenson <pws@csr.com>
- * 23553: Doc/Zsh/arith.yo, Doc/Zsh/builtins.yo: was missed out.
+ * 23553: Doc/Zsh/arith.yo, Doc/Zsh/builtins.yo, Src/math.c:
+ should have been committed but wasn't.
2007-06-14 Peter Stephenson <pws@csr.com>
diff --git a/Doc/Zsh/arith.yo b/Doc/Zsh/arith.yo
index f13cad987..98e83c1ae 100644
--- a/Doc/Zsh/arith.yo
+++ b/Doc/Zsh/arith.yo
@@ -22,7 +22,7 @@ matching `tt(RPAR()RPAR())' are treated as a quoted expression and
arithmetic expansion performed as for an argument of tt(let). More
precisely, `tt(LPAR()LPAR())var(...)tt(RPAR()RPAR())' is equivalent to
`tt(let ")var(...)tt(")'. The return status is 0 if the arithmetic value
-of the expression is non-zero, and 1 otherwise.
+of the expression is non-zero, 1 if it is zero, and 2 if an error occurred.
For example, the following statement
diff --git a/Src/math.c b/Src/math.c
index 66d57fd53..e1cde5f03 100644
--- a/Src/math.c
+++ b/Src/math.c
@@ -1061,8 +1061,19 @@ mathevall(char *s, int prek, char **ep)
"BUG: math: wallabies roaming too freely in outback");
if (errflag) {
+ /*
+ * This used to set the return value to errflag.
+ * I don't understand how that could be useful; the
+ * caller doesn't know that's what's happened and
+ * may not get a value at all.
+ * Worse, we reset errflag in execarith() and setting
+ * this explicitly non-zero means a (( ... )) returns
+ * status 0 if there's an error. That surely can't
+ * be right. execarith() now detects an error and returns
+ * status 2.
+ */
ret.type = MN_INTEGER;
- ret.u.l = errflag;
+ ret.u.l = 0;
} else {
if (stack[0].val.type == MN_UNSET)
ret = getnparam(stack[0].lval);