1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* eval.c (is_defined): should not dump core for "defined?(())".

* eval.c (umethod_bind): recv can be an instance of descender of
  oklass if oklass is a Module.

* hash.c (rb_hash_equal): check identiry equality first.

* file.c (group_member): should check real gid only.

* file.c (eaccess): do not cache euid, since effective euid may be
  changed via Process.euid=().

* file.c (eaccess): return -1 unless every specified access mode
  is permitted.

* eval.c (rb_eval): while/until returns the value which is given
  to break.

* parse.y (value_expr): using while/until/class/def as an
  expression is now gives a warning, not an error.

* range.c (range_eqq): should compare strings based on magical
  increment (using String#upto), not dictionary order.

* enum.c (enum_sort_by): new method for Schewartzian transformed
  stable sort.

* variable.c (mod_av_set): detect constant overriding for built-in
  classes/modules.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1707 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2001-08-23 06:02:15 +00:00
parent e15efe7733
commit 1289a7a11f
15 changed files with 176 additions and 42 deletions

39
enum.c
View file

@ -203,6 +203,44 @@ enum_sort(obj)
return rb_ary_sort(enum_to_a(obj));
}
static VALUE
sort_by_i(i, memo)
VALUE i;
NODE *memo;
{
VALUE e = rb_ary_new3(3, rb_yield(e), INT2NUM(memo->u3.cnt), i);
rb_ary_push(memo->u1.value, e);
memo->u3.cnt++;
return Qnil;
}
static VALUE
sort_by_sort_body(a)
VALUE a;
{
return rb_ary_cmp(RARRAY(a)->ptr[0], RARRAY(a)->ptr[1]);
}
static VALUE
enum_sort_by(obj)
VALUE obj;
{
VALUE ary = rb_ary_new();
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);
for (i=0; i<RARRAY(ary)->len; i++) {
VALUE e = RARRAY(ary)->ptr[i];
RARRAY(ary)->ptr[i] = rb_ary_entry(e, 2);
rb_gc_force_recycle(e);
}
return ary;
}
static VALUE
all_i(i, memo)
VALUE i;
@ -397,6 +435,7 @@ Init_Enumerable()
rb_define_method(rb_mEnumerable,"entries", enum_to_a, 0);
rb_define_method(rb_mEnumerable,"sort", enum_sort, 0);
rb_define_method(rb_mEnumerable,"sort_by", enum_sort_by, 0);
rb_define_method(rb_mEnumerable,"grep", enum_grep, 1);
rb_define_method(rb_mEnumerable,"find", enum_find, -1);
rb_define_method(rb_mEnumerable,"detect", enum_find, -1);