mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
flock,flatten,signal to main_thread
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@168 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e004116073
commit
94a1bece4a
14 changed files with 242 additions and 122 deletions
40
array.c
40
array.c
|
@ -1234,6 +1234,44 @@ ary_nitems(ary)
|
|||
return INT2FIX(n);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ary_flatten_bang(ary)
|
||||
VALUE ary;
|
||||
{
|
||||
int i;
|
||||
int mod = 0;
|
||||
|
||||
ary_modify(ary);
|
||||
for (;;) {
|
||||
int lmod = 0;
|
||||
|
||||
for (i=0; i<RARRAY(ary)->len; i++) {
|
||||
if (TYPE(RARRAY(ary)->ptr[i]) == T_ARRAY) {
|
||||
VALUE ary2 = RARRAY(ary)->ptr[i];
|
||||
|
||||
ary_replace(ary, i, RARRAY(ary2)->len, ary2);
|
||||
i += RARRAY(ary2)->len - 1;
|
||||
lmod++;
|
||||
}
|
||||
}
|
||||
if (lmod == 0) break;
|
||||
mod = lmod;
|
||||
}
|
||||
|
||||
if (mod == 0) return Qnil;
|
||||
return ary;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ary_flatten(ary)
|
||||
VALUE ary;
|
||||
{
|
||||
VALUE v = ary_flatten_bang(ary_clone(ary));
|
||||
|
||||
if (NIL_P(v)) return ary;
|
||||
return v;
|
||||
}
|
||||
|
||||
extern VALUE mEnumerable;
|
||||
|
||||
void
|
||||
|
@ -1304,6 +1342,8 @@ Init_Array()
|
|||
rb_define_method(cArray, "uniq!", ary_uniq_bang, 0);
|
||||
rb_define_method(cArray, "compact", ary_compact, 0);
|
||||
rb_define_method(cArray, "compact!", ary_compact_bang, 0);
|
||||
rb_define_method(cArray, "flatten", ary_flatten, 0);
|
||||
rb_define_method(cArray, "flatten!", ary_flatten_bang, 0);
|
||||
rb_define_method(cArray, "nitems", ary_nitems, 0);
|
||||
|
||||
cmp = rb_intern("<=>");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue