[前][次][番号順一覧][スレッド一覧]

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

[前][次][番号順一覧][スレッド一覧]