From 617ddc62aa4d3153850362526069b85bfaf5e59e Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 31 Jan 2026 15:31:15 +0900 Subject: use reference counting to manage JSON value lifetime --- src/jv/parse.zig | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'src/jv/parse.zig') diff --git a/src/jv/parse.zig b/src/jv/parse.zig index dc3fcef..3d90be5 100644 --- a/src/jv/parse.zig +++ b/src/jv/parse.zig @@ -1,5 +1,7 @@ const std = @import("std"); const Value = @import("./value.zig").Value; +const Array = @import("./value.zig").Array; +const Object = @import("./value.zig").Object; pub const Parsed = struct { value: Value, @@ -7,6 +9,7 @@ pub const Parsed = struct { allocator: std.mem.Allocator, pub fn deinit(self: *const Parsed) void { + self.value.deinit(self.allocator); const arena = self.arena; const allocator = self.allocator; arena.deinit(); @@ -16,9 +19,36 @@ pub const Parsed = struct { pub fn parse(allocator: std.mem.Allocator, input: []const u8) !Parsed { const internal = try std.json.parseFromSlice(std.json.Value, allocator, input, .{}); + const value = try convertValue(allocator, internal.value); return .{ - .value = .{ ._internal = internal.value }, + .value = value, .arena = internal.arena, .allocator = allocator, }; } + +fn convertValue(allocator: std.mem.Allocator, v: std.json.Value) !Value { + return switch (v) { + .null => Value.null, + .bool => |b| Value.initBool(b), + .integer => |i| Value.initInteger(i), + .float => |f| Value.initFloat(f), + .string => |s| Value.initString(s), + .array => |a| blk: { + var arr = try Array.init(allocator); + for (a.items) |item| { + try arr.append(allocator, try convertValue(allocator, item)); + } + break :blk Value.initArray(arr); + }, + .object => |o| blk: { + var obj = try Object.init(allocator); + var it = o.iterator(); + while (it.next()) |entry| { + try obj.set(allocator, entry.key_ptr.*, try convertValue(allocator, entry.value_ptr.*)); + } + break :blk Value.initObject(obj); + }, + .number_string => unreachable, + }; +} -- cgit v1.3-1-g0d28