GitHub

@@ -459,53 +459,29 @@ mrb_bug(mrb_state *mrb, const char *fmt, ...)

459459

}

460460461461

mrb_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

}

510486511487

MRB_API mrb_noreturn void

Read the original on github.com ↗