From b603404487e0daa101deacbe346aa2fc9ee255c7 Mon Sep 17 00:00:00 2001 From: Felipe Oliveira Carvalho Date: Thu, 11 Dec 2014 12:23:02 -0300 Subject: GA_DEEP_CLEAR macro for garray memory deallocation Used to free garrays of `salitem_T` and `fromto_T` in spell.c, and garray `wcmd_T` in ex_docmd.c. Helped-by: Jiaqi Li --- src/nvim/garray.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/nvim/garray.h') diff --git a/src/nvim/garray.h b/src/nvim/garray.h index b32bab52f7..52493d6391 100644 --- a/src/nvim/garray.h +++ b/src/nvim/garray.h @@ -43,4 +43,22 @@ static inline void *ga_append_via_ptr(garray_T *gap, size_t item_size) return ((char *)gap->ga_data) + (item_size * (size_t)gap->ga_len++); } +/// Deep free a garray of specific type using a custom free function. +/// Items in the array as well as the array itself are freed. +/// +/// @param gap the garray to be freed +/// @param item_type type of the item in the garray +/// @param free_item_fn free function that takes (*item_type) as parameter +#define GA_DEEP_CLEAR(gap, item_type, free_item_fn) \ + do { \ + garray_T *_gap = (gap); \ + if (_gap->ga_data != NULL) { \ + for (int i = 0; i < _gap->ga_len; i++) { \ + item_type *_item = &(((item_type *)_gap->ga_data)[i]); \ + free_item_fn(_item); \ + } \ + } \ + ga_clear(_gap); \ + } while (false) + #endif // NVIM_GARRAY_H -- cgit From 8ee5659d83383d857039f8fc58d7ebc21df27905 Mon Sep 17 00:00:00 2001 From: Felipe Oliveira Carvalho Date: Thu, 11 Dec 2014 12:42:52 -0300 Subject: GA_DEEP_FREE_PTR: deep free macro for garrays that store simple pointers By "simple pointer" I mean a pointer that can be freed with a call to `free` without leaking any member pointer. This macro does exactly what `ga_clear_strings` does. --- src/nvim/garray.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'src/nvim/garray.h') diff --git a/src/nvim/garray.h b/src/nvim/garray.h index 52493d6391..b758fce5da 100644 --- a/src/nvim/garray.h +++ b/src/nvim/garray.h @@ -61,4 +61,12 @@ static inline void *ga_append_via_ptr(garray_T *gap, size_t item_size) ga_clear(_gap); \ } while (false) +#define FREE_PTR_PTR(ptr) free(*(ptr)) + +/// Call `free` for every pointer stored in the garray and then frees the +/// garray. +/// +/// @param gap the garray to be freed +#define GA_DEEP_CLEAR_PTR(gap) GA_DEEP_CLEAR(gap, void*, FREE_PTR_PTR) + #endif // NVIM_GARRAY_H -- cgit