* hash.c (rb_hash_flatten): performance improvement by not using
rb_hash_to_a() to avoid array creation with rb_assoc_new(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42039 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
faa9d5eced
commit
852caed8a3
@ -1,3 +1,8 @@
|
|||||||
|
Thu Jul 18 17:35:41 2013 Masaki Matsushita <glass.saga@gmail.com>
|
||||||
|
|
||||||
|
* hash.c (rb_hash_flatten): performance improvement by not using
|
||||||
|
rb_hash_to_a() to avoid array creation with rb_assoc_new().
|
||||||
|
|
||||||
Thu Jul 18 16:16:17 2013 Koichi Sasada <ko1@atdot.net>
|
Thu Jul 18 16:16:17 2013 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* array.c: add logging feature for RGenGC's write barrier unprotect
|
* array.c: add logging feature for RGenGC's write barrier unprotect
|
||||||
|
28
hash.c
28
hash.c
@ -2187,6 +2187,18 @@ rb_hash_rassoc(VALUE hash, VALUE obj)
|
|||||||
return args[1];
|
return args[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
flatten_i(VALUE key, VALUE val, VALUE ary)
|
||||||
|
{
|
||||||
|
VALUE pair[2];
|
||||||
|
|
||||||
|
pair[0] = key;
|
||||||
|
pair[1] = val;
|
||||||
|
rb_ary_cat(ary, pair, 2);
|
||||||
|
|
||||||
|
return ST_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* hash.flatten -> an_array
|
* hash.flatten -> an_array
|
||||||
@ -2206,15 +2218,17 @@ rb_hash_rassoc(VALUE hash, VALUE obj)
|
|||||||
static VALUE
|
static VALUE
|
||||||
rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
|
rb_hash_flatten(int argc, VALUE *argv, VALUE hash)
|
||||||
{
|
{
|
||||||
VALUE ary, tmp;
|
VALUE ary;
|
||||||
|
|
||||||
ary = rb_hash_to_a(hash);
|
ary = rb_ary_new_capa(RHASH_SIZE(hash) * 2);
|
||||||
if (argc == 0) {
|
rb_hash_foreach(hash, flatten_i, ary);
|
||||||
argc = 1;
|
if (argc) {
|
||||||
tmp = INT2FIX(1);
|
int level = FIX2INT(*argv) - 1;
|
||||||
argv = &tmp;
|
if (level > 0) {
|
||||||
}
|
*argv = INT2FIX(level);
|
||||||
rb_funcall2(ary, rb_intern("flatten!"), argc, argv);
|
rb_funcall2(ary, rb_intern("flatten!"), argc, argv);
|
||||||
|
}
|
||||||
|
}
|
||||||
return ary;
|
return ary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user