diff options
| author | gingerBill <bill@gingerbill.org> | 2022-11-08 11:50:55 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-11-08 11:50:55 +0000 |
| commit | 6dd4d1a9244cb7ba1c819e457d7aef493d5eb482 (patch) | |
| tree | ee9fb11f7f348eee633ed534624911d34a6efc26 /core/encoding | |
| parent | d77269dee2abe3104df0c36bdffe157a079bec7c (diff) | |
Correct reflection usage of maps
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..79a92a73e 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..8edf1a016 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(raw_map, t.map_info, key_ptr, map_backing_value.data) if set_ptr == nil { delete(key, p.allocator) } |