Feature #12092 » 0001-Allow-clone-to-yield-cloned-object-before-freezing.patch
| object.c | ||
|---|---|---|
|
* s1.inspect #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
|
||
|
* s2.inspect #=> "#<Klass:0x401b3998 @str=\"Hi\">"
|
||
|
*
|
||
|
* If a block is given, it is yielded the cloned object before the
|
||
|
* cloned object is frozen (if the receiver is frozen).
|
||
|
*
|
||
|
* This method may have class-specific behavior. If so, that
|
||
|
* behavior will be documented under the #+initialize_copy+ method of
|
||
|
* the class.
|
||
| ... | ... | |
|
init_copy(clone, obj);
|
||
|
rb_funcall(clone, id_init_clone, 1, obj);
|
||
|
if (rb_block_given_p()) {
|
||
|
rb_yield(clone);
|
||
|
}
|
||
|
RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;
|
||
|
return clone;
|
||
| test/ruby/test_object.rb | ||
|---|---|---|
|
assert_throw(:initialize_dup) {obj.dup}
|
||
|
end
|
||
|
def test_clone_with_block
|
||
|
cls = Class.new do
|
||
|
attr_accessor :b
|
||
|
end
|
||
|
obj = cls.new
|
||
|
obj.b = 1
|
||
|
obj.freeze
|
||
|
c = obj.clone{|clone| clone.b = 2}
|
||
|
assert_equal 2, c.b
|
||
|
assert c.frozen?
|
||
|
end
|
||
|
def test_instance_of
|
||
|
assert_raise(TypeError) { 1.instance_of?(1) }
|
||
|
end
|
||