diff options
| -rw-r--r-- | src/libzisp/gc.zig | 10 | ||||
| -rw-r--r-- | src/libzisp/value/pair.zig | 5 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/libzisp/gc.zig b/src/libzisp/gc.zig index 6704102..92b4387 100644 --- a/src/libzisp/gc.zig +++ b/src/libzisp/gc.zig @@ -2,11 +2,21 @@ const std = @import("std"); const value = @import("value.zig"); +const Value = value.Value; const Hval = value.Hval; var _gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; const gpa = _gpa.allocator(); +var cpool = std.heap.MemoryPool([2]Value).init(gpa); + +pub fn cons(v1: Value, v2: Value) *[2]Value { + const mem = cpool.create() catch @panic("OOM"); + mem[0] = v1; + mem[1] = v2; + return mem; +} + pub fn alloc(count: usize) []Hval { return gpa.alloc(Hval, count) catch @panic("OOM"); } diff --git a/src/libzisp/value/pair.zig b/src/libzisp/value/pair.zig index 1c34096..87e18e7 100644 --- a/src/libzisp/value/pair.zig +++ b/src/libzisp/value/pair.zig @@ -26,10 +26,7 @@ pub fn pred(v: Value) Value { } pub fn cons(v1: Value, v2: Value) Value { - const mem = gc.alloc(2); - mem[0] = .{ .value = v1 }; - mem[1] = .{ .value = v2 }; - return ptr.pack(mem.ptr, .pair); + return ptr.pack(@ptrCast(gc.cons(v1, v2)), .pair); } fn getMem(v: Value) *[2]Value { |
