diff --git a/src/buzz_api.zig b/src/buzz_api.zig index 68d0eba2..b3971e65 100644 --- a/src/buzz_api.zig +++ b/src/buzz_api.zig @@ -611,33 +611,29 @@ export fn bz_getUserDataPtr(userdata: Value) u64 { return ObjUserData.cast(userdata.obj()).?.userdata; } -export fn bz_newVM(self: *VM) ?*VM { - const vm = self.gc.allocator.create(VM) catch { - return null; - }; - var gc = self.gc.allocator.create(GarbageCollector) catch { - return null; - }; +export fn bz_newVM() *VM { + const vm = allocator.create(VM) catch @panic("Out of memory"); + var gc = allocator.create(GarbageCollector) catch @panic("Out of memory"); // FIXME: should share strings between gc - gc.* = GarbageCollector.init(self.gc.allocator) catch { - vm.panic("Out of memory"); - unreachable; - }; - gc.type_registry = TypeRegistry.init(gc) catch { - vm.panic("Out of memory"); - unreachable; - }; + gc.* = GarbageCollector.init(allocator) catch @panic("Out of memory"); + gc.type_registry = TypeRegistry.init(gc) catch @panic("Out of memory"); + const import_registry = allocator.create(_vm.ImportRegistry) catch @panic("Out of memory"); + import_registry.* = _vm.ImportRegistry.init(allocator); // FIXME: give reference to JIT? - vm.* = VM.init(gc, self.import_registry, self.flavor) catch { - return null; - }; + vm.* = VM.init( + gc, + import_registry, + .Run, + ) catch @panic("Out of memory"); return vm; } -export fn bz_deinitVM(_: *VM) void { - // self.deinit(); +export fn bz_deinitVM(self: *VM) void { + self.deinit(); + self.import_registry.deinit(); + self.gc.deinit(); } export fn bz_panic(vm: *VM, msg: [*]const u8, len: usize) void { diff --git a/src/lib/buzz_api.zig b/src/lib/buzz_api.zig index dded2b5a..da5fc4b3 100644 --- a/src/lib/buzz_api.zig +++ b/src/lib/buzz_api.zig @@ -195,7 +195,7 @@ pub const VM = opaque { else std.heap.c_allocator; - pub extern fn bz_newVM(self: *VM) *VM; + pub extern fn bz_newVM() *VM; pub extern fn bz_deinitVM(self: *VM) void; pub extern fn bz_panic(vm: *VM, msg: [*]const u8, len: usize) void; pub extern fn bz_run(self: *VM, source: ?[*]const u8, source_len: usize, file_name: ?[*]const u8, file_name_len: usize) bool; diff --git a/src/lib/buzz_io.zig b/src/lib/buzz_io.zig index 6f26d191..76744176 100644 --- a/src/lib/buzz_io.zig +++ b/src/lib/buzz_io.zig @@ -405,7 +405,7 @@ pub export fn runFile(ctx: *api.NativeCtx) c_int { defer api.VM.allocator.free(source); // Init new VM - var vm = ctx.vm.bz_newVM(); + var vm = api.VM.bz_newVM(); defer vm.bz_deinitVM(); // Compile diff --git a/src/memory.zig b/src/memory.zig index f51ba136..5dcd211a 100644 --- a/src/memory.zig +++ b/src/memory.zig @@ -283,11 +283,11 @@ pub const GarbageCollector = struct { } pub fn deinit(self: *Self) void { - self.gray_stack.deinit(); - self.strings.deinit(); - self.active_vms.deinit(); - if (self.debugger) |debugger| { - debugger.deinit(); + self.gray_stack.deinit(self.allocator); + self.strings.deinit(self.allocator); + self.active_vms.deinit(self.allocator); + if (self.debugger != null) { + self.debugger.?.deinit(); } self.allocator.free(self.objfiber_members); @@ -1119,7 +1119,7 @@ pub const GarbageCollectorDebugger = struct { } pub fn deinit(self: *Self) void { - self.tracker.deinit(); + self.tracker.deinit(self.allocator); } pub fn allocated(self: *Self, ptr: *Obj, at: ?Token, what: _obj.ObjType) void { diff --git a/tests/utils/testing.buzz b/tests/utils/testing.buzz index 20f1b0ad..d0f74e76 100644 --- a/tests/utils/testing.buzz +++ b/tests/utils/testing.buzz @@ -1,6 +1,6 @@ namespace testing; -import "std" as std; +import "std"; final unexported = 42;