diff options
| -rw-r--r-- | hash.c | 6 | ||||
| -rw-r--r-- | internal/set_table.h | 2 | ||||
| -rw-r--r-- | internal/st.h | 3 | ||||
| -rw-r--r-- | parser_st.c | 2 | ||||
| -rw-r--r-- | set.c | 15 | ||||
| -rw-r--r-- | st.c | 19 |
6 files changed, 28 insertions, 19 deletions
@@ -1173,17 +1173,13 @@ hash_st_free(VALUE hash) { HASH_ASSERT(RHASH_ST_TABLE_P(hash)); - st_table *tab = RHASH_ST_TABLE(hash); - - xfree(tab->bins); - xfree(tab->entries); + rb_st_free_embedded_table(RHASH_ST_TABLE(hash)); } static void hash_st_free_and_clear_table(VALUE hash) { hash_st_free(hash); - RHASH_ST_CLEAR(hash); } diff --git a/internal/set_table.h b/internal/set_table.h index 3c29abb4f5..cb83e96acc 100644 --- a/internal/set_table.h +++ b/internal/set_table.h @@ -58,6 +58,8 @@ int rb_set_foreach_check(set_table *, set_foreach_check_callback_func *, st_data st_index_t rb_set_keys(set_table *table, st_data_t *keys, st_index_t size); #define set_free_table rb_set_free_table void rb_set_free_table(set_table *); +#define set_free_embedded_table rb_set_free_embedded_table +void set_free_embedded_table(set_table *tab); #define set_table_clear rb_set_table_clear void rb_set_table_clear(set_table *); #define set_copy rb_set_copy diff --git a/internal/st.h b/internal/st.h index c220edd9f0..e4cd29a5b0 100644 --- a/internal/st.h +++ b/internal/st.h @@ -8,4 +8,7 @@ st_table *rb_st_replace(st_table *new_tab, st_table *old_tab); st_table *rb_st_init_existing_table_with_size(st_table *tab, const struct st_hash_type *type, st_index_t size); #define st_init_existing_table_with_size rb_st_init_existing_table_with_size +void rb_st_free_embedded_table(st_table *tab); +#define st_free_embedded_table rb_st_free_embedded_table + #endif diff --git a/parser_st.c b/parser_st.c index c234026122..8deb61adb6 100644 --- a/parser_st.c +++ b/parser_st.c @@ -80,6 +80,8 @@ nonempty_memcpy(void *dest, const void *src, size_t n) #define st_init_table_with_size rb_parser_st_init_table_with_size #undef st_init_existing_table_with_size #define st_init_existing_table_with_size rb_parser_st_init_existing_table_with_size +#undef st_free_embedded_table +#define st_free_embedded_table rb_parser_st_free_embedded_table #undef st_insert #define st_insert rb_parser_st_insert #undef st_lookup @@ -139,17 +139,10 @@ set_mark(void *ptr) } static void -set_free_embedded(struct set_object *sobj) -{ - xfree((&sobj->table)->entries); -} - -static void set_free(void *ptr) { struct set_object *sobj = ptr; - set_free_embedded(sobj); - memset(&sobj->table, 0, sizeof(sobj->table)); + set_free_embedded_table(&sobj->table); } static size_t @@ -546,7 +539,7 @@ set_i_initialize_copy(VALUE set, VALUE other) struct set_object *sobj; TypedData_Get_Struct(set, struct set_object, &set_data_type, sobj); - set_free_embedded(sobj); + set_free_embedded_table(&sobj->table); set_copy(&sobj->table, RSET_TABLE(other)); rb_gc_writebarrier_remember(set); @@ -1185,9 +1178,9 @@ set_reset_table_with_type(VALUE set, const struct st_hash_type *type) .into = new }; set_iter(set, set_merge_i, (st_data_t)&args); - set_free_embedded(sobj); + set_free_embedded_table(&sobj->table); memcpy(&sobj->table, new, sizeof(*new)); - xfree(new); + SIZED_FREE(new); } else { sobj->table.type = type; @@ -692,12 +692,19 @@ st_free_bins(const st_table *tab) { sized_free(tab->bins, st_bins_memsize(tab)); } -/* Free table TAB space. */ + void -st_free_table(st_table *tab) +st_free_embedded_table(st_table *tab) { st_free_bins(tab); st_free_entries(tab); +} + +/* Free table TAB space. */ +void +st_free_table(st_table *tab) +{ + st_free_embedded_table(tab); free_fixed_ptr(tab); } @@ -2560,12 +2567,18 @@ set_table_clear(set_table *tab) tab->rebuilds_num++; } +void +set_free_embedded_table(set_table *tab) +{ + sized_free(tab->entries, set_entries_memsize(tab)); +} + /* Free table TAB space. This should only be used if you passed NULL to set_init_table_with_size/set_copy when creating the table. */ void set_free_table(set_table *tab) { - sized_free(tab->entries, set_entries_memsize(tab)); + set_free_embedded_table(tab); free_fixed_ptr(tab); } |
