diff options
author | Peter Zhu <peter@peterzhu.ca> | 2023-09-24 09:07:52 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-09-24 09:07:52 -0400 |
commit | f43dac0df29c137ae966362f7faf26084468a0fb (patch) | |
tree | 16a39f84979a86a57727dbf829760a3fff14c8ee | |
parent | 36cdf163dfbcac5b0e7fedbd55c817b5d5c971fb (diff) | |
download | ruby-f43dac0df29c137ae966362f7faf26084468a0fb.tar.gz |
Add rb_hash_free for the GC to use
-rw-r--r-- | gc.c | 7 | ||||
-rw-r--r-- | hash.c | 8 | ||||
-rw-r--r-- | internal/hash.h | 1 |
3 files changed, 10 insertions, 6 deletions
@@ -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) { @@ -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 { diff --git a/internal/hash.h b/internal/hash.h index d1848e5408..fe859cb716 100644 --- a/internal/hash.h +++ b/internal/hash.h @@ -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); |