summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-05-31 11:14:33 +0900
committerYukihiro Matsumoto <[email protected]>2012-05-31 11:14:33 +0900
commite3c1b48ba25e97967a5f27869653af05fad90dd2 (patch)
tree560c4a56cda55d774804d5ab68e96c0ffc46c2a5 /src/class.c
parent3e8d330c2cca7b67edbfa2a03331c03499dbdbf5 (diff)
downloadmruby-e3c1b48ba25e97967a5f27869653af05fad90dd2.tar.gz
mruby-e3c1b48ba25e97967a5f27869653af05fad90dd2.zip
mrb_gets_args strict argc check; now returns argc
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/class.c b/src/class.c
index fa349a015..f96922f4b 100644
--- a/src/class.c
+++ b/src/class.c
@@ -398,10 +398,16 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
sp = a->buf;
}
while ((c = *format++)) {
- if (argc < i) {
- if (opt) continue;
- mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+ switch (c) {
+ case '|': case '*': case '&':
+ break;
+ default:
+ if (argc <= i) {
+ if (opt) continue;
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
+ }
}
+
switch (c) {
case 'o':
{
@@ -556,6 +562,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
case '|':
opt = 1;
break;
+
case '*':
{
mrb_value **var;
@@ -569,6 +576,8 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
*var = sp;
i = argc;
}
+ i = argc;
+ sp += *pl;
}
else {
*pl = 0;
@@ -582,7 +591,7 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
}
va_end(ap);
- return 0;
+ return i;
}
static struct RClass*