feat: basic code generation
This commit is contained in:
parent
3ab279de0f
commit
55346fcd85
4 changed files with 579 additions and 16 deletions
|
|
@ -77,31 +77,38 @@ pub fn deinit(story: *Story) void {
|
|||
story.call_stack.deinit(gpa);
|
||||
}
|
||||
|
||||
pub fn dump(story: *Story, writer: *std.Io.Writer) !void {
|
||||
const story_dumper: Dumper = .{ .story = story, .writer = writer };
|
||||
for (story.paths.items) |path_object| {
|
||||
try story_dumper.dump(@ptrCast(path_object));
|
||||
}
|
||||
}
|
||||
|
||||
pub fn trace(story: *Story, writer: *std.Io.Writer, frame: *CallFrame) !void {
|
||||
try writer.print("\tStack => stack_pointer={d}, objects=[", .{frame.sp});
|
||||
|
||||
const dumper = Dumper{ .story = story, .writer = writer };
|
||||
const story_dumper: Dumper = .{ .story = story, .writer = writer };
|
||||
const stack = &story.stack;
|
||||
const stack_top = story.stack.items.len;
|
||||
if (stack_top > 0) {
|
||||
const last_slot = stack.items[stack.items.len - 1];
|
||||
for (stack.items[frame.sp .. stack.items.len - 1]) |slot| {
|
||||
if (slot) |object| {
|
||||
try dumper.printObject(object);
|
||||
try story_dumper.dumpObject(object);
|
||||
} else {
|
||||
try writer.writeAll("NULL");
|
||||
}
|
||||
try writer.writeAll(", ");
|
||||
}
|
||||
if (last_slot) |object| {
|
||||
try dumper.printObject(object);
|
||||
try story_dumper.dumpObject(object);
|
||||
} else {
|
||||
try writer.writeAll("NULL");
|
||||
}
|
||||
}
|
||||
|
||||
try writer.writeAll("]\n");
|
||||
_ = try dumper.dumpInst(frame.callee, frame.ip, true);
|
||||
_ = try story_dumper.dumpInst(frame.callee, frame.ip, true);
|
||||
return writer.flush();
|
||||
}
|
||||
|
||||
|
|
@ -177,7 +184,7 @@ fn execute(vm: *Story, writer: *std.Io.Writer) !void {
|
|||
const code = std.mem.bytesAsSlice(Opcode, frame.callee.bytes);
|
||||
|
||||
while (true) {
|
||||
if (vm.trace_writer) |w| {
|
||||
if (vm.dump_writer) |w| {
|
||||
vm.trace(w, frame) catch {};
|
||||
}
|
||||
switch (code[frame.ip]) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue