authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-05-27 23:06:24 -07:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2024-05-27 23:06:24 -07:00
log2ddcf31902337ca9452300c52201bdb49d591317
treed0b9dabfe7766591fccaebf70c21424b66792f67
parenta47e003501b118d3e83e9e53a59af8e0917075e2

use StackFallbackAllocator for less heap alloc on small objects


1 files changed, 10 insertions(+), 6 deletions(-)

json.zig+10-6
......@@ -59,8 +59,10 @@ fn parseValue(alloc: std.mem.Allocator, p: *Parser) anyerror!ValueIndex {
5959fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
6060 _ = try p.eatByte('{') orelse return null;
6161
62 var sfa = std.heap.stackFallback(std.mem.page_size, alloc);
63 const alloc_local = sfa.get();
6264 var members = ObjectHashMap{};
63 defer members.deinit(alloc);
65 defer members.deinit(alloc_local);
6466
6567 while (true) {
6668 try parseWs(p);
......@@ -71,7 +73,7 @@ fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
7173 _ = try p.eatByte(':') orelse return error.JsonExpectedObjectColon;
7274 try parseWs(p);
7375 const value = try parseValue(alloc, p);
74 try members.put(alloc, key, value);
76 try members.put(alloc_local, key, value);
7577 try parseWs(p);
7678 _ = try p.eatByte(',') orelse {
7779 _ = try p.eatByte('}') orelse return error.JsonExpectedTODO;
......@@ -86,15 +88,17 @@ fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
8688fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
8789 _ = try p.eatByte('[') orelse return null;
8890
91 var sfa = std.heap.stackFallback(std.mem.page_size, alloc);
92 const alloc_local = sfa.get();
8993 var elements = std.ArrayListUnmanaged(ValueIndex){};
90 defer elements.deinit(alloc);
94 defer elements.deinit(alloc_local);
9195
9296 while (true) {
9397 try parseWs(p);
9498 if (try p.eatByte(']')) |_| break;
9599
96100 const elem = try parseValue(alloc, p);
97 try elements.append(alloc, elem);
101 try elements.append(alloc_local, elem);
98102 try parseWs(p);
99103 _ = try p.eatByte(',') orelse {
100104 _ = try p.eatByte(']') orelse return error.JsonExpectedTODO;
......@@ -107,7 +111,7 @@ fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
107111}
108112
109113fn parseString(alloc: std.mem.Allocator, p: *Parser) anyerror!?StringIndex {
110 var stack_fallback = std.heap.stackFallback(512, alloc);
114 var stack_fallback = std.heap.stackFallback(std.mem.page_size, alloc);
111115 var characters = std.ArrayList(u8).init(stack_fallback.get());
112116 defer characters.deinit();
113117
......@@ -148,7 +152,7 @@ fn parseString(alloc: std.mem.Allocator, p: *Parser) anyerror!?StringIndex {
148152}
149153
150154fn parseNumber(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
151 var stack_fallback = std.heap.stackFallback(512, alloc);
155 var stack_fallback = std.heap.stackFallback(std.mem.page_size, alloc);
152156 var characters = std.ArrayList(u8).init(stack_fallback.get());
153157 defer characters.deinit();
154158