summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-24 13:43:58 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-24 13:43:58 +0000
commitc1a432a7d9a9fee1b96c3af9889d86310e2d3ed7 (patch)
treec80cf50403da9548962e7cfbd8a55cfda3176d8f /array.c
parent5f93fa308bd970eeab9a3028c44577f0af8c636c (diff)
* array.c (rb_ary_equal): should handle recursive array.
* hash.c (hash_equal): should handle recursive hash. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r--array.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/array.c b/array.c
index 6ab12a4d76..3536198347 100644
--- a/array.c
+++ b/array.c
@@ -2328,6 +2328,19 @@ rb_ary_rassoc(VALUE ary, VALUE value)
return Qnil;
}
+static VALUE
+recursive_equal(VALUE ary1, VALUE ary2, int recur)
+{
+ long i;
+
+ if (recur) return Qfalse;
+ for (i=0; i<RARRAY_LEN(ary1); i++) {
+ if (!rb_equal(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
+ return Qfalse;
+ }
+ return Qtrue;
+}
+
/*
* call-seq:
* array == other_array -> bool
@@ -2345,8 +2358,6 @@ rb_ary_rassoc(VALUE ary, VALUE value)
static VALUE
rb_ary_equal(VALUE ary1, VALUE ary2)
{
- long i;
-
if (ary1 == ary2) return Qtrue;
if (TYPE(ary2) != T_ARRAY) {
if (!rb_respond_to(ary2, rb_intern("to_ary"))) {
@@ -2355,11 +2366,7 @@ rb_ary_equal(VALUE ary1, VALUE ary2)
return rb_equal(ary2, ary1);
}
if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return Qfalse;
- for (i=0; i<RARRAY_LEN(ary1); i++) {
- if (!rb_equal(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
- return Qfalse;
- }
- return Qtrue;
+ return rb_exec_recursive(recursive_equal, ary1, ary2);
}
/*