[前][次][番号順一覧][スレッド一覧]

ruby-changes:4898

From: ko1@a...
Date: Mon, 12 May 2008 20:22:03 +0900 (JST)
Subject: [ruby-changes:4898] knu - Ruby:r16391 (trunk): * enum.c (grep_i): Be aware of multiple values;

knu	2008-05-12 20:21:39 +0900 (Mon, 12 May 2008)

  New Revision: 16391

  Modified files:
    trunk/ChangeLog
    trunk/enum.c

  Log:
    * enum.c (grep_i): Be aware of multiple values;
      fix [ruby-dev:34653].
      (grep_iter_i): Ditto.
      (count_i): Ditto.
      (find_i): Ditto.
      (find_index_i): Ditto.
      (find_all_i): Ditto.
      (reject_i): Ditto.
      (inject_i): Ditto.
      (inject_op_i): Ditto.
      (partition_i): Ditto.
      (group_by_i): Ditto.
      (first_i): Ditto.
      (sort_by_i): Ditto.
      (all_i): Ditto.
      (all_iter_i): Ditto.
      (any_i): Ditto.
      (any_iter_i): Ditto.
      (one_i): Ditto.
      (one_iter_i): Ditto.
      (none_i): Ditto.
      (none_iter_i): Ditto.
      (min_i): Ditto.
      (min_ii): Ditto.
      (max_i): Ditto.
      (max_ii): Ditto.
      (minmax_i): Ditto.
      (minmax_ii): Ditto.
      (min_by_i): Ditto.
      (max_by_i): Ditto.
      (minmax_by_i): Ditto.
      (member_i): Ditto.
      (take_i): Ditto.
      (take_while_i): Ditto.
      (drop_i): Ditto.
      (drop_while_i): Ditto.
      (cycle_i): Ditto.
    
    * enum.c (each_with_index): Update rdoc.  each_with_index() takes
      argments that are passed through to each(), and a hash preserves
      key order.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16391&r2=16390&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/enum.c?r1=16391&r2=16390&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16390)
+++ ChangeLog	(revision 16391)
@@ -1,3 +1,47 @@
+Mon May 12 20:19:55 2008  Akinori MUSHA  <knu@i...>
+
+	* enum.c (grep_i): Be aware of multiple values;
+	  fix [ruby-dev:34653].
+	  (grep_iter_i): Ditto.
+	  (count_i): Ditto.
+	  (find_i): Ditto.
+	  (find_index_i): Ditto.
+	  (find_all_i): Ditto.
+	  (reject_i): Ditto.
+	  (inject_i): Ditto.
+	  (inject_op_i): Ditto.
+	  (partition_i): Ditto.
+	  (group_by_i): Ditto.
+	  (first_i): Ditto.
+	  (sort_by_i): Ditto.
+	  (all_i): Ditto.
+	  (all_iter_i): Ditto.
+	  (any_i): Ditto.
+	  (any_iter_i): Ditto.
+	  (one_i): Ditto.
+	  (one_iter_i): Ditto.
+	  (none_i): Ditto.
+	  (none_iter_i): Ditto.
+	  (min_i): Ditto.
+	  (min_ii): Ditto.
+	  (max_i): Ditto.
+	  (max_ii): Ditto.
+	  (minmax_i): Ditto.
+	  (minmax_ii): Ditto.
+	  (min_by_i): Ditto.
+	  (max_by_i): Ditto.
+	  (minmax_by_i): Ditto.
+	  (member_i): Ditto.
+	  (take_i): Ditto.
+	  (take_while_i): Ditto.
+	  (drop_i): Ditto.
+	  (drop_while_i): Ditto.
+	  (cycle_i): Ditto.
+
+	* enum.c (each_with_index): Update rdoc.  each_with_index() takes
+	  argments that are passed through to each(), and a hash preserves
+	  key order.
+
 Mon May 12 19:05:24 2008  NAKAMURA Usaku  <usa@r...>
 
 	* process.c (rb_spawn_internal): remove calling run_exec_options()
Index: enum.c
===================================================================
--- enum.c	(revision 16390)
+++ enum.c	(revision 16391)
@@ -24,6 +24,10 @@
     return rb_ary_new4(argc, argv);
 }
 
+#define ENUM_WANT_SVALUE() do { \
+    i = enum_values_pack(argc, argv); \
+} while (0)
+
 static VALUE
 enum_yield(int argc, VALUE *argv)
 {
@@ -33,8 +37,10 @@
 static VALUE
 grep_i(VALUE i, VALUE *arg, int argc, VALUE *argv)
 {
+    ENUM_WANT_SVALUE();
+
     if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) {
-	rb_ary_push(arg[1], enum_values_pack(argc, argv));
+	rb_ary_push(arg[1], i);
     }
     return Qnil;
 }
