summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hash.c6
-rw-r--r--internal/set_table.h2
-rw-r--r--internal/st.h3
-rw-r--r--parser_st.c2
-rw-r--r--set.c15
-rw-r--r--st.c19
6 files changed, 28 insertions, 19 deletions
diff --git a/hash.c b/hash.c
index 83a55913fa..dbd8f76950 100644
--- a/hash.c
+++ b/hash.c
@@ -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
diff --git a/set.c b/set.c
index 0fcfb1ef14..ea04a8495a 100644
--- a/set.c
+++ b/set.c
@@ -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;
diff --git a/st.c b/st.c
index 7891947549..09aef44c60 100644
--- a/st.c
+++ b/st.c
@@ -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);
}