summaryrefslogtreecommitdiff
path: root/src/runtime/c/gu/map.c
diff options
context:
space:
mode:
authorkrangelov <kr.angelov@gmail.com>2021-01-20 20:15:40 +0100
committerkrangelov <kr.angelov@gmail.com>2021-01-20 20:15:40 +0100
commitbac619f025e8b3680e93cc64eddd9cebfc350249 (patch)
treee689b17db8dafadf077c4904a67325b1b5b848d8 /src/runtime/c/gu/map.c
parentf3a8658cc1ed5b2721ee9d3f670f6b9a49f0f049 (diff)
fix gu_map_next
Diffstat (limited to 'src/runtime/c/gu/map.c')
-rw-r--r--src/runtime/c/gu/map.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/runtime/c/gu/map.c b/src/runtime/c/gu/map.c
index dc19bc932..ebd917b3e 100644
--- a/src/runtime/c/gu/map.c
+++ b/src/runtime/c/gu/map.c
@@ -322,7 +322,7 @@ gu_map_iter(GuMap* map, GuMapItor* itor, GuExn* err)
}
GU_API bool
-gu_map_next(GuMap* map, size_t* pi, void** pkey, void* pvalue)
+gu_map_next(GuMap* map, size_t* pi, void* pkey, void* pvalue)
{
while (*pi < map->data.n_entries) {
if (gu_map_entry_is_free(map, &map->data, *pi)) {
@@ -330,14 +330,17 @@ gu_map_next(GuMap* map, size_t* pi, void** pkey, void* pvalue)
continue;
}
- *pkey = &map->data.keys[*pi * map->key_size];
if (map->hasher == gu_addr_hasher) {
- *pkey = *(void**) *pkey;
+ *((void**) pkey) = *((void**) &map->data.keys[*pi * sizeof(void*)]);
+ } else if (map->hasher == gu_word_hasher) {
+ *((GuWord*) pkey) = *((GuWord*) &map->data.keys[*pi * sizeof(GuWord)]);
} else if (map->hasher == gu_string_hasher) {
- *pkey = *(void**) *pkey;
- }
+ *((GuString*) pkey) = *((GuString*) &map->data.keys[*pi * sizeof(GuString)]);
+ } else {
+ memcpy(pkey, &map->data.keys[*pi * map->key_size], map->key_size);
+ }
- memcpy(pvalue, &map->data.values[*pi * map->cell_size],
+ memcpy(pvalue, &map->data.values[*pi * map->cell_size],
map->value_size);
(*pi)++;