This project is closed and read-only.
Bug #199 » 1.8.6p230_smartleaf_fix.patch
| class.c (revision 17218) | ||
|---|---|---|
|
return rb_class_boot(super);
|
||
|
}
|
||
|
struct clone_method_data {
|
||
|
st_table *tbl;
|
||
|
VALUE klass;
|
||
|
};
|
||
|
static int
|
||
|
clone_method(mid, body, data)
|
||
|
clone_method(mid, body, tbl)
|
||
|
ID mid;
|
||
|
NODE *body;
|
||
|
struct clone_method_data *data;
|
||
|
st_table *tbl;
|
||
|
{
|
||
|
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));
|
||
|
st_insert(tbl, mid, (st_data_t)NEW_METHOD(body->nd_body, body->nd_noex));
|
||
|
return ST_CONTINUE;
|
||
|
}
|
||
| ... | ... | |
|
{
|
||
|
rb_obj_init_copy(clone, orig);
|
||
|
if (!FL_TEST(CLASS_OF(clone), FL_SINGLETON)) {
|
||
|
RBASIC(clone)->klass = RBASIC(orig)->klass;
|
||
|
RBASIC(clone)->klass = rb_singleton_class_clone(clone);
|
||
|
RBASIC(clone)->klass = rb_singleton_class_clone(orig);
|
||
|
}
|
||
|
RCLASS(clone)->super = RCLASS(orig)->super;
|
||
|
if (RCLASS(orig)->iv_tbl) {
|
||
| ... | ... | |
|
st_delete(RCLASS(clone)->iv_tbl, (st_data_t*)&id, 0);
|
||
|
}
|
||
|
if (RCLASS(orig)->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);
|
||
|
RCLASS(clone)->m_tbl = st_init_numtable();
|
||
|
st_foreach(RCLASS(orig)->m_tbl, clone_method,
|
||
|
(st_data_t)RCLASS(clone)->m_tbl);
|
||
|
}
|
||
|
return clone;
|
||
| ... | ... | |
|
if (RCLASS(klass)->iv_tbl) {
|
||
|
clone->iv_tbl = st_copy(RCLASS(klass)->iv_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);
|
||
|
}
|
||
|
clone->m_tbl = st_init_numtable();
|
||
|
st_foreach(RCLASS(klass)->m_tbl, clone_method,
|
||
|
(st_data_t)clone->m_tbl);
|
||
|
rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);
|
||
|
FL_SET(clone, FL_SINGLETON);
|
||
|
return (VALUE)clone;
|
||
| ChangeLog (revision 17218) | ||
|---|---|---|
|
Fri Jun 13 13:14:31 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||
|
* ext/dl/ptr.c (dlmem_each_i): typo fixed. a patch from IKOMA
|
||
|
Sun Jun 15 21:06:12 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||
|
* class.c (clone_method): should copy cref as well.
|
||
|
[ruby-core:15833]
|
||
|
Yoshiki <ikoma@mb.i-chubu.ne.jp> in [ruby-dev:33776].
|
||
|
Fri Jun 13 13:13:23 2008 URABE Shyouhei <shyouhei@ice.uec.ac.jp>
|
||