diff options
| author | Taylan Kammer <taylan.kammer@gmail.com> | 2025-03-18 21:39:51 +0100 |
|---|---|---|
| committer | Taylan Kammer <taylan.kammer@gmail.com> | 2025-03-18 21:39:51 +0100 |
| commit | f1c256884b0d59683e8bd43160b048561191a809 (patch) | |
| tree | 804f356fccb0e1a2b77f61e25bc81cbfc2452b03 /src/libzisp/gc.zig | |
| parent | c43c3c22e5d0f872168c5b687141c7b08a188c5d (diff) | |
Implement istr.
Diffstat (limited to 'src/libzisp/gc.zig')
| -rw-r--r-- | src/libzisp/gc.zig | 30 |
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)); } |
