* array.c (ary_new): change order of allocation in order

to remove FL_OLDGEN operation.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41124 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tarui 2013-06-07 02:20:05 +00:00
parent b1bbe884cd
commit 7185eac56a
2 changed files with 11 additions and 10 deletions

View File

@ -1,3 +1,8 @@
Fri Jun 7 11:18:35 2013 Masaya Tarui <tarui@ruby-lang.org>
* array.c (ary_new): change order of allocation in order
to remove FL_OLDGEN operation.
Fri Jun 7 11:16:28 2013 Masaya Tarui <tarui@ruby-lang.org> Fri Jun 7 11:16:28 2013 Masaya Tarui <tarui@ruby-lang.org>
* tool/rdocbench.rb: add gc total time infomation. * tool/rdocbench.rb: add gc total time infomation.

16
array.c
View File

@ -392,7 +392,7 @@ empty_ary_alloc(VALUE klass)
static VALUE static VALUE
ary_new(VALUE klass, long capa) ary_new(VALUE klass, long capa)
{ {
VALUE ary; VALUE ary,*ptr;
if (capa < 0) { if (capa < 0) {
rb_raise(rb_eArgError, "negative array size (or size too big)"); rb_raise(rb_eArgError, "negative array size (or size too big)");
@ -405,20 +405,16 @@ ary_new(VALUE klass, long capa)
RUBY_DTRACE_ARRAY_CREATE(capa, rb_sourcefile(), rb_sourceline()); RUBY_DTRACE_ARRAY_CREATE(capa, rb_sourcefile(), rb_sourceline());
} }
ary = ary_alloc(klass);
if (capa > RARRAY_EMBED_LEN_MAX) { if (capa > RARRAY_EMBED_LEN_MAX) {
ptr = ALLOC_N(VALUE, capa);
ary = ary_alloc(klass);
FL_UNSET_EMBED(ary); FL_UNSET_EMBED(ary);
ARY_SET_PTR(ary, ALLOC_N(VALUE, capa)); ARY_SET_PTR(ary, ptr);
ARY_SET_CAPA(ary, capa); ARY_SET_CAPA(ary, capa);
ARY_SET_HEAP_LEN(ary, 0); ARY_SET_HEAP_LEN(ary, 0);
} else {
ary = ary_alloc(klass);
/* NOTE: `ary' can be old because the following suquence is possible.
* (1) ary = ary_alloc();
* (2) GC (for (3)) -> promote ary
* (3) ALLOC_N(VALUE, capa)
* So that force ary as young object.
*/
RBASIC(ary)->flags &= ~FL_OLDGEN;
} }
return ary; return ary;