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

ruby-changes:14992

From: shugo <ko1@a...>
Date: Thu, 11 Mar 2010 01:07:23 +0900 (JST)
Subject: [ruby-changes:14992] Ruby:r26867 (trunk): * iseq.c (rb_iseq_clone): sets local_iseq and klass properly.

shugo	2010-03-11 01:07:06 +0900 (Thu, 11 Mar 2010)

  New Revision: 26867

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

  Log:
    * iseq.c (rb_iseq_clone): sets local_iseq and klass properly.

  Modified files:
    trunk/ChangeLog
    trunk/iseq.c
    trunk/test/ruby/test_class.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26866)
+++ ChangeLog	(revision 26867)
@@ -1,3 +1,7 @@
+Thu Mar 11 01:04:48 2010  Shugo Maeda  <shugo@r...>
+
+	* iseq.c (rb_iseq_clone): sets local_iseq and klass properly.
+
 Wed Mar 10 21:25:41 2010  Yusuke Endoh  <mame@t...>
 
 	* enum.c (min_ii, max_ii, minmax_ii): remove wrong optimization that
Index: iseq.c
===================================================================
--- iseq.c	(revision 26866)
+++ iseq.c	(revision 26867)
@@ -1344,11 +1344,15 @@
     if (!iseq1->orig) {
 	iseq1->orig = iseqval;
     }
+    if (iseq0->local_iseq == iseq0) {
+	iseq1->local_iseq = iseq1;
+    }
     if (newcbase) {
 	iseq1->cref_stack = NEW_BLOCK(newcbase);
 	if (iseq0->cref_stack->nd_next) {
 	    iseq1->cref_stack->nd_next = iseq0->cref_stack->nd_next;
 	}
+	iseq1->klass = newcbase;
     }
 
     return newiseq;
Index: test/ruby/test_class.rb
===================================================================
--- test/ruby/test_class.rb	(revision 26866)
+++ test/ruby/test_class.rb	(revision 26867)
@@ -220,4 +220,20 @@
     assert_raise(SyntaxError) { eval("class C; return; end") }
     assert_raise(SyntaxError) { eval("class C; yield; end") }
   end
+
+  def test_clone
+    original = Class.new {
+      def foo
+        return super()
+      end
+    }
+    mod = Module.new {
+      def foo
+        return "mod#foo"
+      end
+    }
+    copy = original.clone
+    copy.send(:include, mod)
+    assert_equal("mod#foo", copy.new.foo)
+  end
 end

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

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