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;
|
const scratch_top = astgen.scratch.items.len;
|
||||||
defer astgen.scratch.shrinkRetainingCapacity(scratch_top);
|
defer astgen.scratch.shrinkRetainingCapacity(scratch_top);
|
||||||
const args_count = if (args_node) |n| switch (n.tag) {
|
|
||||||
.call_expr => n.data.list.items.?.len,
|
const arguments: ?[]*Ast.Node = if (args_node) |n| n.data.list.items.? else null;
|
||||||
else => 0,
|
const args_count = if (arguments) |args| args.len else 0;
|
||||||
} else 0;
|
|
||||||
try astgen.scratch.resize(gpa, scratch_top + args_count);
|
try astgen.scratch.resize(gpa, scratch_top + args_count);
|
||||||
var scratch_index = scratch_top;
|
var scratch_index = scratch_top;
|
||||||
|
|
||||||
if (args_node) |n| blk: {
|
if (arguments) |args| {
|
||||||
if (n.tag != .call_expr) break :blk;
|
for (args) |arg| {
|
||||||
|
|
||||||
const args_list = n.data.list.items.?;
|
|
||||||
for (args_list) |arg| {
|
|
||||||
var arg_block = gi.makeSubBlock();
|
var arg_block = gi.makeSubBlock();
|
||||||
defer arg_block.unstack();
|
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 stitch_iter = knot.members.iterator();
|
||||||
var count: usize = 0;
|
var count: usize = 0;
|
||||||
while (stitch_iter.next()) |entry| : (count += 1) {
|
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.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;
|
self.indent_level += 2;
|
||||||
try w.splatByteAll(' ', self.indent_level);
|
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.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.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.splatByteAll(' ', self.indent_level);
|
||||||
try w.writeAll("Constants: ");
|
try w.writeAll("Constants: ");
|
||||||
try dumpKnotConstants(w, knot);
|
try dumpKnotConstants(w, stitch);
|
||||||
try w.writeAll("\n");
|
try w.writeAll("\n");
|
||||||
|
|
||||||
try w.splatByteAll(' ', self.indent_level);
|
try w.splatByteAll(' ', self.indent_level);
|
||||||
try w.writeAll("Children: ");
|
try w.writeAll("Children: ");
|
||||||
try dumpKnotChildren(w, knot);
|
try dumpKnotChildren(w, stitch);
|
||||||
try w.writeAll("\n");
|
try w.writeAll("\n");
|
||||||
|
|
||||||
try w.splatByteAll(' ', self.indent_level);
|
try w.splatByteAll(' ', self.indent_level);
|
||||||
try w.writeAll("Bytecode: \n");
|
try w.writeAll("Bytecode: \n");
|
||||||
self.indent_level += 2;
|
self.indent_level += 2;
|
||||||
try self.dumpKnotBytecode(w, @ptrCast(entry.value_ptr.*));
|
try self.dumpKnotBytecode(w, stitch);
|
||||||
try w.writeAll("\n");
|
try w.writeAll("\n");
|
||||||
self.indent_level -= 4;
|
self.indent_level -= 4;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -250,9 +250,10 @@ pub const Module = struct {
|
||||||
for (top_level_decls) |decl_index| {
|
for (top_level_decls) |decl_index| {
|
||||||
try sema.analyzeTopLevelDecl(file_scope, decl_index);
|
try sema.analyzeTopLevelDecl(file_scope, decl_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var knot_index: ?Knot.Index = null;
|
||||||
while (mod.work_queue.pop()) |work_unit| {
|
while (mod.work_queue.pop()) |work_unit| {
|
||||||
const chunk_index = mod.intern_pool.code_chunks.items.len;
|
const chunk_index = mod.intern_pool.code_chunks.items.len;
|
||||||
var knot_index: ?Knot.Index = null;
|
|
||||||
var chunk: Sema.Chunk = .{
|
var chunk: Sema.Chunk = .{
|
||||||
.sema = &sema,
|
.sema = &sema,
|
||||||
.code = try mod.createCodeChunk(),
|
.code = try mod.createCodeChunk(),
|
||||||
|
|
@ -411,7 +412,7 @@ pub const Module = struct {
|
||||||
const parent_knot = mod.knots.items[@intFromEnum(index)];
|
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_name = mod.intern_pool.getStrBytes(mod.ir, parent_knot.name_index);
|
||||||
const parent_knot_obj: *Object.Knot = @ptrCast(story.globals.get(parent_knot_name).?);
|
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;
|
story.string_bytes = mod.ir.string_bytes;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue