summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--iseq.c4
-rw-r--r--test/ruby/test_class.rb16
3 files changed, 24 insertions, 0 deletions
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 <shugo@ruby-lang.org>
+
+ * iseq.c (rb_iseq_clone): sets local_iseq and klass properly.
+
Wed Mar 10 21:25:41 2010 Yusuke Endoh <mame@tsg.ne.jp>
* 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