summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authorPaolo Bosetti <[email protected]>2012-05-30 22:10:02 -0700
committerPaolo Bosetti <[email protected]>2012-05-30 22:10:02 -0700
commit6dbba7b799e0cf1a86ec86f347bbc1b40420d372 (patch)
treeebbc4d9d1a526833fde0819bcd9a1124be656540 /src/class.c
parent1da34f46f4ff4ddff8f5c525aab13fdfd7eb4a99 (diff)
parentfae483ff2a91e806e714cb7d118c7bfb8aadbeb2 (diff)
downloadmruby-6dbba7b799e0cf1a86ec86f347bbc1b40420d372.tar.gz
mruby-6dbba7b799e0cf1a86ec86f347bbc1b40420d372.zip
Merge branch 'master' of git://github.com/mruby/mruby into XCode
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/class.c b/src/class.c
index b1ed7c0dc..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*
@@ -1100,8 +1109,8 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod)
}
-void
-mrb_undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
+static void
+undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
{
mrb_value m;
@@ -1110,6 +1119,12 @@ mrb_undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
mrb_define_method_vm(mrb, c, a, m);
}
+void
+mrb_undef_method(mrb_state *mrb, struct RClass *c, const char *name)
+{
+ undef_method(mrb, c, mrb_intern(mrb, name));
+}
+
mrb_value
mrb_mod_undef(mrb_state *mrb, mrb_value mod)
{
@@ -1119,7 +1134,7 @@ mrb_mod_undef(mrb_state *mrb, mrb_value mod)
mrb_get_args(mrb, "*", &argv, &argc);
while (argc--) {
- mrb_undef_method(mrb, c, mrb_symbol(*argv));
+ undef_method(mrb, c, mrb_symbol(*argv));
argv++;
}
return mrb_nil_value();
@@ -1170,7 +1185,7 @@ mrb_init_class(mrb_state *mrb)
mrb_name_class(mrb, mod, mrb_intern(mrb, "Module"));
mrb_name_class(mrb, cls, mrb_intern(mrb, "Class"));
- mrb_undef_method(mrb, mod, mrb_intern(mrb, "new"));
+ mrb_undef_method(mrb, mod, "new");
MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE());
mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE());