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

ruby-changes:8715

From: matz <ko1@a...>
Date: Tue, 18 Nov 2008 23:31:37 +0900 (JST)
Subject: [ruby-changes:8715] Ruby:r20250 (trunk): * proc.c (proc_eq): equivalence check should not done by pointer

matz	2008-11-18 23:31:15 +0900 (Tue, 18 Nov 2008)

  New Revision: 20250

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20250

  Log:
    * proc.c (proc_eq): equivalence check should not done by pointer
      comparison, but should be based on iseq contents.   [ruby-dev:37101]

  Modified files:
    trunk/ChangeLog
    trunk/proc.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20249)
+++ ChangeLog	(revision 20250)
@@ -1,3 +1,8 @@
+Tue Nov 18 23:02:23 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* proc.c (proc_eq): equivalence check should not done by pointer
+	  comparison, but should be based on iseq contents.   [ruby-dev:37101]
+
 Tue Nov 18 20:30:08 2008  Yukihiro Matsumoto  <matz@r...>
 
 	* lib/net/ftp.rb (Net::FTP#open_socket): SOCKSsocket is obsolete.
Index: proc.c
===================================================================
--- proc.c	(revision 20249)
+++ proc.c	(revision 20250)
@@ -666,12 +666,15 @@
     }
     else {
 	if (TYPE(other)          == T_DATA &&
-	    RBASIC(other)->klass == rb_cProc &&
-	    CLASS_OF(self)       == CLASS_OF(other)) {
+	    RDATA(other)->dmark  == proc_mark) {
 	    rb_proc_t *p1, *p2;
 	    GetProcPtr(self, p1);
 	    GetProcPtr(other, p2);
-	    if (p1->block.iseq == p2->block.iseq && p1->envval == p2->envval) {
+	    if (p1->envval == p2->envval &&
+		p1->block.iseq->iseq_size == p2->block.iseq->iseq_size &&
+		p1->block.iseq->local_size == p2->block.iseq->local_size &&
+		MEMCMP(p1->block.iseq->iseq, p2->block.iseq->iseq, VALUE,
+		       p1->block.iseq->iseq_size) == 0) {
 		return Qtrue;
 	    }
 	}

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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