aboutsummaryrefslogtreecommitdiffstats
path: root/array.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2023-01-20 15:45:31 -0500
committerPeter Zhu <peter@peterzhu.ca>2023-01-24 13:34:21 -0500
commit5eeebd68cf8089a02a3dd553664c60a224b7e521 (patch)
tree5d04626c37f50361d6ca0ba10951e4b1dae69b9a /array.c
parent5a73e131d7458b3ede3d0f5a4447989a43ee915b (diff)
downloadruby-5eeebd68cf8089a02a3dd553664c60a224b7e521.tar.gz
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.
Diffstat (limited to 'array.c')
-rw-r--r--array.c35
1 files changed, 7 insertions, 28 deletions
diff --git a/array.c b/array.c
index bef8c34f3e..c1cbf488b4 100644
--- a/array.c
+++ b/array.c
@@ -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;
}