diff --git a/interpret.h b/interpret.h index 9910ea7..2901f60 100644 --- a/interpret.h +++ b/interpret.h @@ -23,7 +23,19 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ - +#define UNFIELD(l, r) \ +{ \ + /* if was a field, turn it into a var */ \ + if ((r->flags & FIELD) == 0) { \ + l = r; \ + } else if (r->valref == 1) { \ + r->flags &= ~FIELD; \ + l = r; \ + } else { \ + l = dupnode(r); \ + DEREF(r); \ + } \ +} int r_interpret(INSTRUCTION *code) { @@ -640,7 +652,12 @@ mod: } unref(*lhs); - *lhs = POP_SCALAR(); + if (do_old_mem) { + *lhs = POP_SCALAR(); + } else { + r = POP_SCALAR(); + UNFIELD(*lhs, r); + } /* execute post-assignment routine if any */ if (t1->astore != NULL) @@ -671,17 +688,7 @@ mod: *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); - } + UNFIELD(*lhs, r); } } break; @@ -698,7 +705,12 @@ mod: decr_sp(); DEREF(t1); unref(*lhs); - *lhs = POP_SCALAR(); + if (do_old_mem) { + *lhs = POP_SCALAR(); + } else { + r = POP_SCALAR(); + UNFIELD(*lhs, r); + } assert(assign != NULL); assign(); } @@ -752,8 +764,13 @@ mod: lhs = POP_ADDRESS(); r = TOP_SCALAR(); unref(*lhs); - *lhs = r; - UPREF(r); + if (do_old_mem) { + *lhs = r; + UPREF(r); + } else { + UPREF(r); + UNFIELD(*lhs, r); + } REPLACE(r); break;