aboutsummaryrefslogtreecommitdiff
path: root/core/encoding
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-11-08 11:50:55 +0000
committergingerBill <bill@gingerbill.org>2022-11-08 11:50:55 +0000
commit6dd4d1a9244cb7ba1c819e457d7aef493d5eb482 (patch)
treeee9fb11f7f348eee633ed534624911d34a6efc26 /core/encoding
parentd77269dee2abe3104df0c36bdffe157a079bec7c (diff)
Correct reflection usage of maps
Diffstat (limited to 'core/encoding')
-rw-r--r--core/encoding/json/marshal.odin25
-rw-r--r--core/encoding/json/unmarshal.odin9
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)
}