[Feature #19362] Call #initialize_dup
hook at Proc#dup
This commit is contained in:
parent
7d159a8787
commit
1507118f0b
12
proc.c
12
proc.c
@ -152,6 +152,16 @@ proc_clone(VALUE self)
|
|||||||
{
|
{
|
||||||
VALUE procval = rb_proc_dup(self);
|
VALUE procval = rb_proc_dup(self);
|
||||||
CLONESETUP(procval, self);
|
CLONESETUP(procval, self);
|
||||||
|
rb_check_funcall(procval, idInitialize_clone, 1, &self);
|
||||||
|
return procval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* :nodoc: */
|
||||||
|
static VALUE
|
||||||
|
proc_dup(VALUE self)
|
||||||
|
{
|
||||||
|
VALUE procval = rb_proc_dup(self);
|
||||||
|
rb_check_funcall(procval, idInitialize_dup, 1, &self);
|
||||||
return procval;
|
return procval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4258,7 +4268,7 @@ Init_Proc(void)
|
|||||||
rb_define_method(rb_cProc, "to_proc", proc_to_proc, 0);
|
rb_define_method(rb_cProc, "to_proc", proc_to_proc, 0);
|
||||||
rb_define_method(rb_cProc, "arity", proc_arity, 0);
|
rb_define_method(rb_cProc, "arity", proc_arity, 0);
|
||||||
rb_define_method(rb_cProc, "clone", proc_clone, 0);
|
rb_define_method(rb_cProc, "clone", proc_clone, 0);
|
||||||
rb_define_method(rb_cProc, "dup", rb_proc_dup, 0);
|
rb_define_method(rb_cProc, "dup", proc_dup, 0);
|
||||||
rb_define_method(rb_cProc, "hash", proc_hash, 0);
|
rb_define_method(rb_cProc, "hash", proc_hash, 0);
|
||||||
rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
|
rb_define_method(rb_cProc, "to_s", proc_to_s, 0);
|
||||||
rb_define_alias(rb_cProc, "inspect", "to_s");
|
rb_define_alias(rb_cProc, "inspect", "to_s");
|
||||||
|
@ -388,6 +388,15 @@ class TestProc < Test::Unit::TestCase
|
|||||||
def test_dup_subclass
|
def test_dup_subclass
|
||||||
c1 = Class.new(Proc)
|
c1 = Class.new(Proc)
|
||||||
assert_equal c1, c1.new{}.dup.class, '[Bug #17545]'
|
assert_equal c1, c1.new{}.dup.class, '[Bug #17545]'
|
||||||
|
c1 = Class.new(Proc) {def initialize_dup(*) throw :initialize_dup; end}
|
||||||
|
assert_throw(:initialize_dup) {c1.new{}.dup}
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_clone_subclass
|
||||||
|
c1 = Class.new(Proc)
|
||||||
|
assert_equal c1, c1.new{}.clone.class, '[Bug #17545]'
|
||||||
|
c1 = Class.new(Proc) {def initialize_clone(*) throw :initialize_clone; end}
|
||||||
|
assert_throw(:initialize_clone) {c1.new{}.clone}
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_binding
|
def test_binding
|
||||||
|
Loading…
x
Reference in New Issue
Block a user