@@ -459,53 +459,29 @@ mrb_bug(mrb_state *mrb, const char *fmt, ...)
459459}
460460
461461mrb_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
511487MRB_API mrb_noreturn void
0 commit comments