clean stack
This commit is contained in:
parent
39199f4a0d
commit
da4484d4f5
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue