diff options
| author | Kazuki Tsujimoto <[email protected]> | 2012-04-22 18:36:28 +0900 |
|---|---|---|
| committer | Kazuki Tsujimoto <[email protected]> | 2012-04-22 19:23:44 +0900 |
| commit | 5859a204fe9e43560993d5c090846ab82ab1f6f7 (patch) | |
| tree | 013e33967dff857ef6adac866f3bb9aaf374b25c /src | |
| parent | 2b9ed5acd140a95b3178b40eaf698955d7ff21eb (diff) | |
| download | mruby-5859a204fe9e43560993d5c090846ab82ab1f6f7.tar.gz mruby-5859a204fe9e43560993d5c090846ab82ab1f6f7.zip | |
Fix SEGV when calling Proc object created by Proc.new
Diffstat (limited to 'src')
| -rw-r--r-- | src/proc.c | 18 |
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); |
