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 {...@@ -59,8 +59,10 @@ fn parseValue(alloc: std.mem.Allocator, p: *Parser) anyerror!ValueIndex {
59fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {59fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
60 _ = try p.eatByte('{') orelse return null;60 _ = try p.eatByte('{') orelse return null;
6161
62 var sfa = std.heap.stackFallback(std.mem.page_size, alloc);
63 const alloc_local = sfa.get();
62 var members = ObjectHashMap{};64 var members = ObjectHashMap{};
63 defer members.deinit(alloc);65 defer members.deinit(alloc_local);
6466
65 while (true) {67 while (true) {
66 try parseWs(p);68 try parseWs(p);
...@@ -71,7 +73,7 @@ fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {...@@ -71,7 +73,7 @@ fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
71 _ = try p.eatByte(':') orelse return error.JsonExpectedObjectColon;73 _ = try p.eatByte(':') orelse return error.JsonExpectedObjectColon;
72 try parseWs(p);74 try parseWs(p);
73 const value = try parseValue(alloc, p);75 const value = try parseValue(alloc, p);
74 try members.put(alloc, key, value);76 try members.put(alloc_local, key, value);
75 try parseWs(p);77 try parseWs(p);
76 _ = try p.eatByte(',') orelse {78 _ = try p.eatByte(',') orelse {
77 _ = try p.eatByte('}') orelse return error.JsonExpectedTODO;79 _ = try p.eatByte('}') orelse return error.JsonExpectedTODO;
...@@ -86,15 +88,17 @@ fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {...@@ -86,15 +88,17 @@ fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
86fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {88fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
87 _ = try p.eatByte('[') orelse return null;89 _ = try p.eatByte('[') orelse return null;
8890
91 var sfa = std.heap.stackFallback(std.mem.page_size, alloc);
92 const alloc_local = sfa.get();
89 var elements = std.ArrayListUnmanaged(ValueIndex){};93 var elements = std.ArrayListUnmanaged(ValueIndex){};
90 defer elements.deinit(alloc);94 defer elements.deinit(alloc_local);
9195
92 while (true) {96 while (true) {
93 try parseWs(p);97 try parseWs(p);
94 if (try p.eatByte(']')) |_| break;98 if (try p.eatByte(']')) |_| break;
9599
96 const elem = try parseValue(alloc, p);100 const elem = try parseValue(alloc, p);
97 try elements.append(alloc, elem);101 try elements.append(alloc_local, elem);
98 try parseWs(p);102 try parseWs(p);
99 _ = try p.eatByte(',') orelse {103 _ = try p.eatByte(',') orelse {
100 _ = try p.eatByte(']') orelse return error.JsonExpectedTODO;104 _ = try p.eatByte(']') orelse return error.JsonExpectedTODO;
...@@ -107,7 +111,7 @@ fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {...@@ -107,7 +111,7 @@ fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {
107}111}
108112
109fn parseString(alloc: std.mem.Allocator, p: *Parser) anyerror!?StringIndex {113fn 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);
111 var characters = std.ArrayList(u8).init(stack_fallback.get());115 var characters = std.ArrayList(u8).init(stack_fallback.get());
112 defer characters.deinit();116 defer characters.deinit();
113117
...@@ -148,7 +152,7 @@ fn parseString(alloc: std.mem.Allocator, p: *Parser) anyerror!?StringIndex {...@@ -148,7 +152,7 @@ fn parseString(alloc: std.mem.Allocator, p: *Parser) anyerror!?StringIndex {
148}152}
149153
150fn parseNumber(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex {154fn 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);
152 var characters = std.ArrayList(u8).init(stack_fallback.get());156 var characters = std.ArrayList(u8).init(stack_fallback.get());
153 defer characters.deinit();157 defer characters.deinit();
154158