Bug #9683 » 9683.patch
| hash.c | ||
|---|---|---|
|
}
|
||
|
static VALUE
|
||
|
ifnone_recursive(VALUE obj, VALUE arg, int recurse) {
|
||
|
if (recurse) return Qnil;
|
||
|
return rb_funcall(RHASH_IFNONE(obj), id_yield, 2, obj, arg);
|
||
|
}
|
||
|
static VALUE
|
||
|
hash_default_value(VALUE hash, VALUE key)
|
||
|
{
|
||
|
if (rb_method_basic_definition_p(CLASS_OF(hash), id_default)) {
|
||
|
VALUE ifnone = RHASH_IFNONE(hash);
|
||
|
if (!FL_TEST(hash, HASH_PROC_DEFAULT)) return ifnone;
|
||
|
if (key == Qundef) return Qnil;
|
||
|
return rb_funcall(ifnone, id_yield, 2, hash, key);
|
||
|
return rb_exec_recursive_paired_outer(ifnone_recursive, hash, key, key);
|
||
|
}
|
||
|
else {
|
||
|
return rb_funcall(hash, id_default, 1, key);
|
||
| test/ruby/test_hash.rb | ||
|---|---|---|
|
assert_equal(true, h[:nope])
|
||
|
h = @cls[]
|
||
|
assert_nil(h.default_proc)
|
||
|
bug9683 = '[Bug #9683]'
|
||
|
h = @cls.new {|hh, k| hh[k] += 1 }
|
||
|
assert_nothing_raised(SystemStackError, bug9683) { h[1] }
|
||
|
fac = @cls.new {|hh, k| hh[k] = hh[k-1]*k }
|
||
|
fac[1] = 1
|
||
|
assert_nothing_raised(SystemStackError, bug9683) { fac[5] }
|
||
|
end
|
||
|
def test_shift2
|
||
- « Previous
- 1
- 2
- 3
- Next »