diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2022-11-17 15:29:28 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-17 15:29:28 +0000 |
| commit | 15bbdb2030510b9d15918536c7da8af3a376c0be (patch) | |
| tree | 60210e6a4ea6d6a34f286f1f4770e4f6fbd2737d /core/encoding | |
| parent | 48c9c1682c347adb7e743a6a6f8c70f08420c197 (diff) | |
| parent | 3949e2220feca6c718a27ecc0fd5cb1cde56f7b7 (diff) | |
Merge pull request #2181 from odin-lang/map-dev
New `map` internals
Diffstat (limited to 'core/encoding')
| -rw-r--r-- | core/encoding/json/marshal.odin | 25 | ||||
| -rw-r--r-- | core/encoding/json/unmarshal.odin | 9 |
2 files changed, 14 insertions, 20 deletions
diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 10fb4c348..1dadc8ef0 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -257,21 +257,18 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: opt_write_start(w, opt, '{') or_return if m != nil { - if info.generated_struct == nil { + if info.map_info == nil { return .Unsupported_Type } - entries := &m.entries - gs := runtime.type_info_base(info.generated_struct).variant.(runtime.Type_Info_Struct) - ed := runtime.type_info_base(gs.types[1]).variant.(runtime.Type_Info_Dynamic_Array) - entry_type := ed.elem.variant.(runtime.Type_Info_Struct) - entry_size := ed.elem_size - - for i in 0..<entries.len { - opt_write_iteration(w, opt, i) or_return + map_cap := uintptr(runtime.map_cap(m^)) + ks, vs, hs, _, _ := runtime.map_kvh_data_dynamic(m^, info.map_info) + for bucket_index in 0..<map_cap { + if !runtime.map_hash_is_valid(hs[bucket_index]) { + continue + } - data := uintptr(entries.data) + uintptr(i*entry_size) - key := rawptr(data + entry_type.offsets[2]) - value := rawptr(data + entry_type.offsets[3]) + 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)) // check for string type { @@ -281,13 +278,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: name: string #partial switch info in ti.variant { - case runtime.Type_Info_String: + case runtime.Type_Info_String: switch s in a { case string: name = s case cstring: name = string(s) } opt_write_key(w, opt, name) or_return - + case: return .Unsupported_Type } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 19288a294..11cae6160 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -399,12 +399,10 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm return UNSUPPORTED_TYPE } raw_map := (^mem.Raw_Map)(v.data) - if raw_map.entries.allocator.procedure == nil { - raw_map.entries.allocator = p.allocator + if raw_map.allocator.procedure == nil { + raw_map.allocator = p.allocator } - header := runtime.__get_map_header_table_runtime(t) - elem_backing := bytes_make(t.value.size, t.value.align, p.allocator) or_return defer delete(elem_backing, p.allocator) @@ -421,7 +419,6 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm return err } - key_hash := runtime.default_hasher_string(&key, 0) key_ptr := rawptr(&key) key_cstr: cstring @@ -430,7 +427,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm key_ptr = &key_cstr } - set_ptr := runtime.__dynamic_map_set(raw_map, header, key_hash, key_ptr, map_backing_value.data) + set_ptr := runtime.__dynamic_map_set_without_hash(raw_map, t.map_info, key_ptr, map_backing_value.data) if set_ptr == nil { delete(key, p.allocator) } |