diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-06-19 12:56:08 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-06-19 12:56:08 +0900 |
| commit | 97e94247fa6aca9492c7ecde605059f660bdc146 (patch) | |
| tree | 234c4463579fd199c62e2b3ed962365c4f8e4252 /src | |
| parent | 8f9b958f1e269e6e2c58402ae0409a3a99e8bcf4 (diff) | |
| download | mruby-97e94247fa6aca9492c7ecde605059f660bdc146.tar.gz mruby-97e94247fa6aca9492c7ecde605059f660bdc146.zip | |
Kernel#raise: better argument check
Diffstat (limited to 'src')
| -rw-r--r-- | src/kernel.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/kernel.c b/src/kernel.c index a38e88f47..14d602869 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -1085,7 +1085,7 @@ mrb_obj_public_methods(mrb_state *mrb, mrb_value self) * call-seq: * raise * raise(string) - * raise(exception [, string [, array]]) + * raise(exception [, string]) * * With no arguments, raises a <code>RuntimeError</code> * With a single +String+ argument, raises a @@ -1103,14 +1103,24 @@ mrb_obj_public_methods(mrb_state *mrb, mrb_value self) mrb_value mrb_f_raise(mrb_state *mrb, mrb_value self) { - mrb_value *argv; + mrb_value a[2]; int argc; - mrb_get_args(mrb, "*", &argv, &argc); - if (argc == 0) { + argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]); + switch (argc) { + case 0: mrb_raise(mrb, mrb->eRuntimeError_class, ""); + break; + case 1: + a[1] = mrb_check_string_type(mrb, a[0]); + if (!mrb_nil_p(a[1])) { + argc = 2; + a[0] = mrb_obj_value(mrb->eRuntimeError_class); + } + /* fall through */ + default: + mrb_exc_raise(mrb, mrb_make_exception(mrb, argc, a)); } - mrb_exc_raise(mrb, mrb_make_exception(mrb, argc, argv)); return mrb_nil_value(); /* not reached */ } |
