From a3f25c0232283a6144646ca758ae2e166681bbb8 Mon Sep 17 00:00:00 2001 From: Taylan Kammer Date: Sat, 6 Jun 2026 18:40:31 +0200 Subject: Parser can return non-interned istr. --- src/zisp/gc/IstrSet.zig | 16 ++++------------ src/zisp/io/Parser.zig | 21 +++++++++++++++------ src/zisp/value/istr.zig | 10 +++++++++- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/zisp/gc/IstrSet.zig b/src/zisp/gc/IstrSet.zig index 4357608..bc345f2 100644 --- a/src/zisp/gc/IstrSet.zig +++ b/src/zisp/gc/IstrSet.zig @@ -69,15 +69,15 @@ pub fn getOrNew(self: *Set, s: []const u8) !IstrPtr { return self.addStdlib(s); } std.debug.assert(s.len < 256); - return self.getOrNewOrPut(s, null); + return self.getOrPutOrNew(s, null); } /// Get the canonical istr with the same contents, or store this one as it. pub fn getOrPut(self: *Set, istr: IstrPtr) !IstrPtr { - return self.getOrNewOrPut(istr.str(), istr); + return self.getOrPutOrNew(istr.str(), istr); } -fn getOrNewOrPut(self: *Set, s: []const u8, existing: ?IstrPtr) !IstrPtr { +fn getOrPutOrNew(self: *Set, s: []const u8, ptr: ?IstrPtr) !IstrPtr { if (self.used_buckets > self.used_threshold) { try self.resize(); } @@ -93,7 +93,7 @@ fn getOrNewOrPut(self: *Set, s: []const u8, existing: ?IstrPtr) !IstrPtr { const bucket = &self.buckets[idx]; if (bucket.empty()) { self.used_buckets += 1; - const istr = existing orelse try self.newIstr(s); + const istr = ptr orelse try value.istr.new(self.alloc, s); bucket.putIstrPtr(istr); bucket.fp = fp; return istr; @@ -121,14 +121,6 @@ fn resize(self: *Set) !void { } } -fn newIstr(self: *Set, s: []const u8) !IstrPtr { - const algn = std.mem.Alignment.of(IstrPtr); - const size = @sizeOf(IstrHead) + s.len; - const istr: IstrPtr = @ptrCast(try self.alloc.alignedAlloc(u8, algn, size)); - istr.putStr(s); - return istr; -} - fn strHash(s: []const u8) u64 { return std.hash_map.hashString(s); } diff --git a/src/zisp/io/Parser.zig b/src/zisp/io/Parser.zig index 4fdde8b..0b1a6c7 100644 --- a/src/zisp/io/Parser.zig +++ b/src/zisp/io/Parser.zig @@ -192,12 +192,21 @@ fn addUnicode(p: *Parser, uc: u21) !void { fn getCharsAsString(p: *Parser) !Value { defer p.chars.clearRetainingCapacity(); const s = p.chars.items; - return if (value.sstr.isValidSstr(s)) - value.sstr.pack(s) - else if (value.istr.isValidIstr(s) and p.istr_set != null) - value.istr.getOrNewInSet(p.istr_set.?, s) - else - value.array.newString(p.alloc, s); + if (value.sstr.isValidSstr(s)) { + return value.sstr.pack(s); + } else if (value.istr.isValidIstr(s)) { + return p.getIstr(s); + } else { + return value.array.newString(p.alloc, s); + } +} + +fn getIstr(p: *Parser, s: []const u8) !Value { + if (p.istr_set) |set| { + return value.istr.getOrNewInSet(set, s); + } else { + return value.istr.pack(try value.istr.new(p.alloc, s)); + } } fn getCharsAsRune(p: *Parser) Value { diff --git a/src/zisp/value/istr.zig b/src/zisp/value/istr.zig index 9156606..90eccb6 100644 --- a/src/zisp/value/istr.zig +++ b/src/zisp/value/istr.zig @@ -58,7 +58,15 @@ fn assertValidIstr(s: []const u8) void { } } -fn pack(istr: IstrPtr) Value { +pub fn new(alloc: Alloc, s: []const u8) !IstrPtr { + const algn = std.mem.Alignment.of(IstrPtr); + const size = @sizeOf(IstrHead) + s.len; + const istr: IstrPtr = @ptrCast(try alloc.alignedAlloc(u8, algn, size)); + istr.putStr(s); + return istr; +} + +pub fn pack(istr: IstrPtr) Value { return value.ptr.pack(@ptrCast(istr), .istr); } -- cgit v1.2.3