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:
parent
5a73e131d7
commit
5eeebd68cf
Notes:
git
2023-01-24 18:34:46 +00:00
35
array.c
35
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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user