From 6b6e3f42627f360cbbad2287968b2a209ab43593 Mon Sep 17 00:00:00 2001 From: Nicolas Williams Date: Sat, 12 Jul 2014 18:37:23 -0500 Subject: [PATCH] Library defs don't bind to each other; fix #479 --- compile.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/compile.c b/compile.c index 64ff41d..dc0c009 100644 --- a/compile.c +++ b/compile.c @@ -290,16 +290,30 @@ block block_bind(block binder, block body, int bindflags) { block block_bind_referenced(block binder, block body, int bindflags) { assert(block_has_only_binders(binder, bindflags)); bindflags |= OP_HAS_BINDING; - block refd = gen_noop(); + + // Repeatedly bind until there's no remaining references to any of the + // binders in binder. + block unrefd = gen_noop(); + int unref_count = 0, last = -1; +loop: for (inst* curr; (curr = block_take(&binder));) { block b = inst_block(curr); if (block_bind_subblock(b, body, bindflags)) { - refd = BLOCK(refd, b); + body = BLOCK(b, body); } else { - block_free(b); + unrefd = BLOCK(unrefd, b); + unref_count++; } } - return block_join(refd, body); + if (unref_count == 0 || unref_count == last) { + block_free(unrefd); + return body; + } + last = unref_count; + unref_count = 0; + binder = unrefd; + unrefd = gen_noop(); + goto loop; } block gen_function(const char* name, block formals, block body) { -- 2.40.0