summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTaylan Kammer <taylan.kammer@gmail.com>2026-06-06 18:40:31 +0200
committerTaylan Kammer <taylan.kammer@gmail.com>2026-06-06 18:40:31 +0200
commita3f25c0232283a6144646ca758ae2e166681bbb8 (patch)
treeecae1bf115aaaef8ac98890b0246fb3a061c8f60 /src
parent63de692f2f1403beca3c51a6bba505a1f5d51ab1 (diff)
Parser can return non-interned istr.
Diffstat (limited to 'src')
-rw-r--r--src/zisp/gc/IstrSet.zig16
-rw-r--r--src/zisp/io/Parser.zig21
-rw-r--r--src/zisp/value/istr.zig10
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);
}