summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorksss <[email protected]>2016-12-21 18:31:44 +0900
committerksss <[email protected]>2016-12-22 10:40:13 +0900
commita68b568911f5dbf762d26ba21e4171bc7a2473e5 (patch)
treeccfde28ec25c50353593392ce094598d9ea1983b
parent3cba13c249457cfb318c9d7d4456d99003442139 (diff)
downloadmruby-a68b568911f5dbf762d26ba21e4171bc7a2473e5.tar.gz
mruby-a68b568911f5dbf762d26ba21e4171bc7a2473e5.zip
Should call initialize method if defined
-rw-r--r--src/proc.c5
-rw-r--r--test/t/proc.rb12
2 files changed, 16 insertions, 1 deletions
diff --git a/src/proc.c b/src/proc.c
index 0fb38359f..a75774667 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -151,6 +151,7 @@ static mrb_value
mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class)
{
mrb_value blk;
+ mrb_value proc;
struct RProc *p;
mrb_get_args(mrb, "&", &blk);
@@ -160,7 +161,9 @@ mrb_proc_s_new(mrb_state *mrb, mrb_value proc_class)
}
p = (struct RProc *)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb_class_ptr(proc_class));
mrb_proc_copy(p, mrb_proc_ptr(blk));
- return mrb_obj_value(p);
+ proc = mrb_obj_value(p);
+ mrb_funcall_with_block(mrb, proc, mrb_intern_lit(mrb, "initialize"), 0, NULL, blk);
+ return proc;
}
static mrb_value
diff --git a/test/t/proc.rb b/test/t/proc.rb
index 888b7d56a..ef4566e66 100644
--- a/test/t/proc.rb
+++ b/test/t/proc.rb
@@ -136,6 +136,18 @@ assert('Proc#return_does_not_break_self') do
assert_equal c, c.block.call
end
+assert('call Proc#initialize if defined') do
+ a = []
+ c = Class.new(Proc) do
+ define_method(:initialize) do
+ a << :ok
+ end
+ end
+
+ assert_kind_of c, c.new{}
+ assert_equal [:ok], a
+end
+
assert('&obj call to_proc if defined') do
pr = Proc.new{}
def mock(&b)