summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/proc.c18
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);