feat: basic code generation

This commit is contained in:
Brett Broadhurst 2026-03-02 13:20:02 -07:00
parent 3ab279de0f
commit 55346fcd85
Failed to generate hash of commit
4 changed files with 579 additions and 16 deletions

View file

@ -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]) {