diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-11 08:13:42 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-11 08:13:42 +0000 |
commit | ee0d9720c8dfb6a53a6b9a3164601ee91b0001c3 (patch) | |
tree | 9ab567e01bbd9312a34ed2c1c8139b0852236a7a /class.c | |
parent | 0b78ee7ba9de3fce5200fc2634a39bf320f79049 (diff) | |
download | ruby-ee0d9720c8dfb6a53a6b9a3164601ee91b0001c3.tar.gz ruby-ee0d9720c8dfb6a53a6b9a3164601ee91b0001c3.tar.xz ruby-ee0d9720c8dfb6a53a6b9a3164601ee91b0001c3.zip |
* class.c (clone_method): should copy cbase in cref as well.
[ruby-dev:35116]
* iseq.c (iseq_mark): mark original iseq object.
* iseq.c (iseq_free): do not free internal data if they have
original iseq to belong.
* iseq.c (rb_iseq_clone): a new function to clone iseq value.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@18490 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r-- | class.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -13,6 +13,7 @@ #include "ruby/signal.h" #include "ruby/node.h" #include "ruby/st.h" +#include "vm_core.h" #include <ctype.h> extern st_table *rb_class_tbl; @@ -78,10 +79,17 @@ clone_method(ID mid, NODE *body, struct clone_method_data *data) st_insert(data->tbl, mid, 0); } else { + NODE *fbody = body->nd_body->nd_body; + + if (nd_type(fbody) == RUBY_VM_METHOD_NODE) { + fbody = NEW_NODE(RUBY_VM_METHOD_NODE, 0, + rb_iseq_clone((VALUE)fbody->nd_body, data->klass), + 0); + } st_insert(data->tbl, mid, (st_data_t) NEW_FBODY( - NEW_METHOD(body->nd_body->nd_body, + NEW_METHOD(fbody, data->klass, /* TODO */ body->nd_body->nd_noex), 0)); |