summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2025-03-02 22:13:31 +0100
committerTaylan Kammer <taylan.kammer@gmail.com>2025-03-02 22:13:31 +0100
commitfbcedd74510b02a8a56acfbb3fb115394fcbdfd8 (patch)
tree0ef5e76f063d59582e871f11818927ad0646c9f4
parent45ed12c1bcb8db5cb35c35495023ffaf24e2877c (diff)
use mem pool for cons
-rw-r--r--src/libzisp/gc.zig10
-rw-r--r--src/libzisp/value/pair.zig5
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 {