From: Yui NARUSE Date: 2011-08-29T16:21:27+09:00 Subject: [ruby-dev:44438] [Ruby 1.9 - Bug #5249] C の Proc の比較のバグ Issue #5249 has been updated by Yui NARUSE. Subject changed from ] C の Proc の比較のバグ to C ��� Proc ������������������ Category set to core ruby -v changed from - to ruby 1.9.3dev (2011-08-02 revision 32810) [i686-linux] ---------------------------------------- Bug #5249: C ��� Proc ������������������ http://redmine.ruby-lang.org/issues/5249 Author: Anonymous Status: Open Priority: Normal Assignee: Category: core Target version: ruby -v: ruby 1.9.3dev (2011-08-02 revision 32810) [i686-linux] ��������������������� Proc#eq(C ������������ proc.c ������ proc_eq)������C ��������������� Proc (rb_proc_new ������������������������)������������������������������������������������������ C ��������������� Proc ��������������� iseq ��������������������������������������������������������� ������������ segv ��������������� false ������������ true ��������������������������� ��������������� proc_eq ���������������������������������������Proc ������������������������������ proc->block.iseq->iseq_size, proc->block.iseq->local_size, proc->block.iseq->iseq ������������������������������������ proc->block.iseq ��� IFUNC_NODE ������������������������������������������������������������ ������������������������������������������ /* ��������������� */ static VALUE proc_eq(VALUE self, VALUE other) { if (self == other) { return Qtrue; } else { if (rb_obj_is_proc(other)) { rb_proc_t *p1, *p2; GetProcPtr(self, p1); GetProcPtr(other, p2); 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; } } } return Qfalse; } ������������ sample.zip ������proc_eq ������������������������������������������������������������ ��������������������������������� ���������������������������RUBY_VM_IFUNC_P ��� C ��� Proc ���������������������������proc ��� ������������ C ��� Proc ���������������������node->nd_cfnc, node->nd_aid, node->nd_tval ��������������������� ������������������������������������������������ ��������������������������������������� /* ��������� */ diff --git proc.c proc.c index 427d1fe..e304295 100644 --- proc.c +++ proc.c @@ -766,7 +766,18 @@ proc_eq(VALUE self, VALUE other) rb_proc_t *p1, *p2; GetProcPtr(self, p1); GetProcPtr(other, p2); - if (p1->envval == p2->envval && + if (RUBY_VM_IFUNC_P(p1->block.iseq) && RUBY_VM_IFUNC_P(p2->block.iseq)) { + NODE *nd_ifunc1, *nd_ifunc2; + + nd_ifunc1 = (NODE *)p1->block.iseq; + nd_ifunc2 = (NODE *)p2->block.iseq; + if(nd_ifunc1->nd_cfnc == nd_ifunc2->nd_cfnc && + nd_ifunc1->nd_aid == nd_ifunc2->nd_aid && + rb_funcall(nd_ifunc1->nd_tval, idEq, 1, nd_ifunc2->nd_tval)) { + return Qtrue; + } + } else if (p1->envval == p2->envval && + !RUBY_VM_IFUNC_P(p1->block.iseq) && !RUBY_VM_IFUNC_P(p2->block.iseq) && 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, -- http://redmine.ruby-lang.org