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 »