diff options
| author | r00ster91 <r00ster91@proton.me> | 2023-03-08 19:25:53 +0100 |
|---|---|---|
| committer | r00ster91 <r00ster91@proton.me> | 2023-03-08 19:25:53 +0100 |
| commit | 7e3591bedd41bde8bcca892885376e2f4a8163a3 (patch) | |
| tree | 40a84c8ad65de1247bb36566fc21f1dfb56581fe /lib/std/json.zig | |
| parent | ecc0108cea97772b6e921b36d8fdc8f90d5fc6cb (diff) | |
| download | zig-7e3591bedd41bde8bcca892885376e2f4a8163a3.tar.gz zig-7e3591bedd41bde8bcca892885376e2f4a8163a3.zip | |
std.json.parseInternal: use switches instead of ifs
Diffstat (limited to 'lib/std/json.zig')
| -rw-r--r-- | lib/std/json.zig | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/lib/std/json.zig b/lib/std/json.zig index 0cce71b1e6..9d24ebaff4 100644 --- a/lib/std/json.zig +++ b/lib/std/json.zig @@ -1534,30 +1534,25 @@ fn parseInternal( child_options.allow_trailing_data = true; var found = false; inline for (structInfo.fields, 0..) |field, i| { - // TODO: using switches here segfault the compiler (#2727?) - if ((stringToken.escapes == .None and mem.eql(u8, field.name, key_source_slice)) or (stringToken.escapes == .Some and (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)))) { - // if (switch (stringToken.escapes) { - // .None => mem.eql(u8, field.name, key_source_slice), - // .Some => (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)), - // }) { + if (switch (stringToken.escapes) { + .None => mem.eql(u8, field.name, key_source_slice), + .Some => (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)), + }) { if (fields_seen[i]) { - // switch (options.duplicate_field_behavior) { - // .UseFirst => {}, - // .Error => {}, - // .UseLast => {}, - // } - if (options.duplicate_field_behavior == .UseFirst) { - // unconditonally ignore value. for comptime fields, this skips check against default_value - parseFree(field.type, try parse(field.type, tokens, child_options), child_options); - found = true; - break; - } else if (options.duplicate_field_behavior == .Error) { - return error.DuplicateJSONField; - } else if (options.duplicate_field_behavior == .UseLast) { - if (!field.is_comptime) { - parseFree(field.type, @field(r, field.name), child_options); - } - fields_seen[i] = false; + switch (options.duplicate_field_behavior) { + .UseFirst => { + // unconditonally ignore value. for comptime fields, this skips check against default_value + parseFree(field.type, try parse(field.type, tokens, child_options), child_options); + found = true; + break; + }, + .Error => return error.DuplicateJSONField, + .UseLast => { + if (!field.is_comptime) { + parseFree(field.type, @field(r, field.name), child_options); + } + fields_seen[i] = false; + }, } } if (field.is_comptime) { |
