summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-19 12:56:08 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-19 12:56:08 +0900
commit97e94247fa6aca9492c7ecde605059f660bdc146 (patch)
tree234c4463579fd199c62e2b3ed962365c4f8e4252
parent8f9b958f1e269e6e2c58402ae0409a3a99e8bcf4 (diff)
downloadmruby-97e94247fa6aca9492c7ecde605059f660bdc146.tar.gz
mruby-97e94247fa6aca9492c7ecde605059f660bdc146.zip
Kernel#raise: better argument check
-rw-r--r--src/kernel.c20
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 */
}