aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-10-11 05:59:41 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-10-11 05:59:41 +0000
commit4d49ec8d3f96d2d675cbeb930bd548739e123240 (patch)
treee667e2073525e2806d6108cb8b1150b1bba5f808
parentfedfa6e5fac9ffc3b1ac7fbbcbaec39ca0cf54a1 (diff)
downloadruby-4d49ec8d3f96d2d675cbeb930bd548739e123240.tar.gz
* array.c (rb_ary_each): prohibit array modification during each
iteration. [ruby-core:09104] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11124 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--array.c36
2 files changed, 41 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f988ece3e8..93a17fb6e5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Oct 11 14:58:44 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * array.c (rb_ary_each): prohibit array modification during each
+ iteration. [ruby-core:09104]
+
Wed Oct 11 14:56:10 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/digest/sha1/sha1ossl.h: libssl 0.9.8c-3 defines no
diff --git a/array.c b/array.c
index e488b556d2..3492f192aa 100644
--- a/array.c
+++ b/array.c
@@ -1245,6 +1245,42 @@ iter_unlock(VALUE ary)
return ary;
}
+VALUE
+each_internal(VALUE ary)
+{
+ long i;
+
+ for (i=0; i<RARRAY_LEN(ary); i++) {
+ rb_yield(RARRAY_PTR(ary)[i]);
+ }
+ return ary;
+}
+
+static VALUE
+iter_unlock(VALUE ary)
+{
+ FL_UNSET(ary, ARY_TMPLOCK);
+ return ary;
+}
+
+VALUE
+each_internal(VALUE ary)
+{
+ long i;
+
+ for (i=0; i<RARRAY_LEN(ary); i++) {
+ rb_yield(RARRAY_PTR(ary)[i]);
+ }
+ return ary;
+}
+
+static VALUE
+iter_unlock(VALUE ary)
+{
+ FL_UNSET(ary, ARY_TMPLOCK);
+ return ary;
+}
+
/*
* call-seq:
* array.each {|item| block } -> array