diff --git a/compile.c b/compile.c index 03d03c3e..cc5a8d09 100644 --- a/compile.c +++ b/compile.c @@ -399,7 +399,7 @@ block block_drop_unreferenced(block body) { int drop; do { drop = 0; - while((curr = block_take(&body)) && curr->op != TOP) { + while ((curr = block_take(&body)) && curr->op != TOP) { block b = inst_block(curr); if (block_count_refs(b,refd) + block_count_refs(b,body) == 0) { unrefd = BLOCK(unrefd, b); @@ -593,7 +593,11 @@ block gen_definedor(block a, block b) { } int block_has_main(block top) { - return top.first && top.first->op == TOP; + for (inst *c = top.first; c; c = c->next) { + if (c->op == TOP) + return 1; + } + return 0; } int block_is_funcdef(block b) { diff --git a/parser.y b/parser.y index 0117e1a2..72e2b28f 100644 --- a/parser.y +++ b/parser.y @@ -278,10 +278,7 @@ FuncDef FuncDefs { Exp: FuncDef Exp %prec ';' { - if (block_is_funcdef($2)) - $$ = block_bind($1, $2, OP_IS_CALL_PSEUDO); - else - $$ = block_bind($1, BLOCK(gen_op_simple(TOP), $2), OP_IS_CALL_PSEUDO); + $$ = block_bind_referenced($1, $2, OP_IS_CALL_PSEUDO); } | Term "as" '$' IDENT '|' Exp {