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.
This commit is contained in:
parent
5579176f4a
commit
10afa189d5
1 changed files with 2 additions and 1 deletions
|
@ -1127,8 +1127,9 @@ Cell *assign(Node **a, int n) /* a[0] = a[1], a[0] += a[1], etc. */
|
||||||
if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */
|
if (x == y && !(x->tval & (FLD|REC))) /* self-assignment: */
|
||||||
goto Free; /* leave alone unless it's a field */
|
goto Free; /* leave alone unless it's a field */
|
||||||
if ((y->tval & (STR|NUM)) == (STR|NUM)) {
|
if ((y->tval & (STR|NUM)) == (STR|NUM)) {
|
||||||
|
yf = getfval(y);
|
||||||
setsval(x, getsval(y));
|
setsval(x, getsval(y));
|
||||||
x->fval = getfval(y);
|
x->fval = yf;
|
||||||
x->tval |= NUM;
|
x->tval |= NUM;
|
||||||
}
|
}
|
||||||
else if (isstr(y))
|
else if (isstr(y))
|
||||||
|
|
Loading…
Reference in a new issue