diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-11-27 10:00:35 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-11-27 10:00:35 +0000 |
commit | efd250b09d2a5d583c54ab8d2a974b3e6acfa053 (patch) | |
tree | 922c6ba9baaf7b140efadfb387c0a0780e544eb6 /enum.c | |
parent | 9ac485959f11507ce50bc3520d1eff1f5f999df8 (diff) | |
download | ruby-efd250b09d2a5d583c54ab8d2a974b3e6acfa053.tar.gz ruby-efd250b09d2a5d583c54ab8d2a974b3e6acfa053.tar.xz ruby-efd250b09d2a5d583c54ab8d2a974b3e6acfa053.zip |
* marshal.c (w_float): must distinguish -0.0 from 0.0.
* gc.c (gc_mark_all): tweak mark order for little bit better scan.
* gc.c (rb_gc_mark): ditto.
* gc.c (rb_gc): ditto.
* enum.c (sort_by_i): slight performance boost.
* gc.c (gc_mark_rest): should call gc_mark_children(), not gc_mark().
* gc.c (rb_gc_mark): may cause infinite looop.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@1861 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enum.c')
-rw-r--r-- | enum.c | 24 |
1 files changed, 20 insertions, 4 deletions
@@ -208,7 +208,23 @@ sort_by_i(i, memo) VALUE i; NODE *memo; { - VALUE e = rb_ary_new3(3, rb_yield(i), INT2NUM(memo->u3.cnt), i); + VALUE v, e; + + v = rb_yield(i); + if (TYPE(v) == T_ARRAY) { + int j, len = RARRAY(v)->len; + + e = rb_ary_new2(len+2); + for (j=0; j<len; j++) { + RARRAY(e)->ptr[j] = RARRAY(v)->ptr[j]; + } + RARRAY(e)->ptr[j++] = INT2NUM(memo->u3.cnt); + RARRAY(e)->ptr[j] = i; + RARRAY(e)->len = len + 2; + } + else { + e = rb_ary_new3(3, v, INT2NUM(memo->u3.cnt), i); + } rb_ary_push(memo->u1.value, e); memo->u3.cnt++; return Qnil; @@ -225,16 +241,16 @@ static VALUE enum_sort_by(obj) VALUE obj; { - VALUE ary = rb_ary_new(); + VALUE ary = rb_ary_new2(2000); NODE *memo = rb_node_newnode(NODE_MEMO, ary, 0, 0); long i; rb_iterate(rb_each, obj, sort_by_i, (VALUE)memo); rb_gc_force_recycle((VALUE)memo); - rb_iterate(rb_ary_sort_bang, ary, sort_by_sort_body, 0); + rb_ary_sort_inplace(ary); for (i=0; i<RARRAY(ary)->len; i++) { VALUE e = RARRAY(ary)->ptr[i]; - RARRAY(ary)->ptr[i] = rb_ary_entry(e, 2); + RARRAY(ary)->ptr[i] = RARRAY(e)->ptr[2]; } return ary; |