From 59a6e3cfdd855df7c239a2ec13cd70c24dd1d0a2 Mon Sep 17 00:00:00 2001 From: krangelov Date: Fri, 30 Aug 2019 13:31:19 +0200 Subject: [PATCH] fix gu_map_next --- src/runtime/c/gu/map.c | 20 ++++++++++++-------- src/runtime/c/gu/map.h | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/runtime/c/gu/map.c b/src/runtime/c/gu/map.c index be7228b74..dc19bc932 100644 --- a/src/runtime/c/gu/map.c +++ b/src/runtime/c/gu/map.c @@ -322,21 +322,25 @@ gu_map_iter(GuMap* map, GuMapItor* itor, GuExn* err) } GU_API bool -gu_map_next(GuMap* map, size_t i, const void** pkey, void** pvalue) +gu_map_next(GuMap* map, size_t* pi, void** pkey, void* pvalue) { - while (i < map->data.n_entries) { - if (gu_map_entry_is_free(map, &map->data, i)) { - i++; + while (*pi < map->data.n_entries) { + if (gu_map_entry_is_free(map, &map->data, *pi)) { + (*pi)++; continue; } - *pkey = &map->data.keys[i * map->key_size]; - *pvalue = &map->data.values[i * map->cell_size]; + *pkey = &map->data.keys[*pi * map->key_size]; if (map->hasher == gu_addr_hasher) { - *pkey = *(const void* const*) *pkey; + *pkey = *(void**) *pkey; } else if (map->hasher == gu_string_hasher) { - *pkey = *(GuString*) *pkey; + *pkey = *(void**) *pkey; } + + memcpy(pvalue, &map->data.values[*pi * map->cell_size], + map->value_size); + + (*pi)++; return true; } diff --git a/src/runtime/c/gu/map.h b/src/runtime/c/gu/map.h index b0fc17303..cc91a27f7 100644 --- a/src/runtime/c/gu/map.h +++ b/src/runtime/c/gu/map.h @@ -75,7 +75,7 @@ GU_API_DECL void gu_map_iter(GuMap* ht, GuMapItor* itor, GuExn* err); GU_API bool -gu_map_next(GuMap* ht, size_t i, const void** pkey, void** pvalue); +gu_map_next(GuMap* map, size_t* pi, void** pkey, void* pvalue); typedef GuMap GuIntMap;