Skip to content

Commit 78137f3

Browse files
committed
error.c (mrb_make_exception): reinvent exception creation
The arguments of mrb_make_exception() has changed. I believe no one is using the function, but beware.
1 parent 431f83e commit 78137f3

File tree

3 files changed

+29
-51
lines changed

3 files changed

+29
-51
lines changed

include/mruby/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ mrb_value mrb_get_backtrace(mrb_state *mrb);
5252
void mrb_exc_mesg_set(mrb_state *mrb, struct RException *exc, mrb_value mesg);
5353
mrb_value mrb_exc_mesg_get(mrb_state *mrb, struct RException *exc);
5454
mrb_value mrb_f_raise(mrb_state*, mrb_value);
55-
mrb_value mrb_make_exception(mrb_state *mrb, mrb_int argc, const mrb_value *argv);
55+
mrb_value mrb_make_exception(mrb_state *mrb, mrb_value exc, mrb_value mesg);
5656

5757
/* gc */
5858
void mrb_gc_mark_mt(mrb_state*, struct RClass*);

src/error.c

Lines changed: 19 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -459,53 +459,29 @@ mrb_bug(mrb_state *mrb, const char *fmt, ...)
459459
}
460460

461461
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;
495465

496-
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
}
510486

511487
MRB_API mrb_noreturn void

src/kernel.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -380,24 +380,26 @@ mrb_false(mrb_state *mrb, mrb_value self)
380380
MRB_API mrb_value
381381
mrb_f_raise(mrb_state *mrb, mrb_value self)
382382
{
383-
mrb_value a[2], exc;
383+
mrb_value exc, mesg;
384384
mrb_int argc;
385385

386-
argc = mrb_get_args(mrb, "|oo", &a[0], &a[1]);
386+
argc = mrb_get_args(mrb, "|oo", &exc, &mesg);
387387
mrb->c->ci->mid = 0;
388388
switch (argc) {
389389
case 0:
390390
mrb_raise(mrb, E_RUNTIME_ERROR, "");
391391
break;
392392
case 1:
393-
if (mrb_string_p(a[0])) {
394-
a[1] = a[0];
395-
argc = 2;
396-
a[0] = mrb_obj_value(E_RUNTIME_ERROR);
393+
if (mrb_string_p(exc)) {
394+
mesg = exc;
395+
exc = mrb_obj_value(E_RUNTIME_ERROR);
396+
}
397+
else {
398+
mesg = mrb_nil_value();
397399
}
398400
/* fall through */
399401
default:
400-
exc = mrb_make_exception(mrb, argc, a);
402+
exc = mrb_make_exception(mrb, exc, mesg);
401403
mrb_exc_raise(mrb, exc);
402404
break;
403405
}

0 commit comments

Comments
 (0)