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.
This commit is contained in:
Peter Zhu 2023-01-20 15:45:31 -05:00
parent 5a73e131d7
commit 5eeebd68cf
Notes: git 2023-01-24 18:34:46 +00:00

35
array.c
View File

@ -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;
}