Support branch statements break/continue/fallthrough

This commit is contained in:
gingerBill
2023-07-19 14:19:01 +01:00
parent 184563bbe1
commit b2edab193f
2 changed files with 14 additions and 8 deletions
+12 -2
View File
@@ -68,7 +68,7 @@ gb_internal cgProcedure *cg_procedure_create(cgModule *m, Entity *entity, bool i
p->children.allocator = a;
// p->defer_stmts.allocator = a;
// p->blocks.allocator = a;
// p->branch_blocks.allocator = a;
p->branch_blocks.allocator = a;
p->context_stack.allocator = a;
p->scope_stack.allocator = a;
map_init(&p->variable_map);
@@ -128,7 +128,7 @@ gb_internal cgProcedure *cg_procedure_create_dummy(cgModule *m, String const &li
p->children.allocator = a;
// p->defer_stmts.allocator = a;
// p->blocks.allocator = a;
// p->branch_blocks.allocator = a;
p->branch_blocks.allocator = a;
p->scope_stack.allocator = a;
p->context_stack.allocator = a;
map_init(&p->variable_map);
@@ -165,6 +165,16 @@ gb_internal void cg_procedure_begin(cgProcedure *p) {
return;
}
DeclInfo *decl = decl_info_of_entity(p->entity);
if (decl != nullptr) {
for_array(i, decl->labels) {
BlockLabel bl = decl->labels[i];
cgBranchBlocks bb = {bl.label, nullptr, nullptr};
array_add(&p->branch_blocks, bb);
}
}
GB_ASSERT(p->type->kind == Type_Proc);
TypeProc *pt = &p->type->Proc;
if (pt->params == nullptr) {
+2 -6
View File
@@ -1330,14 +1330,10 @@ gb_internal void cg_build_stmt(cgProcedure *p, Ast *node) {
}
}
}
if (block != nullptr) {
cg_emit_defer_stmts(p, cgDeferExit_Branch, block);
}
GB_ASSERT(block != nullptr);
cg_emit_defer_stmts(p, cgDeferExit_Branch, block);
tb_inst_goto(p->func, block);
tb_inst_set_control(p->func, block);
tb_inst_unreachable(p->func);
tb_inst_set_control(p->func, prev_block);
case_end;