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;