diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2014-11-16 19:54:57 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2014-11-16 19:54:57 +0200 |
commit | 31c6051694d3152e50eb037e20c4734c7321eac6 (patch) | |
tree | a23c8200da6761a90b63a7c6b79961c72162f084 /interpret.h | |
parent | 82e7082d1653a2143fc29d405fe40329188828b5 (diff) | |
download | egawk-31c6051694d3152e50eb037e20c4734c7321eac6.tar.gz egawk-31c6051694d3152e50eb037e20c4734c7321eac6.tar.bz2 egawk-31c6051694d3152e50eb037e20c4734c7321eac6.zip |
Add field reference changes. Currently breaks sortglos test.
Diffstat (limited to 'interpret.h')
-rw-r--r-- | interpret.h | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/interpret.h b/interpret.h index 74f56c73..83ccbfc5 100644 --- a/interpret.h +++ b/interpret.h @@ -340,7 +340,12 @@ uninitialized_scalar: lhs = r_get_field(t1, (Func_ptr *) 0, true); decr_sp(); DEREF(t1); - r = dupnode(*lhs); /* can't use UPREF here */ + /* only for $0, up ref count */ + if (*lhs == fields_arr[0]) { + r = *lhs; + UPREF(r); + } else + r = dupnode(*lhs); PUSH(r); break; @@ -649,11 +654,22 @@ mod: lhs = get_lhs(pc->memory, false); unref(*lhs); r = pc->initval; /* constant initializer */ - if (r == NULL) - *lhs = POP_SCALAR(); - else { + if (r != NULL) { UPREF(r); *lhs = r; + } else { + r = POP_SCALAR(); + + /* if was a field, turn it into a var */ + if ((r->flags & FIELD) == 0) { + *lhs = r; + } else if (r->valref == 1) { + r->flags &= ~FIELD; + *lhs = r; + } else { + *lhs = dupnode(r); + DEREF(r); + } } break; |