summaryrefslogtreecommitdiffhomepage
path: root/src/proc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2012-04-22 16:55:49 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2012-04-22 16:55:49 -0700
commit7feb68eb9030dc15f216479b45533428534b050e (patch)
tree8e34836646ab834401dce58ff29b2be1ea09e160 /src/proc.c
parent484a5f6779abd752fb95f107dec6fa79465f52c7 (diff)
parent5859a204fe9e43560993d5c090846ab82ab1f6f7 (diff)
downloadmruby-7feb68eb9030dc15f216479b45533428534b050e.tar.gz
mruby-7feb68eb9030dc15f216479b45533428534b050e.zip
Merge pull request #37 from k-tsj/fix-proc-segv
Fix SEGV when calling Proc object created by Proc.new
Diffstat (limited to 'src/proc.c')
-rw-r--r--src/proc.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/proc.c b/src/proc.c
index aae9b1932..502650ff5 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -50,6 +50,22 @@ mrb_proc_new_cfunc(mrb_state *mrb, mrb_func_t func)
return p;
}
+static mrb_value
+mrb_proc_initialize(mrb_state *mrb, mrb_value self)
+{
+ mrb_value blk = mrb->stack[mrb->ci->argc+1];
+
+ if (!mrb_nil_p(blk)) {
+ *mrb_proc_ptr(self) = *mrb_proc_ptr(blk);
+ }
+ else {
+ /* Calling Proc.new without a block is not implemented yet */
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "tried to create Proc object without a block");
+ }
+
+ return self;
+}
+
int
mrb_proc_cfunc_p(struct RProc *p)
{
@@ -86,6 +102,8 @@ mrb_init_proc(mrb_state *mrb)
mrb->proc_class = mrb_define_class(mrb, "Proc", mrb->object_class);
+ mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, ARGS_NONE());
+
m = mrb_proc_new(mrb, call_irep);
mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "call"), m);
mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "[]"), m);