lib/chant/src/lower/scope.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const choir = @import("choir");
2 const ast = @import("../ast/root.zig");
3 const context = @import("context.zig");
4 const Error = @import("error.zig").Error;
5
6 const Lowerer = context.Lowerer;
7 const Local = context.Local;
8
9 pub fn push(lowerer: *Lowerer) Error!void {
10 try lowerer.scopes.append(lowerer.gpa, .empty);
11 }
12
13 pub fn pop(lowerer: *Lowerer) void {
14 var current = lowerer.scopes.pop() orelse return;
15 current.deinit(lowerer.gpa);
16 }
17
18 pub fn lookup(lowerer: *const Lowerer, name: []const u8) ?Local {
19 var i = lowerer.scopes.items.len;
20 while (i > 0) {
21 i -= 1;
22 if (lowerer.scopes.items[i].get(name)) |local| return local;
23 }
24 return null;
25 }
26
27 pub fn bind(lowerer: *Lowerer, name: []const u8, local: Local) Error!void {
28 const top = &lowerer.scopes.items[lowerer.scopes.items.len - 1];
29 try top.put(lowerer.gpa, name, local);
30 }
31
32 pub fn bindLoopVariable(lowerer: *Lowerer, name: []const u8, value: *choir.Value, c_type: *const ast.Type) Error!void {
33 try bind(lowerer, name, .{ .kind = .loop_iv, .value = value, .c_type = c_type });
34 }