diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2014-11-17 17:05:14 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2014-11-17 17:05:14 +0200 |
commit | 624caa19ebb5b5a19046f0b0deb96b2e6c093685 (patch) | |
tree | 81c57102dd0e7c42aa4b5f4e9b53ef9c9621c9bd /interpret.h | |
parent | 41da6a35e2cca4ec3c6b7c61e204e51484ecd7eb (diff) | |
download | egawk-624caa19ebb5b5a19046f0b0deb96b2e6c093685.tar.gz egawk-624caa19ebb5b5a19046f0b0deb96b2e6c093685.tar.bz2 egawk-624caa19ebb5b5a19046f0b0deb96b2e6c093685.zip |
Add runtime check to run old code. Easier to debug/test.
Diffstat (limited to 'interpret.h')
-rw-r--r-- | interpret.h | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/interpret.h b/interpret.h index 83ccbfc5..9910ea72 100644 --- a/interpret.h +++ b/interpret.h @@ -340,12 +340,16 @@ uninitialized_scalar: lhs = r_get_field(t1, (Func_ptr *) 0, true); decr_sp(); DEREF(t1); - /* only for $0, up ref count */ - if (*lhs == fields_arr[0]) { - r = *lhs; - UPREF(r); - } else + if (do_old_mem) { r = dupnode(*lhs); + } else { + /* only for $0, up ref count */ + if (*lhs == fields_arr[0]) { + r = *lhs; + UPREF(r); + } else + r = dupnode(*lhs); + } PUSH(r); break; @@ -654,21 +658,30 @@ mod: lhs = get_lhs(pc->memory, false); unref(*lhs); r = pc->initval; /* constant initializer */ - 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) { + if (do_old_mem) { + if (r == NULL) + *lhs = POP_SCALAR(); + else { + UPREF(r); *lhs = r; - } else if (r->valref == 1) { - r->flags &= ~FIELD; + } + } else { + if (r != NULL) { + UPREF(r); *lhs = r; } else { - *lhs = dupnode(r); - DEREF(r); + 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; |