ruby-changes:2018
From: ko1@a...
Date: 24 Sep 2007 22:44:10 +0900
Subject: [ruby-changes:2018] matz - Ruby:r13509 (trunk): * array.c (rb_ary_equal): should handle recursive array.
matz 2007-09-24 22:43:58 +0900 (Mon, 24 Sep 2007) New Revision: 13509 Modified files: trunk/ChangeLog trunk/array.c trunk/hash.c Log: * array.c (rb_ary_equal): should handle recursive array. * hash.c (hash_equal): should handle recursive hash. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/hash.c?r1=13509&r2=13508 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/array.c?r1=13509&r2=13508 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13509&r2=13508 Index: array.c =================================================================== --- array.c (revision 13508) +++ array.c (revision 13509) @@ -2328,6 +2328,19 @@ 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 @@ 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 @@ 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); } /* Index: ChangeLog =================================================================== --- ChangeLog (revision 13508) +++ ChangeLog (revision 13509) @@ -1,3 +1,9 @@ +Mon Sep 24 22:36:13 2007 Yukihiro Matsumoto <matz@r...> + + * 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 <matz@r...> * lib/weakref.rb (WeakRef): remove debug print. [ruby-dev:31799] Index: hash.c =================================================================== --- hash.c (revision 13508) +++ hash.c (revision 13509) @@ -1350,8 +1350,9 @@ } struct equal_data { - int result; + VALUE result; st_table *tbl; + int eql; }; static int @@ -1364,28 +1365,24 @@ data->result = 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 @@ #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); } /* -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml