fix: ir generation for divert arguments
This commit is contained in:
parent
37ab29947a
commit
cbcc796f1e
3 changed files with 19 additions and 18 deletions
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue