awk: fix an incorrect casting to string (bug 725). -44 bytes.
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 30 Nov 2009 00:15:04 +0000 (01:15 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 30 Nov 2009 00:15:04 +0000 (01:15 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/awk.c
testsuite/awk.tests

index e987bc8681c82bf9efd33646827072641516d82d..bc8b0dad13672ebb0350de0559e31203184dde71 100644 (file)
@@ -2424,17 +2424,19 @@ static var *evaluate(node *op, var *res)
                        X.re = as_regex(op1, &sreg);
                        R.i = regexec(X.re, L.s, 0, NULL, 0);
                        if (X.re == &sreg) regfree(X.re);
-                       setvar_i(res, (R.i == 0 ? 1 : 0) ^ (opn == '!' ? 1 : 0));
+                       setvar_i(res, (R.i == 0) ^ (opn == '!'));
                        break;
 
                case XC( OC_MOVE ):
                        /* if source is a temporary string, jusk relink it to dest */
-                       if (R.v == v1+1 && R.v->string) {
-                               res = setvar_p(L.v, R.v->string);
-                               R.v->string = NULL;
-                       } else {
+//Disabled: if R.v is numeric but happens to have cached R.v->string,
+//then L.v ends up being a string, which is wrong
+//                     if (R.v == v1+1 && R.v->string) {
+//                             res = setvar_p(L.v, R.v->string);
+//                             R.v->string = NULL;
+//                     } else {
                                res = copyvar(L.v, R.v);
-                       }
+//                     }
                        break;
 
                case XC( OC_TERNARY ):
index 2c7642ce0b79097ac3f27e07473d20c149d4a985..7910c8875e0cd9223d1ad378a7c06703dabab176 100755 (executable)
@@ -47,4 +47,21 @@ testing "awk NF in BEGIN" \
        ":0::::\n" \
        "" ""
 
+prg='
+function b(tmp) {
+       tmp = 0;
+       print "" tmp; #this line causes the bug
+       return tmp;
+}
+function c(tmpc) {
+       tmpc = b(); return tmpc;
+}
+BEGIN {
+       print (c() ? "string" : "number");
+}'
+testing "awk string cast (bug 725)" \
+       "awk '$prg'" \
+       "0\nnumber\n" \
+       "" ""
+
 exit $FAILCOUNT