From 1284774d60ebce68dec6fcaf44a33e928c4c1f82 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 30 Nov 2009 01:15:04 +0100 Subject: [PATCH] awk: fix an incorrect casting to string (bug 725). -44 bytes. Signed-off-by: Denys Vlasenko --- editors/awk.c | 14 ++++++++------ testsuite/awk.tests | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/editors/awk.c b/editors/awk.c index e987bc868..bc8b0dad1 100644 --- a/editors/awk.c +++ b/editors/awk.c @@ -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 ): diff --git a/testsuite/awk.tests b/testsuite/awk.tests index 2c7642ce0..7910c8875 100755 --- a/testsuite/awk.tests +++ b/testsuite/awk.tests @@ -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