diff --git a/ChangeLog b/ChangeLog index c1ec2735ad..e80b4c6008 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Mar 11 01:04:48 2010 Shugo Maeda + + * iseq.c (rb_iseq_clone): sets local_iseq and klass properly. + Wed Mar 10 21:25:41 2010 Yusuke Endoh * enum.c (min_ii, max_ii, minmax_ii): remove wrong optimization that diff --git a/iseq.c b/iseq.c index 80364ca751..fc13d70cc0 100644 --- a/iseq.c +++ b/iseq.c @@ -1344,11 +1344,15 @@ rb_iseq_clone(VALUE iseqval, VALUE newcbase) 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; diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb index 3a0ced8be7..c81f0752d4 100644 --- a/test/ruby/test_class.rb +++ b/test/ruby/test_class.rb @@ -220,4 +220,20 @@ class TestClass < Test::Unit::TestCase 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