fix: ir generation for divert arguments

This commit is contained in:
Brett Broadhurst 2026-03-26 10:20:27 -06:00
parent 37ab29947a
commit cbcc796f1e
Failed to generate hash of commit
3 changed files with 19 additions and 18 deletions

View file

@ -1152,18 +1152,15 @@ fn callExpr(
const scratch_top = astgen.scratch.items.len;
defer astgen.scratch.shrinkRetainingCapacity(scratch_top);
const args_count = if (args_node) |n| switch (n.tag) {
.call_expr => n.data.list.items.?.len,
else => 0,
} else 0;
const arguments: ?[]*Ast.Node = if (args_node) |n| n.data.list.items.? else null;
const args_count = if (arguments) |args| args.len else 0;
try astgen.scratch.resize(gpa, scratch_top + args_count);
var scratch_index = scratch_top;
if (args_node) |n| blk: {
if (n.tag != .call_expr) break :blk;
const args_list = n.data.list.items.?;
for (args_list) |arg| {
if (arguments) |args| {
for (args) |arg| {
var arg_block = gi.makeSubBlock();
defer arg_block.unstack();

View file

@ -226,33 +226,36 @@ pub fn dumpKnot(self: *Dumper, w: *std.Io.Writer, knot: *const Object.Knot) !voi
var stitch_iter = knot.members.iterator();
var count: usize = 0;
while (stitch_iter.next()) |entry| : (count += 1) {
const key = entry.key_ptr.*;
const stitch: *Object.Knot = @ptrCast(entry.value_ptr.*);
try w.splatByteAll(' ', self.indent_level);
try w.print("Stitch #{d}: \"{s}\"\n", .{ count, entry.key_ptr.* });
try w.print("Stitch #{d}: \"{s}\"\n", .{ count, key });
self.indent_level += 2;
try w.splatByteAll(' ', self.indent_level);
try w.print("Arguments: {d}\n", .{knot.code.args_count});
try w.print("Arguments: {d}\n", .{stitch.code.args_count});
try w.splatByteAll(' ', self.indent_level);
try w.print("Locals: {d}\n", .{knot.code.locals_count});
try w.print("Locals: {d}\n", .{stitch.code.locals_count});
try w.splatByteAll(' ', self.indent_level);
try w.print("Stack Size: {d}\n", .{knot.code.stack_size});
try w.print("Stack Size: {d}\n", .{stitch.code.stack_size});
try w.splatByteAll(' ', self.indent_level);
try w.writeAll("Constants: ");
try dumpKnotConstants(w, knot);
try dumpKnotConstants(w, stitch);
try w.writeAll("\n");
try w.splatByteAll(' ', self.indent_level);
try w.writeAll("Children: ");
try dumpKnotChildren(w, knot);
try dumpKnotChildren(w, stitch);
try w.writeAll("\n");
try w.splatByteAll(' ', self.indent_level);
try w.writeAll("Bytecode: \n");
self.indent_level += 2;
try self.dumpKnotBytecode(w, @ptrCast(entry.value_ptr.*));
try self.dumpKnotBytecode(w, stitch);
try w.writeAll("\n");
self.indent_level -= 4;

View file

@ -250,9 +250,10 @@ pub const Module = struct {
for (top_level_decls) |decl_index| {
try sema.analyzeTopLevelDecl(file_scope, decl_index);
}
var knot_index: ?Knot.Index = null;
while (mod.work_queue.pop()) |work_unit| {
const chunk_index = mod.intern_pool.code_chunks.items.len;
var knot_index: ?Knot.Index = null;
var chunk: Sema.Chunk = .{
.sema = &sema,
.code = try mod.createCodeChunk(),
@ -411,7 +412,7 @@ pub const Module = struct {
const parent_knot = mod.knots.items[@intFromEnum(index)];
const parent_knot_name = mod.intern_pool.getStrBytes(mod.ir, parent_knot.name_index);
const parent_knot_obj: *Object.Knot = @ptrCast(story.globals.get(parent_knot_name).?);
try parent_knot_obj.members.put(story.allocator, name_bytes, &stitch_obj.base);
try parent_knot_obj.members.put(gpa, name_bytes, &stitch_obj.base);
}
}
story.string_bytes = mod.ir.string_bytes;