From b1ffb3b3b8a555a876be04922a7868b923d55839 Mon Sep 17 00:00:00 2001 From: h2so5 Date: Tue, 16 Apr 2013 16:03:36 +0900 Subject: Add Proc#arity --- src/proc.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src') 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); -- cgit v1.2.3