diff options
author | Peter Zhu <peter@peterzhu.ca> | 2023-01-20 15:45:31 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-01-24 13:34:21 -0500 |
commit | 5eeebd68cf8089a02a3dd553664c60a224b7e521 (patch) | |
tree | 5d04626c37f50361d6ca0ba10951e4b1dae69b9a /array.c | |
parent | 5a73e131d7458b3ede3d0f5a4447989a43ee915b (diff) |
Remove function ary_recycle_hash
Freeing the memory of a Hash should be done by the garbage collector
and not by array functions. This could potentially leak memory if
ary_recycle_hash was not implemented properly.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/7165
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 35 |
1 files changed, 7 insertions, 28 deletions
@@ -5556,17 +5556,6 @@ ary_make_hash_by(VALUE ary) return ary_add_hash_by(hash, ary); } -static inline void -ary_recycle_hash(VALUE hash) -{ - assert(RBASIC_CLASS(hash) == 0); - if (RHASH_ST_TABLE_P(hash)) { - st_table *tbl = RHASH_ST_TABLE(hash); - st_free_table(tbl); - RHASH_ST_CLEAR(hash); - } -} - /* * call-seq: * array - other_array -> new_array @@ -5608,7 +5597,7 @@ rb_ary_diff(VALUE ary1, VALUE ary2) if (rb_hash_stlike_lookup(hash, RARRAY_AREF(ary1, i), NULL)) continue; rb_ary_push(ary3, rb_ary_elt(ary1, i)); } - ary_recycle_hash(hash); + return ary3; } @@ -5714,7 +5703,6 @@ rb_ary_and(VALUE ary1, VALUE ary2) rb_ary_push(ary3, v); } } - ary_recycle_hash(hash); return ary3; } @@ -5801,11 +5789,11 @@ rb_ary_union_hash(VALUE hash, VALUE ary2) static VALUE rb_ary_or(VALUE ary1, VALUE ary2) { - VALUE hash, ary3; + VALUE hash; ary2 = to_ary(ary2); if (RARRAY_LEN(ary1) + RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) { - ary3 = rb_ary_new(); + VALUE ary3 = rb_ary_new(); rb_ary_union(ary3, ary1); rb_ary_union(ary3, ary2); return ary3; @@ -5814,9 +5802,7 @@ rb_ary_or(VALUE ary1, VALUE ary2) hash = ary_make_hash(ary1); rb_ary_union_hash(hash, ary2); - ary3 = rb_hash_values(hash); - ary_recycle_hash(hash); - return ary3; + return rb_hash_values(hash); } /* @@ -5840,7 +5826,7 @@ rb_ary_union_multi(int argc, VALUE *argv, VALUE ary) { int i; long sum; - VALUE hash, ary_union; + VALUE hash; sum = RARRAY_LEN(ary); for (i = 0; i < argc; i++) { @@ -5849,7 +5835,7 @@ rb_ary_union_multi(int argc, VALUE *argv, VALUE ary) } if (sum <= SMALL_ARRAY_LEN) { - ary_union = rb_ary_new(); + VALUE ary_union = rb_ary_new(); rb_ary_union(ary_union, ary); for (i = 0; i < argc; i++) rb_ary_union(ary_union, argv[i]); @@ -5860,9 +5846,7 @@ rb_ary_union_multi(int argc, VALUE *argv, VALUE ary) hash = ary_make_hash(ary); for (i = 0; i < argc; i++) rb_ary_union_hash(hash, argv[i]); - ary_union = rb_hash_values(hash); - ary_recycle_hash(hash); - return ary_union; + return rb_hash_values(hash); } /* @@ -5916,7 +5900,6 @@ rb_ary_intersect_p(VALUE ary1, VALUE ary2) break; } } - ary_recycle_hash(hash); return result; } @@ -6351,7 +6334,6 @@ rb_ary_uniq_bang(VALUE ary) } ary_resize_capa(ary, hash_size); rb_hash_foreach(hash, push_value, ary); - ary_recycle_hash(hash); return ary; } @@ -6396,9 +6378,6 @@ rb_ary_uniq(VALUE ary) hash = ary_make_hash(ary); uniq = rb_hash_values(hash); } - if (hash) { - ary_recycle_hash(hash); - } return uniq; } |