diff options
Diffstat (limited to 'core/encoding/json')
| -rw-r--r-- | core/encoding/json/marshal.odin | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index e53ab9a7c..80b2e4dd4 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -275,27 +275,23 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: map_cap := uintptr(runtime.map_cap(m^)) ks, vs, hs, _, _ := runtime.map_kvh_data_dynamic(m^, info.map_info) - if opt.sort_maps_by_key { - Entry :: struct { - key: string, - value: any, - } - - // If we are sorting the map by key, then we temp alloc an array - // and sort it, then output the result. - sorted := make([dynamic]Entry, 0, map_cap, context.temp_allocator) + if !opt.sort_maps_by_key { + i := 0 for bucket_index in 0..<map_cap { runtime.map_hash_is_valid(hs[bucket_index]) or_continue + opt_write_iteration(w, opt, i) or_return + i += 1 + key := rawptr(runtime.map_cell_index_dynamic(ks, info.map_info.ks, bucket_index)) value := rawptr(runtime.map_cell_index_dynamic(vs, info.map_info.vs, bucket_index)) - name: string // check for string type { v := any{key, info.key.id} ti := runtime.type_info_base(type_info_of(v.id)) a := any{v.data, ti.id} + name: string #partial switch info in ti.variant { case runtime.Type_Info_String: @@ -303,38 +299,35 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: case string: name = s case cstring: name = string(s) } + opt_write_key(w, opt, name) or_return case: return .Unsupported_Type } } - append(&sorted, Entry { key = name, value = any{value, info.value.id}}) - } - - slice.sort_by(sorted[:], proc(i, j: Entry) -> bool { return i.key < j.key }) - - for s, i in sorted { - opt_write_iteration(w, opt, i) or_return - opt_write_key(w, opt, s.key) or_return - marshal_to_writer(w, s.value, opt) or_return + marshal_to_writer(w, any{value, info.value.id}, opt) or_return } } else { - i := 0 + Entry :: struct { + key: string, + value: any, + } + + // If we are sorting the map by key, then we temp alloc an array + // and sort it, then output the result. + sorted := make([dynamic]Entry, 0, map_cap, context.temp_allocator) for bucket_index in 0..<map_cap { runtime.map_hash_is_valid(hs[bucket_index]) or_continue - opt_write_iteration(w, opt, i) or_return - i += 1 - key := rawptr(runtime.map_cell_index_dynamic(ks, info.map_info.ks, bucket_index)) value := rawptr(runtime.map_cell_index_dynamic(vs, info.map_info.vs, bucket_index)) + name: string // check for string type { v := any{key, info.key.id} ti := runtime.type_info_base(type_info_of(v.id)) a := any{v.data, ti.id} - name: string #partial switch info in ti.variant { case runtime.Type_Info_String: @@ -342,13 +335,20 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: case string: name = s case cstring: name = string(s) } - opt_write_key(w, opt, name) or_return case: return .Unsupported_Type } } - marshal_to_writer(w, any{value, info.value.id}, opt) or_return + append(&sorted, Entry { key = name, value = any{value, info.value.id}}) + } + + slice.sort_by(sorted[:], proc(i, j: Entry) -> bool { return i.key < j.key }) + + for s, i in sorted { + opt_write_iteration(w, opt, i) or_return + opt_write_key(w, opt, s.key) or_return + marshal_to_writer(w, s.value, opt) or_return } } } |