From b4cf3cc470eb1200ec90fcc7ad5b2d069059cf7e Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Tue, 11 Nov 2014 23:12:01 +0200 Subject: Fix memory growth problem. --- interpret.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'interpret.h') diff --git a/interpret.h b/interpret.h index 28804330..593f11a6 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; -- cgit v1.2.3 From 8b863f8852067b0638e09dc7c82355b96381dc12 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sat, 15 Nov 2014 18:35:45 +0200 Subject: Remove MBS_SUPPORT ifdefs. --- interpret.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'interpret.h') diff --git a/interpret.h b/interpret.h index 593f11a6..83ccbfc5 100644 --- a/interpret.h +++ b/interpret.h @@ -711,7 +711,6 @@ mod: t1->stptr[nlen] = '\0'; t1->flags &= ~(NUMCUR|NUMBER|NUMINT); -#if MBS_SUPPORT if ((t1->flags & WSTRCUR) != 0 && (t2->flags & WSTRCUR) != 0) { size_t wlen = t1->wstlen + t2->wstlen; @@ -723,7 +722,6 @@ mod: t1->flags |= WSTRCUR; } else free_wstr(*lhs); -#endif } else { size_t nlen = t1->stlen + t2->stlen; char *p; -- cgit v1.2.3 From ee77f64d563188b6a5d761fd9342df00431e99d8 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sun, 16 Nov 2014 19:43:18 +0200 Subject: Revert field reference changes of 2014-11-11. --- interpret.h | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) (limited to 'interpret.h') diff --git a/interpret.h b/interpret.h index 83ccbfc5..74f56c73 100644 --- a/interpret.h +++ b/interpret.h @@ -340,12 +340,7 @@ 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 - r = dupnode(*lhs); + r = dupnode(*lhs); /* can't use UPREF here */ PUSH(r); break; @@ -654,22 +649,11 @@ mod: lhs = get_lhs(pc->memory, false); unref(*lhs); r = pc->initval; /* constant initializer */ - if (r != NULL) { + if (r == NULL) + *lhs = POP_SCALAR(); + else { 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; -- cgit v1.2.3 From 31c6051694d3152e50eb037e20c4734c7321eac6 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Sun, 16 Nov 2014 19:54:57 +0200 Subject: Add field reference changes. Currently breaks sortglos test. --- interpret.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'interpret.h') diff --git a/interpret.h b/interpret.h index 74f56c73..83ccbfc5 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; -- cgit v1.2.3 From 624caa19ebb5b5a19046f0b0deb96b2e6c093685 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Mon, 17 Nov 2014 17:05:14 +0200 Subject: Add runtime check to run old code. Easier to debug/test. --- interpret.h | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) (limited to 'interpret.h') 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; -- cgit v1.2.3 From ac7bcb4c8cdc07f974205709616fda91a447c0f1 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Mon, 17 Nov 2014 17:25:05 +0200 Subject: Add unfield code in several spots. --- interpret.h | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) (limited to 'interpret.h') 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; -- cgit v1.2.3 From a398513aadb70b98e6e0ad04e5821ea0b6eca00c Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 21 Nov 2014 10:53:34 +0200 Subject: Remove OLDMEM checks, preparatory to merging. --- interpret.h | 58 ++++++++++++++++------------------------------------------ 1 file changed, 16 insertions(+), 42 deletions(-) (limited to 'interpret.h') diff --git a/interpret.h b/interpret.h index 2901f60e..b16dc126 100644 --- a/interpret.h +++ b/interpret.h @@ -352,16 +352,12 @@ uninitialized_scalar: lhs = r_get_field(t1, (Func_ptr *) 0, true); decr_sp(); DEREF(t1); - if (do_old_mem) { + /* only for $0, up ref count */ + if (*lhs == fields_arr[0]) { + r = *lhs; + UPREF(r); + } else 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; @@ -652,12 +648,8 @@ mod: } unref(*lhs); - if (do_old_mem) { - *lhs = POP_SCALAR(); - } else { - r = POP_SCALAR(); - UNFIELD(*lhs, r); - } + r = POP_SCALAR(); + UNFIELD(*lhs, r); /* execute post-assignment routine if any */ if (t1->astore != NULL) @@ -675,21 +667,12 @@ mod: lhs = get_lhs(pc->memory, false); unref(*lhs); r = pc->initval; /* constant initializer */ - if (do_old_mem) { - if (r == NULL) - *lhs = POP_SCALAR(); - else { - UPREF(r); - *lhs = r; - } + if (r != NULL) { + UPREF(r); + *lhs = r; } else { - if (r != NULL) { - UPREF(r); - *lhs = r; - } else { - r = POP_SCALAR(); - UNFIELD(*lhs, r); - } + r = POP_SCALAR(); + UNFIELD(*lhs, r); } break; @@ -705,12 +688,8 @@ mod: decr_sp(); DEREF(t1); unref(*lhs); - if (do_old_mem) { - *lhs = POP_SCALAR(); - } else { - r = POP_SCALAR(); - UNFIELD(*lhs, r); - } + r = POP_SCALAR(); + UNFIELD(*lhs, r); assert(assign != NULL); assign(); } @@ -764,13 +743,8 @@ mod: lhs = POP_ADDRESS(); r = TOP_SCALAR(); unref(*lhs); - if (do_old_mem) { - *lhs = r; - UPREF(r); - } else { - UPREF(r); - UNFIELD(*lhs, r); - } + UPREF(r); + UNFIELD(*lhs, r); REPLACE(r); break; -- cgit v1.2.3