mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* class.c (clone_method): should copy cref as well.
[ruby-core:15833] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@15856 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
133d4448fe
commit
a51d3fd03b
2 changed files with 45 additions and 10 deletions
|
@ -82,6 +82,11 @@ Sat Mar 29 14:18:41 2008 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
|||
|
||||
* ext/tk/sample/tksleep_sample.rb: sample script about Tk.sleep.
|
||||
|
||||
Sat Mar 29 04:08:59 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* class.c (clone_method): should copy cref as well.
|
||||
[ruby-core:15833]
|
||||
|
||||
Mon Mar 24 20:07:42 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||
|
||||
* eval.c (rb_eval): Call trace hook for if expression after the
|
||||
|
|
50
class.c
50
class.c
|
@ -48,13 +48,26 @@ rb_class_new(super)
|
|||
return rb_class_boot(super);
|
||||
}
|
||||
|
||||
struct clone_method_data {
|
||||
st_table *tbl;
|
||||
VALUE klass;
|
||||
};
|
||||
|
||||
static int
|
||||
clone_method(mid, body, tbl)
|
||||
clone_method(mid, body, data)
|
||||
ID mid;
|
||||
NODE *body;
|
||||
st_table *tbl;
|
||||
struct clone_method_data *data;
|
||||
{
|
||||
st_insert(tbl, mid, (st_data_t)NEW_METHOD(body->nd_body, body->nd_noex));
|
||||
NODE *fbody = body->nd_body;
|
||||
|
||||
if (fbody && nd_type(fbody) == NODE_SCOPE) {
|
||||
VALUE cref = data->klass ?
|
||||
(VALUE)NEW_NODE(NODE_CREF,data->klass,0,fbody->nd_rval) :
|
||||
fbody->nd_rval;
|
||||
fbody = NEW_NODE(NODE_SCOPE, fbody->nd_tbl, cref, fbody->nd_next);
|
||||
}
|
||||
st_insert(data->tbl, mid, (st_data_t)NEW_METHOD(fbody, body->nd_noex));
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
|
||||
|
@ -65,7 +78,8 @@ rb_mod_init_copy(clone, orig)
|
|||
{
|
||||
rb_obj_init_copy(clone, orig);
|
||||
if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
|
||||
RBASIC(clone)->klass = rb_singleton_class_clone(orig);
|
||||
RBASIC(clone)->klass = RBASIC(orig)->klass;
|
||||
RBASIC(clone)->klass = rb_singleton_class_clone(clone);
|
||||
}
|
||||
RCLASS(clone)->super = RCLASS(orig)->super;
|
||||
if (RCLASS(orig)->iv_tbl) {
|
||||
|
@ -78,9 +92,12 @@ rb_mod_init_copy(clone, orig)
|
|||
st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0);
|
||||
}
|
||||
if (RCLASS(orig)->m_tbl) {
|
||||
RCLASS(clone)->m_tbl = st_init_numtable();
|
||||
st_foreach(RCLASS(orig)->m_tbl, clone_method,
|
||||
(st_data_t)RCLASS(clone)->m_tbl);
|
||||
struct clone_method_data data;
|
||||
|
||||
data.tbl = RCLASS(clone)->m_tbl = st_init_numtable();
|
||||
data.klass = (VALUE)clone;
|
||||
|
||||
st_foreach(RCLASS(orig)->m_tbl, clone_method, (st_data_t)&data);
|
||||
}
|
||||
|
||||
return clone;
|
||||
|
@ -126,9 +143,22 @@ rb_singleton_class_clone(obj)
|
|||
if (RCLASS(klass)->iv_tbl) {
|
||||
clone->iv_tbl = st_copy(RCLASS(klass)->iv_tbl);
|
||||
}
|
||||
clone->m_tbl = st_init_numtable();
|
||||
st_foreach(RCLASS(klass)->m_tbl, clone_method,
|
||||
(st_data_t)clone->m_tbl);
|
||||
{
|
||||
struct clone_method_data data;
|
||||
|
||||
data.tbl = clone->m_tbl = st_init_numtable();
|
||||
switch (TYPE(obj)) {
|
||||
case T_CLASS:
|
||||
case T_MODULE:
|
||||
data.klass = obj;
|
||||
break;
|
||||
default:
|
||||
data.klass = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
st_foreach(RCLASS(klass)->m_tbl, clone_method, (st_data_t)&data);
|
||||
}
|
||||
rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
|
||||
FL_SET(clone, FL_SINGLETON);
|
||||
return (VALUE)clone;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue