From 8c93158dd558a3533094c493a2c33cc8c4021b2a Mon Sep 17 00:00:00 2001 From: Alex Shinn <ashinn@users.noreply.github.com> Date: Sun, 30 Oct 2011 23:06:40 +0900 Subject: [PATCH] simpler sexp_strip_synclos that just doesn't strip if a cycle is detected --- eval.c | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-) diff --git a/eval.c b/eval.c index 5621b10a..f0173a89 100644 --- a/eval.c +++ b/eval.c @@ -473,39 +473,22 @@ sexp sexp_syntactic_closure_expr_op (sexp ctx sexp_api_params(self, n), sexp x) } sexp sexp_strip_synclos (sexp ctx sexp_api_params(self, n), sexp x) { - sexp ls1, ls2, ls3; - sexp_gc_var2(res, tmp); - sexp_gc_preserve2(ctx, res, tmp); + sexp_gc_var3(res, kar, kdr); + sexp_gc_preserve3(ctx, res, kar, kdr); loop: if (sexp_synclop(x)) { x = sexp_synclo_expr(x); goto loop; - } else if (sexp_pairp(x)) { - tmp = sexp_strip_synclos(ctx sexp_api_pass(self, n), sexp_car(x)); - ls3 = res = sexp_cons(ctx, tmp, SEXP_NULL); - for (ls1=sexp_cdr(x), ls2=x; - sexp_pairp(ls1) && sexp_pairp(sexp_cdr(ls1)) && ls1 != ls2; - ls1=sexp_cddr(ls1), ls2=sexp_cdr(ls2)) { - tmp = sexp_strip_synclos(ctx sexp_api_pass(self, n), sexp_car(ls1)); - sexp_cdr(ls3) = sexp_cons(ctx, tmp, SEXP_NULL); - ls3 = sexp_cdr(ls3); - tmp = sexp_strip_synclos(ctx sexp_api_pass(self, n), sexp_cadr(ls1)); - sexp_cdr(ls3) = sexp_cons(ctx, tmp, SEXP_NULL); - ls3 = sexp_cdr(ls3); - } - if (sexp_pairp(ls1)) { - tmp = (ls1 == ls2) ? sexp_car(ls1) : sexp_strip_synclos(ctx sexp_api_pass(self, n), sexp_car(ls1)); - sexp_cdr(ls3) = sexp_cons(ctx, tmp, SEXP_NULL); - ls3 = sexp_cdr(ls3); - ls1 = sexp_cdr(ls1); - } - sexp_cdr(ls3) = (ls1 == ls2) ? ls1 : sexp_strip_synclos(ctx sexp_api_pass(self, n), ls1); + } else if (sexp_pairp(x) && sexp_truep(sexp_length(ctx, x))) { + kar = sexp_strip_synclos(ctx sexp_api_pass(self, n), sexp_car(x)); + kdr = sexp_strip_synclos(ctx sexp_api_pass(self, n), sexp_cdr(x)); + res = sexp_cons(ctx, kar, kdr); sexp_pair_source(res) = sexp_pair_source(x); sexp_immutablep(res) = 1; } else { res = x; } - sexp_gc_release2(ctx); + sexp_gc_release3(ctx); return res; }