From 793c8c17c163a48c993e1adcb3defd4762e22a26 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 20 Nov 2015 06:58:32 -0800 Subject: Combat spurious retention in few more functions. * lib.c (sub_list, replace_list): Use original list variable instead of copying it to iter. Use gc_hint on list so that the old value doesn't hang around on the stack, while a register copy marches through the list. --- lib.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'lib.c') diff --git a/lib.c b/lib.c index d658f356..30636c66 100644 --- a/lib.c +++ b/lib.c @@ -1057,25 +1057,27 @@ val sub_list(val list, val from, val to) else if (!null_or_missing_p(to) && lt(to, zero)) to = plus(to, if3(len, len, len = length(list))); + gc_hint(list); + if (to && from && gt(from, to)) { return nil; } else if (!to || (len && ge(to, len))) { - val iter, i; + val i; - for (i = zero, iter = list; iter; iter = cdr(iter), i = plus(i, one)) { + for (i = zero; list; list = cdr(list), i = plus(i, one)) { if (from && ge(i, from)) break; } - return iter; + return list; } else { - val iter, i; + val i; list_collect_decl (out, ptail); - for (i = zero, iter = list; iter; iter = cdr(iter), i = plus(i, one)) { + for (i = zero; list; list = cdr(list), i = plus(i, one)) { if (ge(i, to)) break; if (from && ge(i, from)) - ptail = list_collect(ptail, car(iter)); + ptail = list_collect(ptail, car(list)); } return out; @@ -1155,17 +1157,19 @@ val replace_list(val list, val items, val from, val to) if (to && lt(to, zero)) to = plus(to, len ? len : (len = length(list))); + gc_hint(list); + if (!to || (len && ge(to, len))) { if (from && zerop(from)) { return (listp(items)) ? items : list_vec(items); } else { - val iter, i; + val i; list_collect_decl (out, ptail); - for (i = zero, iter = list; iter; iter = cdr(iter), i = plus(i, one)) { + for (i = zero; list; list = cdr(list), i = plus(i, one)) { if (from && ge(i, from)) break; - ptail = list_collect(ptail, car(iter)); + ptail = list_collect(ptail, car(list)); } ptail = list_collect_nconc(ptail, if3(listp(items), @@ -1173,19 +1177,19 @@ val replace_list(val list, val items, val from, val to) return out; } } else { - val iter, i; + val i; list_collect_decl (out, ptail); - for (i = zero, iter = list; iter; iter = cdr(iter), i = plus(i, one)) { + for (i = zero; list; list = cdr(list), i = plus(i, one)) { if (ge(i, to)) break; if (from && lt(i, from)) - ptail = list_collect(ptail, car(iter)); + ptail = list_collect(ptail, car(list)); } ptail = list_collect_nconc(ptail, append2(if3(listp(items), items, list_vec(items)), - iter)); + list)); return out; } } -- cgit v1.2.3