Add rb_hash_free for the GC to use

This commit is contained in:
Peter Zhu 2023-09-24 09:07:52 -04:00
Родитель 36cdf163df
Коммит f43dac0df2
3 изменённых файлов: 10 добавлений и 6 удалений

7
gc.c
Просмотреть файл

@ -3539,12 +3539,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
}
#endif
if (RHASH_ST_TABLE_P(obj)) {
st_table *tab = RHASH_ST_TABLE(obj);
free(tab->bins);
free(tab->entries);
}
rb_hash_free(obj);
break;
case T_REGEXP:
if (RANY(obj)->as.regexp.ptr) {

8
hash.c
Просмотреть файл

@ -1178,6 +1178,14 @@ hash_st_free_and_clear_table(VALUE hash)
RHASH_ST_CLEAR(hash);
}
void
rb_hash_free(VALUE hash)
{
if (RHASH_ST_TABLE_P(hash)) {
hash_st_free(hash);
}
}
typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
struct foreach_safe_arg {

Просмотреть файл

@ -87,6 +87,7 @@ int rb_hash_stlike_delete(VALUE hash, st_data_t *pkey, st_data_t *pval);
int rb_hash_stlike_foreach_with_replace(VALUE hash, st_foreach_check_callback_func *func, st_update_callback_func *replace, st_data_t arg);
int rb_hash_stlike_update(VALUE hash, st_data_t key, st_update_callback_func *func, st_data_t arg);
VALUE rb_ident_hash_new_with_size(st_index_t size);
void rb_hash_free(VALUE hash);
static inline unsigned RHASH_AR_TABLE_SIZE_RAW(VALUE h);
static inline VALUE RHASH_IFNONE(VALUE h);