awk: fix an incorrect casting to string (bug 725). -44 bytes.
No binary (build failed)
—
(log yok)
| @@ -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 ): | |
| @@ -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 | |