@@ -459,53 +459,29 @@ mrb_bug(mrb_state *mrb, const char *fmt, ...)
459459}
460460461461mrb_value
462-mrb_make_exception(mrb_state *mrb, mrb_int argc, const mrb_value *argv)
462+mrb_make_exception(mrb_state *mrb, mrb_value exc, mrb_value mesg)
463463{
464-mrb_value mesg;
465-int n;
466-467-mesg = mrb_nil_value();
468-switch (argc) {
469-case 0:
470-break;
471-case 1:
472-if (mrb_nil_p(argv[0]))
473-break;
474-if (mrb_string_p(argv[0])) {
475-mesg = mrb_exc_new_str(mrb, E_RUNTIME_ERROR, argv[0]);
476-break;
477- }
478-n = 0;
479- goto exception_call;
480-481-case 2:
482-case 3:
483-n = 1;
484-exception_call:
485- {
486-mrb_sym exc = MRB_SYM(exception);
487-if (mrb_respond_to(mrb, argv[0], exc)) {
488-mesg = mrb_funcall_argv(mrb, argv[0], exc, n, argv+1);
489- }
490-else {
491-/* undef */
492-mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected");
493- }
494- }
464+mrb_int n = 1;
495465496-break;
497-default:
498-mrb_argnum_error(mrb, argc, 0, 3);
499-break;
466+if (mrb_nil_p(mesg)) {
467+n = 0;
500468 }
501-if (argc > 0) {
502-if (mrb_type(mesg) != MRB_TT_EXCEPTION)
503-mrb_raise(mrb, E_EXCEPTION, "exception object expected");
504-if (argc > 2)
505-set_backtrace(mrb, mesg, argv[2]);
469+if (mrb_class_p(exc)) {
470+exc = mrb_funcall_argv(mrb, exc, MRB_SYM(new), n, &mesg);
506471 }
507-508-return mesg;
472+else if (mrb_exception_p(exc)) {
473+if (n > 0) {
474+exc = mrb_obj_clone(mrb, exc);
475+mrb_exc_mesg_set(mrb, mrb_exc_ptr(exc), mesg);
476+ }
477+ }
478+else {
479+mrb_raise(mrb, E_TYPE_ERROR, "exception class/object expected");
480+ }
481+if (mrb_type(exc) != MRB_TT_EXCEPTION) {
482+mrb_raise(mrb, E_EXCEPTION, "exception object expected");
483+ }
484+return exc;
509485}
510486511487MRB_API mrb_noreturn void