summaryrefslogtreecommitdiff
path: root/src/libzisp/gc.zig
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2025-03-18 21:39:51 +0100
committerTaylan Kammer <taylan.kammer@gmail.com>2025-03-18 21:39:51 +0100
commitf1c256884b0d59683e8bd43160b048561191a809 (patch)
tree804f356fccb0e1a2b77f61e25bc81cbfc2452b03 /src/libzisp/gc.zig
parentc43c3c22e5d0f872168c5b687141c7b08a188c5d (diff)
Implement istr.
Diffstat (limited to 'src/libzisp/gc.zig')
-rw-r--r--src/libzisp/gc.zig30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/libzisp/gc.zig b/src/libzisp/gc.zig
index 92b4387..46ac091 100644
--- a/src/libzisp/gc.zig
+++ b/src/libzisp/gc.zig
@@ -5,18 +5,38 @@ const value = @import("value.zig");
const Value = value.Value;
const Hval = value.Hval;
-var _gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
+var _gpa = std.heap.GeneralPurposeAllocator(.{}).init;
const gpa = _gpa.allocator();
-var cpool = std.heap.MemoryPool([2]Value).init(gpa);
+// Cons cells
+
+var cons_pool = std.heap.MemoryPool([2]Value).init(gpa);
pub fn cons(v1: Value, v2: Value) *[2]Value {
- const mem = cpool.create() catch @panic("OOM");
+ const mem = cons_pool.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");
+// Interned strings
+
+var istr_pool = std.hash_map.StringHashMap(void).init(gpa);
+
+pub fn intern(header: value.seq.Header, str: []const u8) [*]Hval {
+ comptime {
+ std.debug.assert(@sizeOf(value.seq.Header) == 8);
+ }
+ const size = str.len + 8;
+ const copy = gpa.alloc(u8, size) catch @panic("OOM");
+ const header_bytes: [8]u8 = @bitCast(header);
+ @memcpy(copy[0..8], &header_bytes);
+ @memcpy(copy[8..size], str);
+ const entry = istr_pool.getOrPutValue(copy, {}) catch @panic("OOM");
+ return @ptrCast(entry.key_ptr);
+}
+
+pub fn istrHeader(ptr: [*]Hval) *value.seq.Header {
+ const entry_key: *[]u8 = @ptrCast(ptr);
+ return @alignCast(@ptrCast(entry_key.ptr));
}