Commit 94af9155 by Patrick Steinhardt

map: remove `*map_free` macros

The `map_free` functions were not implemented as functions but instead
as macros which also set the map to NULL. While this is most certainly
sensible in most cases, we should prefer the more obvious behavior,
namingly leaving the map pointer intact.

Furthermore, this macro has been refactored incorrectly during the
map-refactorings: the two statements are not actually grouped together
by a `do { ... } while (0)` block, as it is required for macros to
match the behavior of functions more closely. This has led to at least
one subtle nesting error in `pack-objects.c`. The following code block

```
    if (pb->object_ix)
        git_oidmap_free(pb->object_ix);
```

would be expanded to

```
    if (pb->object_ix)
        git_oidmap__free(pb->object_ix); pb->object_ix = NULL;
```

which is not what one woudl expect. While it is not a bug here as it
would simply become a no-op, the wrong implementation could lead to bugs
in other occasions.

Fix this by simply removing the macro altogether and replacing it with
real function calls. This leaves the burden of setting the pointer to
NULL afterwards to the caller, but this is actually expected and behaves
like other `free` functions.
parent 77c8ee74
...@@ -99,7 +99,7 @@ void git_idxmap_icase_resize(git_idxmap_icase *map, size_t size) ...@@ -99,7 +99,7 @@ void git_idxmap_icase_resize(git_idxmap_icase *map, size_t size)
kh_resize(idxicase, map, size); kh_resize(idxicase, map, size);
} }
void git_idxmap__free(git_idxmap *map) void git_idxmap_free(git_idxmap *map)
{ {
kh_destroy(idx, map); kh_destroy(idx, map);
} }
......
...@@ -39,8 +39,7 @@ int git_idxmap_has_data(git_idxmap *map, size_t idx); ...@@ -39,8 +39,7 @@ int git_idxmap_has_data(git_idxmap *map, size_t idx);
void git_idxmap_resize(git_idxmap *map, size_t size); void git_idxmap_resize(git_idxmap *map, size_t size);
void git_idxmap_icase_resize(git_idxmap_icase *map, size_t size); void git_idxmap_icase_resize(git_idxmap_icase *map, size_t size);
#define git_idxmap_free(h) git_idxmap__free(h); (h) = NULL void git_idxmap_free(git_idxmap *map);
void git_idxmap__free(git_idxmap *map);
void git_idxmap_clear(git_idxmap *map); void git_idxmap_clear(git_idxmap *map);
void git_idxmap_delete_at(git_idxmap *map, size_t idx); void git_idxmap_delete_at(git_idxmap *map, size_t idx);
......
...@@ -14,7 +14,7 @@ git_offmap *git_offmap_alloc(void) ...@@ -14,7 +14,7 @@ git_offmap *git_offmap_alloc(void)
return kh_init(off); return kh_init(off);
} }
void git_offmap__free(git_offmap *map) void git_offmap_free(git_offmap *map)
{ {
kh_destroy(off, map); kh_destroy(off, map);
} }
......
...@@ -21,8 +21,7 @@ __KHASH_TYPE(off, git_off_t, void *) ...@@ -21,8 +21,7 @@ __KHASH_TYPE(off, git_off_t, void *)
typedef khash_t(off) git_offmap; typedef khash_t(off) git_offmap;
git_offmap *git_offmap_alloc(void); git_offmap *git_offmap_alloc(void);
#define git_offmap_free(h) git_offmap__free(h); (h) = NULL void git_offmap_free(git_offmap *map);
void git_offmap__free(git_offmap *map);
void git_offmap_clear(git_offmap *map); void git_offmap_clear(git_offmap *map);
size_t git_offmap_num_entries(git_offmap *map); size_t git_offmap_num_entries(git_offmap *map);
......
...@@ -21,7 +21,7 @@ git_oidmap *git_oidmap_alloc() ...@@ -21,7 +21,7 @@ git_oidmap *git_oidmap_alloc()
return kh_init(oid); return kh_init(oid);
} }
void git_oidmap__free(git_oidmap *map) void git_oidmap_free(git_oidmap *map)
{ {
kh_destroy(oid, map); kh_destroy(oid, map);
} }
......
...@@ -21,8 +21,7 @@ __KHASH_TYPE(oid, const git_oid *, void *) ...@@ -21,8 +21,7 @@ __KHASH_TYPE(oid, const git_oid *, void *)
typedef khash_t(oid) git_oidmap; typedef khash_t(oid) git_oidmap;
git_oidmap *git_oidmap_alloc(void); git_oidmap *git_oidmap_alloc(void);
#define git_oidmap_free(h) git_oidmap__free(h); (h) = NULL void git_oidmap_free(git_oidmap *map);
void git_oidmap__free(git_oidmap *map);
void git_oidmap_clear(git_oidmap *map); void git_oidmap_clear(git_oidmap *map);
size_t git_oidmap_size(git_oidmap *map); size_t git_oidmap_size(git_oidmap *map);
......
...@@ -19,7 +19,7 @@ int git_strmap_alloc(git_strmap **map) ...@@ -19,7 +19,7 @@ int git_strmap_alloc(git_strmap **map)
return 0; return 0;
} }
void git_strmap__free(git_strmap *map) void git_strmap_free(git_strmap *map)
{ {
kh_destroy(str, map); kh_destroy(str, map);
} }
......
...@@ -21,9 +21,7 @@ typedef khash_t(str) git_strmap; ...@@ -21,9 +21,7 @@ typedef khash_t(str) git_strmap;
typedef khiter_t git_strmap_iter; typedef khiter_t git_strmap_iter;
int git_strmap_alloc(git_strmap **map); int git_strmap_alloc(git_strmap **map);
void git_strmap_free(git_strmap *map);
#define git_strmap_free(h) git_strmap__free(h); (h) = NULL
void git_strmap__free(git_strmap *map);
void git_strmap_clear(git_strmap *map); void git_strmap_clear(git_strmap *map);
size_t git_strmap_num_entries(git_strmap *map); size_t git_strmap_num_entries(git_strmap *map);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment