Files
bun.sh/src/shell/AllocScope.zig
taylor.fish 3d361c8b49 Static allocator polymorphism (#22227)
* Define a generic allocator interface to enable static polymorphism for
allocators (see `GenericAllocator` in `src/allocators.zig`). Note that
`std.mem.Allocator` itself is considered a generic allocator.
* Add utilities to `bun.allocators` for working with generic allocators.
* Add a new namespace, `bun.memory`, with basic utilities for working
with memory and objects (`create`, `destroy`, `initDefault`, `deinit`).
* Add `bun.DefaultAllocator`, a zero-sized generic allocator type whose
`allocator` method simply returns `bun.default_allocator`.
* Implement the generic allocator interface in `AllocationScope` and
`MimallocArena`.
* Improve `bun.threading.GuardedValue` (now `bun.threading.Guarded`).
* Improve `bun.safety.AllocPtr` (now `bun.safety.CheckedAllocator`).

(For internal tracking: fixes STAB-1085, STAB-1086, STAB-1087,
STAB-1088, STAB-1089, STAB-1090, STAB-1091)
2025-09-03 15:40:44 -07:00

44 lines
1.3 KiB
Zig

//! This is just a wrapper around `bun.AllocationScope` that ensures that it is
//! zero-cost in release builds.
const AllocScope = @This();
__scope: if (bun.Environment.enableAllocScopes) bun.AllocationScope else void,
pub fn beginScope(alloc: std.mem.Allocator) AllocScope {
if (comptime bun.Environment.enableAllocScopes) {
return .{ .__scope = bun.AllocationScope.init(alloc) };
}
return .{ .__scope = {} };
}
pub fn endScope(this: *AllocScope) void {
if (comptime bun.Environment.enableAllocScopes) {
this.__scope.deinit();
}
}
pub fn leakSlice(this: *AllocScope, memory: anytype) void {
if (comptime bun.Environment.enableAllocScopes) {
_ = @typeInfo(@TypeOf(memory)).pointer;
this.__scope.trackExternalFree(memory, null) catch |err|
std.debug.panic("invalid free: {}", .{err});
}
}
pub fn assertInScope(this: *AllocScope, memory: anytype) void {
if (comptime bun.Environment.enableAllocScopes) {
this.__scope.assertOwned(memory);
}
}
pub inline fn allocator(this: *AllocScope) std.mem.Allocator {
if (comptime bun.Environment.enableAllocScopes) {
return this.__scope.allocator();
}
return bun.default_allocator;
}
const bun = @import("bun");
const std = @import("std");