aboutsummaryrefslogtreecommitdiff
path: root/src/compile/loops.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-09-24 21:20:44 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-09-24 21:20:44 -0400
commit0cfae753aa131f949253f3fba1e3a36c2bde6ac0 (patch)
treed1403a97d7e86f547f8e6ca9994095f31c37d2a2 /src/compile/loops.c
parent76f80f80ff1788af96ae87fa909c130336d5399b (diff)
Revert "Deprecate `defer`"
This reverts commit 7e3e245f6809946ea06ef1998bcabb7e0902fbd7.
Diffstat (limited to 'src/compile/loops.c')
-rw-r--r--src/compile/loops.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/compile/loops.c b/src/compile/loops.c
index 921f879e..588be4f0 100644
--- a/src/compile/loops.c
+++ b/src/compile/loops.c
@@ -42,6 +42,7 @@ Text_t compile_for_loop(env_t *env, ast_t *ast) {
loop_ctx_t loop_ctx = (loop_ctx_t){
.loop_name = "for",
.loop_vars = for_->vars,
+ .deferred = body_scope->deferred,
.next = body_scope->loop_ctx,
};
body_scope->loop_ctx = &loop_ctx;
@@ -355,6 +356,7 @@ Text_t compile_repeat(env_t *env, ast_t *ast) {
env_t *scope = fresh_scope(env);
loop_ctx_t loop_ctx = (loop_ctx_t){
.loop_name = "repeat",
+ .deferred = scope->deferred,
.next = env->loop_ctx,
};
scope->loop_ctx = &loop_ctx;
@@ -371,6 +373,7 @@ Text_t compile_while(env_t *env, ast_t *ast) {
env_t *scope = fresh_scope(env);
loop_ctx_t loop_ctx = (loop_ctx_t){
.loop_name = "while",
+ .deferred = scope->deferred,
.next = env->loop_ctx,
};
scope->loop_ctx = &loop_ctx;
@@ -396,7 +399,11 @@ Text_t compile_skip(env_t *env, ast_t *ast) {
ctx->skip_label = Texts("skip_", skip_label_count);
++skip_label_count;
}
- return Texts("goto ", ctx->skip_label, ";");
+ Text_t code = EMPTY_TEXT;
+ for (deferral_t *deferred = env->deferred; deferred && deferred != ctx->deferred; deferred = deferred->next)
+ code = Texts(code, compile_statement(deferred->defer_env, deferred->block));
+ if (code.length > 0) return Texts("{\n", code, "goto ", ctx->skip_label, ";\n}\n");
+ else return Texts("goto ", ctx->skip_label, ";");
}
}
if (env->loop_ctx) code_err(ast, "This is not inside any loop");
@@ -418,7 +425,11 @@ Text_t compile_stop(env_t *env, ast_t *ast) {
ctx->stop_label = Texts("stop_", stop_label_count);
++stop_label_count;
}
- return Texts("goto ", ctx->stop_label, ";");
+ Text_t code = EMPTY_TEXT;
+ for (deferral_t *deferred = env->deferred; deferred && deferred != ctx->deferred; deferred = deferred->next)
+ code = Texts(code, compile_statement(deferred->defer_env, deferred->block));
+ if (code.length > 0) return Texts("{\n", code, "goto ", ctx->stop_label, ";\n}\n");
+ else return Texts("goto ", ctx->stop_label, ";");
}
}
if (env->loop_ctx) code_err(ast, "This is not inside any loop");