summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2014-11-17 17:05:14 +0200
committerArnold D. Robbins <arnold@skeeve.com>2014-11-17 17:05:14 +0200
commit624caa19ebb5b5a19046f0b0deb96b2e6c093685 (patch)
tree81c57102dd0e7c42aa4b5f4e9b53ef9c9621c9bd
parent41da6a35e2cca4ec3c6b7c61e204e51484ecd7eb (diff)
downloadgawk-624caa19ebb5b5a19046f0b0deb96b2e6c093685.tar.gz
Add runtime check to run old code. Easier to debug/test.
-rw-r--r--awk.h2
-rw-r--r--interpret.h47
-rw-r--r--main.c5
3 files changed, 37 insertions, 17 deletions
diff --git a/awk.h b/awk.h
index 9b72a53c..e788a5a8 100644
--- a/awk.h
+++ b/awk.h
@@ -1056,6 +1056,8 @@ extern bool field0_valid;
extern int do_flags;
+extern bool do_old_mem; /* XXX temporary */
+
extern SRCFILE *srcfiles; /* source files */
enum do_flag_values {
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;
diff --git a/main.c b/main.c
index ddda1d66..a2bdf1bc 100644
--- a/main.c
+++ b/main.c
@@ -170,6 +170,8 @@ GETGROUPS_T *groupset; /* current group set */
int ngroups; /* size of said set */
#endif
+bool do_old_mem = false; /* XXX temporary */
+
void (*lintfunc)(const char *mesg, ...) = r_warning;
/* Sorted by long option name! */
@@ -231,6 +233,9 @@ main(int argc, char **argv)
#endif /* HAVE_MTRACE */
#endif /* HAVE_MCHECK_H */
+ if (getenv("OLDMEM") != NULL)
+ do_old_mem = true; /* XXX temporary */
+
myname = gawk_name(argv[0]);
os_arg_fixup(&argc, &argv); /* emulate redirection, expand wildcards */