ref: 10afa189d5ee84e1935ead905b3bbe38060a92e8
parent: 5579176f4a885bb83119bb49598c357ce8db2343
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jun 25 16:03:41 EDT 2022
awk: correct incoherent cell in assignment (thanks smj, mpinjr) In run.c::assign(), assigning to $0 from $F, a field, where F >= 2, produces an incoherent cell. The assignment occurs in two steps, first the string value and then the float. When the string value is assigned to $0, setsval invalidates the fields. If FS hasn't changed, after getfval rebuilds the fields, NF = 1 and F >= 2, therefore $F is definitely uninitialized. The result is a float val of 0.0, producing a boolean false in the pattern expression. Coercing a string comparison gives the expected result because the incoherent cell has the correct string value, which is not empty and evaluates to true.
--- a/sys/src/cmd/awk/run.c
+++ b/sys/src/cmd/awk/run.c
@@ -1127,8 +1127,9 @@
if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */
goto Free; /* leave alone unless it's a field */
if ((y->tval & (STR|NUM)) == (STR|NUM)) {
+ yf = getfval(y);
setsval(x, getsval(y));
- x->fval = getfval(y);
+ x->fval = yf;
x->tval |= NUM;
}
else if (isstr(y))