From 47a9c0403576064ece3eb1b1b633b5e3a94cabc4 Mon Sep 17 00:00:00 2001 From: Mathias Magnusson Date: Sat, 7 Jun 2025 00:57:47 +0200 Subject: add while loops --- src/compile.zig | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/compile.zig') 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; + }, } } -- cgit v1.2.3