aboutsummaryrefslogtreecommitdiff
path: root/src/compile.zig
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2025-06-07 00:57:47 +0200
committerMathias Magnusson <mathias@magnusson.space>2025-06-07 00:57:47 +0200
commit47a9c0403576064ece3eb1b1b633b5e3a94cabc4 (patch)
treea4073ae33c109f7f03fe6135e6b18c3f1c2f9e0d /src/compile.zig
parent1ed87d6c58cab383f18590093f651ef35c4fa671 (diff)
downloadhuginn-47a9c0403576064ece3eb1b1b633b5e3a94cabc4.tar.gz
add while loops
Diffstat (limited to 'src/compile.zig')
-rw-r--r--src/compile.zig28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/compile.zig b/src/compile.zig
index c0ba77d..4d39293 100644
--- a/src/compile.zig
+++ b/src/compile.zig
@@ -336,6 +336,34 @@ const CompileContext = struct {
const val = try self.compileExpr(assign_var.value);
try self.assignLocalVar(local, val);
},
+ .@"while" => |@"while"| {
+ const curr = self.current_block;
+ const cond_block = try self.switchToNewBlock();
+ self.current_block = curr;
+ try self.addInstr(.{
+ .loc = stmt.loc,
+ .type = .{ .jump = .{ .to = cond_block } },
+ });
+ const do = try self.switchToNewBlock();
+ const after = try self.switchToNewBlock();
+ self.current_block = cond_block;
+ const cond = try self.compileExpr(@"while".cond);
+ try self.addInstr(.{
+ .loc = stmt.loc,
+ .type = .{ .branch = .{
+ .cond = cond,
+ .true = .{ .to = do },
+ .false = .{ .to = after },
+ } },
+ });
+ self.current_block = do;
+ try self.compileBlock(@"while".do);
+ try self.addInstr(.{
+ .loc = stmt.loc,
+ .type = .{ .jump = .{ .to = cond_block } },
+ });
+ self.current_block = after;
+ },
}
}