summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-11-17 17:25:05 +0200
committerArnold D. Robbins <arnold@skeeve.com>2014-11-17 17:25:05 +0200
commitac7bcb4c8cdc07f974205709616fda91a447c0f1 (patch)
tree9334659245b9500e8087234650e0591760adf859
parent624caa19ebb5b5a19046f0b0deb96b2e6c093685 (diff)
downloadgawk-ac7bcb4c8cdc07f974205709616fda91a447c0f1.tar.gz
Add unfield code in several spots.
-rw-r--r--interpret.h49
1 files changed, 33 insertions, 16 deletions
diff --git a/interpret.h b/interpret.h
index 9910ea72..2901f60e 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;