summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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