From f6d18c3f2acaac0071ad38e06d9de8ea50489da1 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 5 Dec 2008 04:05:48 +0000 Subject: * iseq.c (rb_iseq_parameters): proc arguments are always optional. * proc.c (get_proc_iseq, rb_proc_parameters): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20538 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- iseq.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'iseq.c') diff --git a/iseq.c b/iseq.c index 646bc4159d..99361156f1 100644 --- a/iseq.c +++ b/iseq.c @@ -1303,7 +1303,7 @@ simple_default_value(const VALUE *seq, const VALUE *eseq) } VALUE -rb_iseq_parameters(const rb_iseq_t *iseq) +rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc) { int i, r, s; VALUE a, args = rb_ary_new2(iseq->arg_size); @@ -1317,14 +1317,24 @@ rb_iseq_parameters(const rb_iseq_t *iseq) a) CONST_ID(req, "req"); - for (i = 0; i < iseq->argc; i++) { - rb_ary_push(args, PARAM(i, req)); + CONST_ID(opt, "opt"); + if (is_proc) { + for (i = 0; i < iseq->argc; i++) { + PARAM_TYPE(opt); + rb_ary_push(a, rb_id2name(PARAM_ID(i)) ? ID2SYM(PARAM_ID(i)) : Qnil); + rb_ary_push(a, Qnil); + rb_ary_push(args, a); + } + } + else { + for (i = 0; i < iseq->argc; i++) { + rb_ary_push(args, PARAM(i, req)); + } } r = iseq->arg_rest != -1 ? iseq->arg_rest : iseq->arg_post_len > 0 ? iseq->arg_post_start : iseq->arg_block != -1 ? iseq->arg_block : iseq->arg_size; - CONST_ID(opt, "opt"); for (s = i; i < r; i++) { PARAM_TYPE(opt); if (rb_id2name(PARAM_ID(i))) { @@ -1340,8 +1350,18 @@ rb_iseq_parameters(const rb_iseq_t *iseq) rb_ary_push(args, PARAM(iseq->arg_rest, rest)); } r = iseq->arg_post_start + iseq->arg_post_len; - for (i = iseq->arg_post_start; i < r; i++) { - rb_ary_push(args, PARAM(i, req)); + if (is_proc) { + for (i = iseq->arg_post_start; i < r; i++) { + PARAM_TYPE(opt); + rb_ary_push(a, rb_id2name(PARAM_ID(i)) ? ID2SYM(PARAM_ID(i)) : Qnil); + rb_ary_push(a, Qnil); + rb_ary_push(args, a); + } + } + else { + for (i = iseq->arg_post_start; i < r; i++) { + rb_ary_push(args, PARAM(i, req)); + } } if (iseq->arg_block != -1) { CONST_ID(block, "block"); -- cgit v1.2.3