summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorglass <glass@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-20 02:27:30 +0000
committerglass <glass@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-02-20 02:27:30 +0000
commitf138018e9efc6fb962e591ebe96880d0da8a2236 (patch)
treeb56609dcd0db17e9f0f44d49b142e1f8e56a76e5 /hash.c
parent2e6b97a45d077979121b29484a8831034d47ef50 (diff)
* hash.c (rb_hash_flatten): fix behavior of flatten(-1).
[ruby-dev:47988] [Bug #9533] * test/ruby/test_array.rb: test for above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45057 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/hash.c b/hash.c
index 0072852a82..6ec20da95a 100644
--- a/hash.c
+++ b/hash.c
@@ -66,7 +66,7 @@ rb_hash_freeze(VALUE hash)
VALUE rb_cHash;
static VALUE envtbl;
-static ID id_hash, id_yield, id_default;
+static ID id_hash, id_yield, id_default, id_flatten_bang;
VALUE
rb_hash_set_ifnone(VALUE hash, VALUE ifnone)
@@ -2377,10 +2377,13 @@ rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
rb_hash_foreach(hash, flatten_i, ary);
if (argc) {
- int level = NUM2INT(*argv) - 1;
- if (level > 0) {
- *argv = INT2FIX(level);
- rb_funcall2(ary, rb_intern("flatten!"), argc, argv);
+ int level = NUM2INT(*argv);
+ if (level - 1 > 0) {
+ *argv = INT2FIX(level - 1);
+ rb_funcall2(ary, id_flatten_bang, argc, argv);
+ }
+ else if (level == -1) {
+ rb_funcall2(ary, id_flatten_bang, 0, 0);
}
}
return ary;
@@ -3732,6 +3735,7 @@ Init_Hash(void)
id_hash = rb_intern("hash");
id_yield = rb_intern("yield");
id_default = rb_intern("default");
+ id_flatten_bang = rb_intern("flatten!");
rb_cHash = rb_define_class("Hash", rb_cObject);