diff options
author | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-18 14:48:15 +0000 |
---|---|---|
committer | knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-18 14:48:15 +0000 |
commit | 32378c5abea38a8278dae28eae9abcd547ac8a95 (patch) | |
tree | 487ef01d777ec0d46b709b9173dc808becb0f87b /eval.c | |
parent | 74efef0be85061c3c9e24ee0cfdf5f83c2af9a22 (diff) |
Merge r16206 and r16239 from ruby_1_8.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@16457 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -8414,6 +8414,19 @@ proc_dup(self) return bind; } +VALUE +rb_block_dup(self, klass, cref) + VALUE self, klass, cref; +{ + struct BLOCK *block; + VALUE obj = proc_dup(self); + Data_Get_Struct(obj, struct BLOCK, block); + block->klass = klass; + block->cref = NEW_NODE(nd_type(block->cref), cref, block->cref->u2.node, + block->cref->u3.node); + return obj; +} + /* * call-seq: * binding -> a_binding @@ -9340,6 +9353,29 @@ method_clone(self) return clone; } +VALUE +rb_method_dup(self, klass, cref) + VALUE self; + VALUE klass; + VALUE cref; +{ + VALUE clone; + struct METHOD *orig, *data; + + Data_Get_Struct(self, struct METHOD, orig); + clone = Data_Make_Struct(CLASS_OF(self),struct METHOD, bm_mark, free, data); + *data = *orig; + data->rklass = klass; + if (data->body->nd_rval) { + NODE *tmp = NEW_NODE(nd_type(data->body->u2.node), cref, + data->body->u2.node->u2.node, + data->body->u2.node->u3.node); + data->body = NEW_NODE(nd_type(data->body), data->body->u1.node, tmp, + data->body->u3.node); + } + return clone; +} + /* * call-seq: * meth.call(args, ...) => obj |