diff --git a/src/interp/compile.zig b/src/interp/compile.zig index 3e99f98..bdde346 100644 --- a/src/interp/compile.zig +++ b/src/interp/compile.zig @@ -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(); }