| ... | @@ -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 { |
| 59 | fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { | 59 | fn parseObject(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { |
| 60 | _ = try p.eatByte('{') orelse return null; | 60 | _ = try p.eatByte('{') orelse return null; |
| 61 | | 61 | |
| | 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); |
| 64 | | 66 | |
| 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 { |
| 86 | fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { | 88 | fn parseArray(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { |
| 87 | _ = try p.eatByte('[') orelse return null; | 89 | _ = try p.eatByte('[') orelse return null; |
| 88 | | 90 | |
| | 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); |
| 91 | | 95 | |
| 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; |
| 95 | | 99 | |
| 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 | } |
| 108 | | 112 | |
| 109 | fn parseString(alloc: std.mem.Allocator, p: *Parser) anyerror!?StringIndex { | 113 | fn 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(); |
| 113 | | 117 | |
| ... | @@ -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 | } |
| 149 | | 153 | |
| 150 | fn parseNumber(alloc: std.mem.Allocator, p: *Parser) anyerror!?ValueIndex { | 154 | fn 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(); |
| 154 | | 158 | |