aboutsummaryrefslogtreecommitdiffstats
path: root/interpret.h
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-11-11 23:12:37 +0200
committerArnold D. Robbins <arnold@skeeve.com>2014-11-11 23:12:37 +0200
commitf23d62da85fad992feeddd630ce07f0214df7029 (patch)
tree22fabc71a4c1fd1fdc69346f41b4e71e87f4ff6d /interpret.h
parent5cd73ffdcdbd5de2d03b9db781ca26c5a5af516d (diff)
parentb4cf3cc470eb1200ec90fcc7ad5b2d069059cf7e (diff)
downloadegawk-f23d62da85fad992feeddd630ce07f0214df7029.tar.gz
egawk-f23d62da85fad992feeddd630ce07f0214df7029.tar.bz2
egawk-f23d62da85fad992feeddd630ce07f0214df7029.zip
Merge branch 'gawk-4.1-stable'
Diffstat (limited to 'interpret.h')
-rw-r--r--interpret.h24
1 files changed, 20 insertions, 4 deletions
diff --git a/interpret.h b/interpret.h
index 23ce0c1a..0a9d1157 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;