diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-04-16 06:24:21 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-04-16 06:24:21 -0700 |
| commit | 4b24ee189ef5b2190562ce4c67d48c3170bdc2a2 (patch) | |
| tree | 67d9a78ddba7aaf5c348640b39f2778576884941 /src | |
| parent | a06e0ab33f255a54d72c0775e5d9e4047064ccb8 (diff) | |
| parent | b1ffb3b3b8a555a876be04922a7868b923d55839 (diff) | |
| download | mruby-4b24ee189ef5b2190562ce4c67d48c3170bdc2a2.tar.gz mruby-4b24ee189ef5b2190562ce4c67d48c3170bdc2a2.zip | |
Merge pull request #1183 from h2so5/proc-arity
Add Proc#arity
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 c32ce9c7a..8ddb06695 100644 --- a/src/proc.c +++ b/src/proc.c @@ -131,6 +131,23 @@ mrb_proc_iseq(mrb_state *mrb, struct RProc *p) return p->body.irep->iseq; } +/* 15.2.17.4.2 */ +static mrb_value +mrb_proc_arity(mrb_state *mrb, mrb_value self) +{ + struct RProc *p = mrb_proc_ptr(self); + mrb_code *iseq = mrb_proc_iseq(mrb, p); + mrb_aspec aspec = *iseq >> 6; + int ma, ra, pa, arity; + + ma = ARGS_GETREQ(aspec); + ra = ARGS_GETREST(aspec); + pa = ARGS_GETPOST(aspec); + arity = ra ? -(ma + pa + 1) : ma + pa; + + return mrb_fixnum_value(arity); +} + /* 15.3.1.2.6 */ /* 15.3.1.3.27 */ /* @@ -181,6 +198,7 @@ mrb_init_proc(mrb_state *mrb) mrb_define_method(mrb, mrb->proc_class, "initialize", mrb_proc_initialize, ARGS_NONE()); mrb_define_method(mrb, mrb->proc_class, "initialize_copy", mrb_proc_init_copy, ARGS_REQ(1)); + mrb_define_method(mrb, mrb->proc_class, "arity", mrb_proc_arity, ARGS_NONE()); m = mrb_proc_new(mrb, call_irep); mrb_define_method_raw(mrb, mrb->proc_class, mrb_intern(mrb, "call"), m); |
