[Bug #21304] Reload length and pointer after #hash
method
The receiver can be modified during the method calls.
This commit is contained in:
parent
21035c826d
commit
ce8f7da49e
Notes:
git
2025-05-05 07:20:56 +00:00
Merged: https://github.com/ruby/ruby/pull/13255 Merged-By: nobu <nobu@ruby-lang.org>
17
array.c
17
array.c
@ -5321,8 +5321,8 @@ rb_ary_eql(VALUE ary1, VALUE ary2)
|
|||||||
return rb_exec_recursive_paired(recursive_eql, ary1, ary2, ary2);
|
return rb_exec_recursive_paired(recursive_eql, ary1, ary2, ary2);
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
static VALUE
|
||||||
rb_ary_hash_values(long len, const VALUE *elements)
|
ary_hash_values(long len, const VALUE *elements, const VALUE ary)
|
||||||
{
|
{
|
||||||
long i;
|
long i;
|
||||||
st_index_t h;
|
st_index_t h;
|
||||||
@ -5333,11 +5333,21 @@ rb_ary_hash_values(long len, const VALUE *elements)
|
|||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
n = rb_hash(elements[i]);
|
n = rb_hash(elements[i]);
|
||||||
h = rb_hash_uint(h, NUM2LONG(n));
|
h = rb_hash_uint(h, NUM2LONG(n));
|
||||||
|
if (ary) {
|
||||||
|
len = RARRAY_LEN(ary);
|
||||||
|
elements = RARRAY_CONST_PTR(ary);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
h = rb_hash_end(h);
|
h = rb_hash_end(h);
|
||||||
return ST2FIX(h);
|
return ST2FIX(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
rb_ary_hash_values(long len, const VALUE *elements)
|
||||||
|
{
|
||||||
|
return ary_hash_values(len, elements, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* hash -> integer
|
* hash -> integer
|
||||||
@ -5356,7 +5366,8 @@ rb_ary_hash_values(long len, const VALUE *elements)
|
|||||||
static VALUE
|
static VALUE
|
||||||
rb_ary_hash(VALUE ary)
|
rb_ary_hash(VALUE ary)
|
||||||
{
|
{
|
||||||
return rb_ary_hash_values(RARRAY_LEN(ary), RARRAY_CONST_PTR(ary));
|
RBIMPL_ASSERT_OR_ASSUME(ary);
|
||||||
|
return ary_hash_values(RARRAY_LEN(ary), RARRAY_CONST_PTR(ary), ary);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user