From 3d6fde336547463461180b9be5b1730194764d9c Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 18 Feb 2000 06:59:36 +0000 Subject: 2000-02-18 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@621 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- class.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'class.c') diff --git a/class.c b/class.c index 19171d71cf..19f700bc8c 100644 --- a/class.c +++ b/class.c @@ -598,19 +598,13 @@ rb_scan_args(argc, argv, fmt, va_alist) va_dcl #endif { - int n, i; + int n, i = 0; const char *p = fmt; VALUE *var; va_list vargs; va_init_list(vargs, fmt); - if (*p == '*') { - var = va_arg(vargs, VALUE*); - *var = rb_ary_new4(argc, argv); - return argc; - } - if (ISDIGIT(*p)) { n = *p - '0'; if (n > argc) @@ -643,21 +637,34 @@ rb_scan_args(argc, argv, fmt, va_alist) var = va_arg(vargs, VALUE*); if (argc > i) { if (var) *var = rb_ary_new4(argc-i, argv+i); + i = argc; } else { if (var) *var = rb_ary_new(); } + p++; } - else if (*p == '\0') { - if (argc > i) { - rb_raise(rb_eArgError, "wrong # of arguments(%d for %d)", argc, i); + + if (*p == '&') { + var = va_arg(vargs, VALUE*); + if (rb_iterator_p()) { + *var = rb_f_lambda(); + } + else { + *var = Qnil; } + p++; } - else { + va_end(vargs); + + if (*p != '\0') { goto error; } - va_end(vargs); + if (argc > i) { + rb_raise(rb_eArgError, "wrong # of arguments(%d for %d)", argc, i); + } + return argc; error: -- cgit v1.2.3