Skip to content
Open
1,246 changes: 655 additions & 591 deletions src/instance/vm.zig

Large diffs are not rendered by default.

53 changes: 35 additions & 18 deletions src/module.zig
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const leb = std.leb;
const math = std.math;
const unicode = std.unicode;
const ArrayList = std.ArrayList;
const VirtualMachine = @import("instance/vm.zig").VirtualMachine;
const Rr = @import("rr.zig").Rr;
const RrOpcode = @import("rr.zig").RrOpcode;
const Instance = @import("instance.zig").Instance;
Expand Down Expand Up @@ -34,7 +35,8 @@ pub const Module = struct {
function_index_start: ?usize = null,
data_count: ?u32 = null,
element_init_offsets: ArrayList(usize),
parsed_code: ArrayList(Rr),
// parsed_code: ArrayList(Rr),
instructions: ArrayList(u64),
local_types: ArrayList(LocalType),
br_table_indices: ArrayList(u32),
references: ArrayList(u32),
Expand All @@ -56,7 +58,8 @@ pub const Module = struct {
.codes = Section(Code).init(alloc),
.datas = Section(DataSegment).init(alloc),
.element_init_offsets = ArrayList(usize).init(alloc),
.parsed_code = ArrayList(Rr).init(alloc),
// .parsed_code = ArrayList(Rr).init(alloc),
.instructions = ArrayList(u64).init(alloc),
.local_types = ArrayList(LocalType).init(alloc),
.br_table_indices = ArrayList(u32).init(alloc),
.references = ArrayList(u32).init(alloc),
Expand All @@ -77,7 +80,8 @@ pub const Module = struct {
self.datas.deinit();

self.element_init_offsets.deinit();
self.parsed_code.deinit();
// self.parsed_code.deinit();
self.instructions.deinit();
self.local_types.deinit();
self.br_table_indices.deinit();
self.references.deinit();
Expand All @@ -96,7 +100,7 @@ pub const Module = struct {
// Push an initial return instruction so we don't have to
// track the end of a function to use its return on invoke
// See https://github.com/malcolmstill/zware/pull/133
try self.parsed_code.append(.@"return");
try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"return")));

var i: usize = 0;
while (true) : (i += 1) {
Expand Down Expand Up @@ -474,9 +478,12 @@ pub const Module = struct {

try self.references.append(funcidx);

const init_offset = self.parsed_code.items.len;
try self.parsed_code.append(Rr{ .@"ref.func" = funcidx });
try self.parsed_code.append(Rr.@"return");
const init_offset = self.instructions.items.len;

try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"ref.func")));
try self.instructions.append(funcidx);
try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"return")));

try self.element_init_offsets.append(init_offset);
}

Expand Down Expand Up @@ -505,9 +512,12 @@ pub const Module = struct {

try self.references.append(funcidx);

const init_offset = self.parsed_code.items.len;
try self.parsed_code.append(Rr{ .@"ref.func" = funcidx });
try self.parsed_code.append(Rr.@"return");
const init_offset = self.instructions.items.len;

try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"ref.func")));
try self.instructions.append(funcidx);
try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"return")));

try self.element_init_offsets.append(init_offset);
}

Expand Down Expand Up @@ -538,9 +548,12 @@ pub const Module = struct {

try self.references.append(funcidx);

const init_offset = self.parsed_code.items.len;
try self.parsed_code.append(Rr{ .@"ref.func" = funcidx });
try self.parsed_code.append(Rr.@"return");
const init_offset = self.instructions.items.len;

try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"ref.func")));
try self.instructions.append(funcidx);
try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"return")));

try self.element_init_offsets.append(init_offset);
}

Expand Down Expand Up @@ -568,9 +581,12 @@ pub const Module = struct {

try self.references.append(funcidx);

const init_offset = self.parsed_code.items.len;
try self.parsed_code.append(Rr{ .@"ref.func" = funcidx });
try self.parsed_code.append(Rr.@"return");
const init_offset = self.instructions.items.len;

try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"ref.func")));
try self.instructions.append(funcidx);
try self.instructions.append(@as(u64, @intFromPtr(&VirtualMachine.@"return")));

try self.element_init_offsets.append(init_offset);
}

Expand Down Expand Up @@ -615,7 +631,7 @@ pub const Module = struct {

var j: usize = 0;
while (j < expr_count) : (j += 1) {
const init_offset = self.parsed_code.items.len;
const init_offset = self.instructions.items.len;
_ = try self.readConstantExpression(.FuncRef);
try self.element_init_offsets.append(init_offset);
}
Expand Down Expand Up @@ -662,7 +678,8 @@ pub const Module = struct {
const count = try self.readULEB128(u32);
self.codes.count = count;

try self.parsed_code.ensureTotalCapacity(count * 32);
// FIXME: better heuristic + also ensure immediates_offset + immediates
try self.instructions.ensureTotalCapacity(count * 32);

if (count == 0) return;

Expand Down
Loading