diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-05-25 15:37:09 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-05-25 15:37:09 -0400 |
| commit | 145ccdea8ce8aa89448ea9302908b4dbc23d892f (patch) | |
| tree | 8e21d08d2bd4e9df7bda27c4a2ff325e3d389e54 /src | |
| parent | 1063d117e8d609379a50efdb9506a3a118ccca53 (diff) | |
Improved codegen for 'when' statements
Diffstat (limited to 'src')
| -rw-r--r-- | src/compile.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/compile.c b/src/compile.c index 5809c670..e09474a2 100644 --- a/src/compile.c +++ b/src/compile.c @@ -1070,9 +1070,10 @@ static CORD _compile_statement(env_t *env, ast_t *ast) for (when_clause_t *clause = when->clauses; clause; clause = clause->next) { if (clause->pattern->tag == Var) { const char *clause_tag_name = Match(clause->pattern, Var)->name; + type_t *clause_type = clause->body ? get_type(env, clause->body) : Type(VoidType); code = CORD_all(code, "case ", namespace_name(enum_t->env, enum_t->env->namespace, CORD_all("tag$", clause_tag_name)), ": {\n", - compile_statement(env, clause->body), - "break;\n" + compile_inline_block(env, clause->body), + (clause_type->tag == ReturnType || clause_type->tag == AbortType) ? CORD_EMPTY : "break;\n", "}\n"); continue; } |
