summaryrefslogtreecommitdiff
path: root/iseq.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-12-05 04:05:48 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-12-05 04:05:48 +0000
commitf6d18c3f2acaac0071ad38e06d9de8ea50489da1 (patch)
tree3fb0d50e336d12f469c988c78d5eebaaa5524fef /iseq.c
parented19ff6bdb7c194212bb3bcfd013472870cf4815 (diff)
* 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
Diffstat (limited to 'iseq.c')
-rw-r--r--iseq.c32
1 files changed, 26 insertions, 6 deletions
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");