From c1a432a7d9a9fee1b96c3af9889d86310e2d3ed7 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 24 Sep 2007 13:43:58 +0000 Subject: * 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 --- ChangeLog | 6 ++++++ array.c | 21 ++++++++++++++------- hash.c | 33 ++++++++++++++------------------- 3 files changed, 34 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 994c8b362b..605d580216 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Sep 24 22:36:13 2007 Yukihiro Matsumoto + + * array.c (rb_ary_equal): should handle recursive array. + + * hash.c (hash_equal): should handle recursive hash. + Mon Sep 24 22:14:13 2007 Yukihiro Matsumoto * lib/weakref.rb (WeakRef): remove debug print. [ruby-dev:31799] 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 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; iresult = Qfalse; return ST_STOP; } - if (!rb_eql(val1, val2)) { + if (!(data->eql ? rb_eql(val1, val2) : rb_equal(val1, val2))) { data->result = Qfalse; return ST_STOP; } return ST_CONTINUE; } -static int -equal_i(VALUE key, VALUE val1, struct equal_data *data) +static VALUE +recursive_eql(VALUE hash, VALUE dt, int recur) { - VALUE val2; + struct equal_data *data; - if (key == Qundef) return ST_CONTINUE; - if (!st_lookup(data->tbl, key, &val2)) { - data->result = Qfalse; - return ST_STOP; - } - if (!rb_equal(val1, val2)) { - data->result = Qfalse; - return ST_STOP; - } - return ST_CONTINUE; + if (recur) return Qfalse; + data = (struct equal_data*)dt; + data->result = Qtrue; + rb_hash_foreach(hash, eql_i, (st_data_t)data); + + return data->result; } static VALUE @@ -1414,10 +1411,8 @@ hash_equal(VALUE hash1, VALUE hash2, int eql) #endif data.tbl = RHASH(hash2)->ntbl; - data.result = Qtrue; - rb_hash_foreach(hash1, eql ? eql_i : equal_i, (st_data_t)&data); - - return data.result; + data.eql = eql; + return rb_exec_recursive(recursive_eql, hash1, (VALUE)&data); } /* -- cgit v1.2.3