config: dupe map keys
I didn't do an exhaustive search, but it seems that the managed hashmaps only allocates space for the structure of the map itself, not its keys or values. This mostly makes sense, but it also means that this was only working due to the fact that I am currently not freeing the input buffer until after iterating through the parse result. Looking through this, I'm also reasonably surprised by how many times this is assigned in the normal parsing vs the flow parsing. There is a lot more repetition in the code of the normal parser, I think because it does not have a granular state machine. It may be worth revisiting the structure to see if a more detailed state machine, like the one used for parsing the flow-style objects, would reduce the amount of code repetition here. I suspect it certainly could be better than it currently is, since it seems unlikely that there really are four different scenarios where we need to be parsing a dictionary key. Taking a quick glance at it, it looks like I could be taking better advantage of the flipflop loop on indent as well as dedent. This might be a bit less efficient due to essentially being less loop unrolling, but it would also potentially make more maintainable code by having less manual repetition.
This commit is contained in:
parent
a9d179acc1
commit
4fe340ea9b
@ -727,7 +727,7 @@ pub const Parser = struct {
|
||||
// key somewhere until we can consume the
|
||||
// value. More parser state to lug along.
|
||||
|
||||
dangling_key = pair.key;
|
||||
dangling_key = try arena_alloc.dupe(u8, pair.key);
|
||||
state = .value;
|
||||
},
|
||||
.scalar => |str| {
|
||||
@ -897,7 +897,7 @@ pub const Parser = struct {
|
||||
|
||||
switch (pair.val) {
|
||||
.empty => {
|
||||
dangling_key = pair.key;
|
||||
dangling_key = try arena_alloc.dupe(u8, pair.key);
|
||||
expect_shift = .indent;
|
||||
},
|
||||
.scalar => |str| try new_map.map.put(pair.key, try Value.fromScalar(arena_alloc, str)),
|
||||
@ -995,7 +995,7 @@ pub const Parser = struct {
|
||||
.none, .dedent => switch (pair.val) {
|
||||
.empty => {
|
||||
expect_shift = .indent;
|
||||
dangling_key = pair.key;
|
||||
dangling_key = try arena_alloc.dupe(u8, pair.key);
|
||||
},
|
||||
.scalar => |str| try putMap(map, pair.key, try Value.fromScalar(arena_alloc, str), self.dupe_behavior),
|
||||
.line_string, .space_string => |str| try putMap(map, pair.key, try Value.fromString(arena_alloc, str), self.dupe_behavior),
|
||||
@ -1013,7 +1013,7 @@ pub const Parser = struct {
|
||||
switch (pair.val) {
|
||||
.empty => {
|
||||
expect_shift = .indent;
|
||||
dangling_key = pair.key;
|
||||
dangling_key = try arena_alloc.dupe(u8, pair.key);
|
||||
},
|
||||
.scalar => |str| try new_map.map.put(pair.key, try Value.fromScalar(arena_alloc, str)),
|
||||
.line_string, .space_string => |str| try new_map.map.put(pair.key, try Value.fromString(arena_alloc, str)),
|
||||
@ -1334,7 +1334,7 @@ pub const FlowParser = struct {
|
||||
.consuming_map_key => switch (char) {
|
||||
':' => {
|
||||
const tip = try getStackTip(self.stack);
|
||||
dangling_key = self.buffer[tip.item_start..idx];
|
||||
dangling_key = try self.alloc.dupe(u8, self.buffer[tip.item_start..idx]);
|
||||
|
||||
self.state = .want_map_value;
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user