Skip to content

Commit 86f769b

Browse files
gh-64: Complete GOTO implementation.
1 parent 32dd7e7 commit 86f769b

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/interpreter.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2439,6 +2439,48 @@ static ExecResult exec_stmt(Interpreter* interp, Stmt* stmt, Env* env, LabelMap*
24392439
return res;
24402440
}
24412441

2442+
case STMT_GOTOPOINT: {
2443+
// Gotopoint declarations are collected in exec_stmt_list's first pass.
2444+
// At runtime they are effectively a no-op (the label mapping is already built).
2445+
return make_ok(value_null());
2446+
}
2447+
2448+
case STMT_GOTO: {
2449+
Value target = eval_expr(interp, stmt->as.goto_stmt.target, env);
2450+
if (interp->error) {
2451+
ExecResult err = make_error(interp->error, interp->error_line, interp->error_col);
2452+
clear_error(interp);
2453+
return err;
2454+
}
2455+
2456+
if (!(target.type == VAL_INT || target.type == VAL_STR)) {
2457+
value_free(target);
2458+
return make_error("GOTO requires INT or STR argument", stmt->line, stmt->column);
2459+
}
2460+
2461+
if (target.type == VAL_INT && target.as.i < 0) {
2462+
value_free(target);
2463+
return make_error("Negative GOTO target is not allowed", stmt->line, stmt->column);
2464+
}
2465+
2466+
int idx = label_map_find(labels, target);
2467+
value_free(target);
2468+
2469+
if (idx < 0) {
2470+
return make_error("Unregistered GOTO target", stmt->line, stmt->column);
2471+
}
2472+
2473+
ExecResult res;
2474+
res.status = EXEC_GOTO;
2475+
res.value = value_null();
2476+
res.break_count = 0;
2477+
res.jump_index = idx;
2478+
res.error = NULL;
2479+
res.error_line = 0;
2480+
res.error_column = 0;
2481+
return res;
2482+
}
2483+
24422484
case STMT_THR: {
24432485
Value thr_val = value_thr_new();
24442486
Value thr_for_worker = value_copy(thr_val);

0 commit comments

Comments
 (0)