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 }