clean stack

This commit is contained in:
caandt 2025-06-09 23:33:42 -05:00
parent 39199f4a0d
commit da4484d4f5

View file

@ -94,7 +94,9 @@ const sz_code_tmp = struct {
},
.seq => |s| {
try self.append(src, s.a);
try self.clean_stack(s.a);
try self.append(src, s.b);
try self.clean_stack(s.b);
},
.unop => |u| {
try self.append(src, u.expr);
@ -103,7 +105,13 @@ const sz_code_tmp = struct {
.assign => |a| {
try self.append(src, a.rhs);
try self.append_assign(src, a.lhs);
}
},
}
}
fn clean_stack(self: *sz_code_tmp, expr: *const Expr) !void {
switch (expr.*) {
.atom, .binop, .unop => try self.bc.append(.{ .pop = {} }),
else => {},
}
}
fn append_assign(self: *sz_code_tmp, src: []const u8, expr: *const Expr) !void {
@ -131,6 +139,6 @@ pub fn compile(allocator: std.mem.Allocator, src: []const u8) !sz_code {
const expr = try p.parse(src);
var code = sz_code_tmp{ .consts = std.ArrayList(sz_obj).init(allocator), .vars = std.ArrayList(sz_obj).init(allocator), .bc = std.ArrayList(sz_inst).init(allocator), .name = std.StringHashMap(usize).init(allocator)};
try code.append(src, expr);
try code.bc.append(.{ .pop = {} });
try code.clean_stack(expr);
return code.finalize();
}