@@ -42,8 +48,10 @@
 static VALUE
 grep_iter_i(VALUE i, VALUE *arg, int argc, VALUE *argv)
 {
+    ENUM_WANT_SVALUE();
+
     if (RTEST(rb_funcall(arg[0], id_eqq, 1, i))) {
-	rb_ary_push(arg[1], enum_yield(argc, argv));
+	rb_ary_push(arg[1], rb_yield(i));
     }
     return Qnil;
 }
@@ -85,6 +93,8 @@
 {
     VALUE *memo = (VALUE*)memop;
 
+    ENUM_WANT_SVALUE();
+
     if (rb_equal(i, memo[1])) {
 	memo[0]++;
     }
@@ -142,7 +152,9 @@
 static VALUE
 find_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    if (RTEST(enum_yield(argc, argv))) {
+    ENUM_WANT_SVALUE();
+
+    if (RTEST(rb_yield(i))) {
 	*memo = i;
 	rb_iter_break();
     }
@@ -187,6 +199,8 @@
 {
     VALUE *memo = (VALUE*)memop;
 
+    ENUM_WANT_SVALUE();
+
     if (rb_equal(i, memo[2])) {
 	memo[0] = UINT2NUM(memo[1]);
 	rb_iter_break();
@@ -251,7 +265,9 @@
 static VALUE
 find_all_i(VALUE i, VALUE ary, int argc, VALUE *argv)
 {
-    if (RTEST(enum_yield(argc, argv))) {
+    ENUM_WANT_SVALUE();
+
+    if (RTEST(rb_yield(i))) {
 	rb_ary_push(ary, i);
     }
     return Qnil;
@@ -286,7 +302,9 @@
 static VALUE
 reject_i(VALUE i, VALUE ary, int argc, VALUE *argv)
 {
-    if (!RTEST(enum_yield(argc, argv))) {
+    ENUM_WANT_SVALUE();
+
+    if (!RTEST(rb_yield(i))) {
 	rb_ary_push(ary, i);
     }
     return Qnil;
@@ -382,11 +400,14 @@
 inject_i(VALUE i, VALUE p, int argc, VALUE *argv)
 {
     VALUE *memo = (VALUE *)p;
+
+    ENUM_WANT_SVALUE();
+
     if (memo[0] == Qundef) {
 	memo[0] = i;
     }
     else {
-	memo[0] = rb_yield_values(2, memo[0], enum_values_pack(argc, argv));
+	memo[0] = rb_yield_values(2, memo[0], i);
     }
     return Qnil;
 }
@@ -396,8 +417,10 @@
 {
     VALUE *memo = (VALUE *)p;
 
+    ENUM_WANT_SVALUE();
+
     if (memo[0] == Qundef) {
-	memo[0] = enum_values_pack(argc, argv);
+	memo[0] = i;
     }
     else {
 	memo[0] = rb_funcall(memo[0], (ID)memo[1], 1, i);
@@ -484,7 +507,9 @@
 static VALUE
 partition_i(VALUE i, VALUE *ary, int argc, VALUE *argv)
 {
-    if (RTEST(enum_yield(argc, argv))) {
+    ENUM_WANT_SVALUE();
+
+    if (RTEST(rb_yield(i))) {
 	rb_ary_push(ary[0], i);
     }
     else {
@@ -522,9 +547,12 @@
 static VALUE
 group_by_i(VALUE i, VALUE hash, int argc, VALUE *argv)
 {
-    VALUE group = enum_yield(argc, argv);
+    VALUE group;
     VALUE values;
 
+    ENUM_WANT_SVALUE();
+
+    group = rb_yield(i);
     values = rb_hash_aref(hash, group);
     if (NIL_P(values)) {
 	values = rb_ary_new3(1, i);
@@ -562,8 +590,10 @@
 }
 
 static VALUE
-first_i(VALUE i, VALUE *ary)
+first_i(VALUE i, VALUE *ary, int argc, VALUE *argv)
 {
+    ENUM_WANT_SVALUE();
+
     if (NIL_P(ary[0])) {
 	ary[1] = i;
 	rb_iter_break();
@@ -637,14 +667,14 @@
 static VALUE
 sort_by_i(VALUE i, VALUE ary, int argc, VALUE *argv)
 {
-    VALUE v;
     NODE *memo;
 
-    v = enum_yield(argc, argv);
+    ENUM_WANT_SVALUE();
+
     if (RBASIC(ary)->klass) {
 	rb_raise(rb_eRuntimeError, "sort_by reentered");
     }
-    memo = rb_node_newnode(NODE_MEMO, v, i, 0);
+    memo = rb_node_newnode(NODE_MEMO, rb_yield(i), i, 0);
     rb_ary_push(ary, (VALUE)memo);
     return Qnil;
 }
@@ -762,9 +792,9 @@
 }
 
 static VALUE
-all_i(VALUE i, VALUE *memo)
+all_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    if (!RTEST(i)) {
+    if (!RTEST(enum_values_pack(argc, argv))) {
 	*memo = Qfalse;
 	rb_iter_break();
     }
@@ -772,9 +802,13 @@
 }
 
 static VALUE
-all_iter_i(VALUE i, VALUE *memo)
+all_iter_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    return all_i(rb_yield(i), memo);
+    if (!RTEST(enum_yield(argc, argv))) {
+	*memo = Qfalse;
+	rb_iter_break();
+    }
+    return Qnil;
 }
 
 /*
@@ -804,9 +838,9 @@
 }
 
 static VALUE
-any_i(VALUE i, VALUE *memo)
+any_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    if (RTEST(i)) {
+    if (RTEST(enum_values_pack(argc, argv))) {
 	*memo = Qtrue;
 	rb_iter_break();
     }
@@ -814,9 +848,13 @@
 }
 
 static VALUE
-any_iter_i(VALUE i, VALUE *memo)
+any_iter_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    return any_i(rb_yield(i), memo);
+    if (RTEST(enum_yield(argc, argv))) {
+	*memo = Qtrue;
+	rb_iter_break();
+    }
+    return Qnil;
 }
 
 /*
@@ -847,9 +885,9 @@
 }
 
 static VALUE
-one_i(VALUE i, VALUE *memo)
+one_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    if (RTEST(i)) {
+    if (RTEST(enum_values_pack(argc, argv))) {
 	if (*memo == Qundef) {
 	    *memo = Qtrue;
 	}
@@ -862,9 +900,18 @@
 }
 
 static VALUE
-one_iter_i(VALUE i, VALUE *memo)
+one_iter_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    return one_i(rb_yield(i), memo);
+    if (RTEST(enum_yield(argc, argv))) {
+	if (*memo == Qundef) {
+	    *memo = Qtrue;
+	}
+	else if (*memo == Qtrue) {
+	    *memo = Qfalse;
+	    rb_iter_break();
+	}
+    }
+    return Qnil;
 }
 
 /*
@@ -896,9 +943,9 @@
 }
 
 static VALUE
-none_i(VALUE i, VALUE *memo)
+none_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    if (RTEST(i)) {
+    if (RTEST(enum_values_pack(argc, argv))) {
 	*memo = Qfalse;
 	rb_iter_break();
     }
@@ -906,9 +953,13 @@
 }
 
 static VALUE
-none_iter_i(VALUE i, VALUE *memo)
+none_iter_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
-    return none_i(rb_yield(i), memo);
+    if (RTEST(enum_yield(argc, argv))) {
+	*memo = Qfalse;
+	rb_iter_break();
+    }
+    return Qnil;
 }
 
 /*
@@ -936,10 +987,12 @@
 }
 
 static VALUE
-min_i(VALUE i, VALUE *memo)
+min_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
     VALUE cmp;
 
+    ENUM_WANT_SVALUE();
+
     if (*memo == Qundef) {
 	*memo = i;
     }
@@ -953,10 +1006,12 @@
 }
 
 static VALUE
-min_ii(VALUE i, VALUE *memo)
+min_ii(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
     VALUE cmp;
 
+    ENUM_WANT_SVALUE();
+
     if (*memo == Qundef) {
 	*memo = i;
     }
@@ -1005,10 +1060,12 @@
 }
 
 static VALUE
-max_i(VALUE i, VALUE *memo)
+max_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
     VALUE cmp;
 
+    ENUM_WANT_SVALUE();
+
     if (*memo == Qundef) {
 	*memo = i;
     }
@@ -1022,10 +1079,12 @@
 }
 
 static VALUE
-max_ii(VALUE i, VALUE *memo)
+max_ii(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
     VALUE cmp;
 
+    ENUM_WANT_SVALUE();
+
     if (*memo == Qundef) {
 	*memo = i;
     }
@@ -1073,10 +1132,12 @@
 }
 
 static VALUE
-minmax_i(VALUE i, VALUE *memo)
+minmax_i(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
     int n;
 
+    ENUM_WANT_SVALUE();
+
     if (memo[0] == Qundef) {
 	memo[0] = i;
 	memo[1] = i;
@@ -1095,10 +1156,12 @@
 }
 
 static VALUE
-minmax_ii(VALUE i, VALUE *memo)
+minmax_ii(VALUE i, VALUE *memo, int argc, VALUE *argv)
 {
     int n;
 
+    ENUM_WANT_SVALUE();
+
     if (memo[0] == Qundef) {
 	memo[0] = i;
 	memo[1] = i;
@@ -1163,7 +1226,9 @@
 {
     VALUE v;
 
-    v = enum_yield(argc, argv);
+    ENUM_WANT_SVALUE();
+
+    v = rb_yield(i);
     if (memo[0] == Qundef) {
 	memo[0] = v;
 	memo[1] = i;
@@ -1204,7 +1269,9 @@
 {
     VALUE v;
 
-    v = enum_yield(argc, argv);
+    ENUM_WANT_SVALUE();
+
+    v = rb_yield(i);
     if (memo[0] == Qundef) {
 	memo[0] = v;
 	memo[1] = i;
@@ -1245,7 +1312,9 @@
 {
     VALUE v;
 
-    v = enum_yield(argc, argv);
+    ENUM_WANT_SVALUE();
+
+    v = rb_yield(i);
     if (memo[0] == Qundef) {
 	memo[0] = v;
 	memo[1] = v;
@@ -1293,9 +1362,9 @@
 }
 
 static VALUE
-member_i(VALUE item, VALUE *memo)
+member_i(VALUE iter, VALUE *memo, int argc, VALUE *argv)
 {
-    if (rb_equal(item, memo[0])) {
+    if (rb_equal(enum_values_pack(argc, argv), memo[0])) {
 	memo[1] = Qtrue;
 	rb_iter_break();
     }
@@ -1338,14 +1407,15 @@
  *  call-seq:
  *     enum.each_with_index {|obj, i| block }  -> enum
  *
- *  Calls <em>block</em> with two arguments, the item and its index, for
- *  each item in <i>enum</i>.
+ *  Calls <em>block</em> with two arguments, the item and its index,
+ *  for each item in <i>enum</i>.  Given arguments are passed through
+ *  to #each().
  *
  *     hash = Hash.new
  *     %w(cat dog wombat).each_with_index {|item, index|
  *       hash[item] = index
  *     }
- *     hash   #=> {"cat"=>0, "wombat"=>2, "dog"=>1}
+ *     hash   #=> {"cat"=>0, "dog"=>1, "wombat"=>2}
  *
  */
 
@@ -1493,10 +1563,10 @@
 }
 
 static VALUE
-take_i(VALUE i, VALUE *arg)
+take_i(VALUE i, VALUE *arg, int argc, VALUE *argv)
 {
     if (arg[1]-- == 0) rb_iter_break();
-    rb_ary_push(arg[0], i);
+    rb_ary_push(arg[0], enum_values_pack(argc, argv));
     return Qnil;
 }
 
@@ -1532,7 +1602,7 @@
 take_while_i(VALUE i, VALUE *ary, int argc, VALUE *argv)
 {
     if (!RTEST(enum_yield(argc, argv))) rb_iter_break();
-    rb_ary_push(*ary, i);
+    rb_ary_push(*ary, enum_values_pack(argc, argv));
     return Qnil;
 }
 
@@ -1560,10 +1630,10 @@
 }
 
 static VALUE
-drop_i(VALUE i, VALUE *arg)
+drop_i(VALUE i, VALUE *arg, int argc, VALUE *argv)
 {
     if (arg[1] == 0) {
-	rb_ary_push(arg[0], i);
+	rb_ary_push(arg[0], enum_values_pack(argc, argv));
     }
     else {
 	arg[1]--;
@@ -1603,7 +1673,9 @@
 static VALUE
 drop_while_i(VALUE i, VALUE *args, int argc, VALUE *argv)
 {
-    if (!args[1] && !RTEST(enum_yield(argc, argv))) {
+    ENUM_WANT_SVALUE();
+
+    if (!args[1] && !RTEST(rb_yield(i))) {
 	args[1] = Qtrue;
     }
     if (args[1]) {
@@ -1640,8 +1712,10 @@
 static VALUE
 cycle_i(VALUE i, VALUE ary, int argc, VALUE *argv)
 {
+    ENUM_WANT_SVALUE();
+
     rb_ary_push(ary, i);
-    enum_yield(argc, argv);
+    rb_yield(i);
     return Qnil;
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]