GitHub

File tree

  • include

  • mrbgems

    • mruby-bin-debugger/tools/mrdb

    • mruby-bin-mirb/tools/mirb

    • mruby-bin-mruby/tools/mruby

    • mruby-test

  • src

Original file line numberDiff line numberDiff line change

@@ -1270,6 +1270,29 @@ MRB_API mrb_state* mrb_open_core(void);

12701270

MRB_API void mrb_close(mrb_state *mrb);

12711271

MRB_API void mrb_method_cache_clear(mrb_state *mrb);

12721272
1273+

/**

1274+

* Check if mrb_open() succeeded

1275+

*

1276+

* @param mrb

1277+

* Pointer returned from mrb_open() or mrb_open_core().

1278+

* @return

1279+

* Non-zero if initialization succeeded, 0 if failed.

1280+

* @note

1281+

* mrb_open() may return non-NULL even on failure (with mrb->exc set).

1282+

* Use this macro to check for success:

1283+

* @code

1284+

* mrb_state *mrb = mrb_open();

1285+

* if (!MRB_OPEN_SUCCESS(mrb)) {

1286+

* if (mrb) {

1287+

* // Inspect mrb->exc for error details

1288+

* mrb_close(mrb);

1289+

* }

1290+

* return EXIT_FAILURE;

1291+

* }

1292+

* @endcode

1293+

*/

1294+

#define MRB_OPEN_SUCCESS(mrb) ((mrb) && !(mrb)->exc)

1295+
12731296

/**

12741297

* The memory allocation function. You can redefine this function for your own allocator.

12751298

*

Original file line numberDiff line numberDiff line change

@@ -673,8 +673,16 @@ main(int argc, char **argv)

673673
674674

l_restart:

675675
676-

if (mrb == NULL) {

677-

fputs("Invalid mrb_state, exiting mruby\n", stderr);

676+

if (!MRB_OPEN_SUCCESS(mrb)) {

677+

if (mrb) {

678+

/* Initialization failed - print exception details */

679+

mrb_print_error(mrb);

680+

mrb_close(mrb);

681+

}

682+

else {

683+

/* Allocation failed */

684+

fputs("Failed to allocate mrb_state, exiting mrdb\n", stderr);

685+

}

678686

return EXIT_FAILURE;

679687

}

680688
Original file line numberDiff line numberDiff line change

@@ -475,8 +475,16 @@ main(int argc, char **argv)

475475
476476

/* new interpreter instance */

477477

mrb = mrb_open();

478-

if (mrb == NULL) {

479-

fputs("Invalid mrb interpreter, exiting mirb\n", stderr);

478+

if (!MRB_OPEN_SUCCESS(mrb)) {

479+

if (mrb) {

480+

/* Initialization failed - print exception details */

481+

mrb_print_error(mrb);

482+

mrb_close(mrb);

483+

}

484+

else {

485+

/* Allocation failed */

486+

fputs("Failed to allocate mrb_state, exiting mirb\n", stderr);

487+

}

480488

return EXIT_FAILURE;

481489

}

482490
Original file line numberDiff line numberDiff line change

@@ -282,8 +282,16 @@ main(int argc, char **argv)

282282

mrb_value ARGV;

283283

mrb_value v;

284284
285-

if (mrb == NULL) {

286-

fprintf(stderr, "%s: Invalid mrb_state, exiting mruby\n", *argv);

285+

if (!MRB_OPEN_SUCCESS(mrb)) {

286+

if (mrb) {

287+

/* Initialization failed - print exception details */

288+

mrb_print_error(mrb);

289+

mrb_close(mrb);

290+

}

291+

else {

292+

/* Allocation failed */

293+

fprintf(stderr, "%s: Failed to allocate mrb_state, exiting mruby\n", *argv);

294+

}

287295

return EXIT_FAILURE;

288296

}

289297
Original file line numberDiff line numberDiff line change

@@ -290,8 +290,16 @@ main(int argc, char **argv)

290290
291291

/* new interpreter instance */

292292

mrb = mrb_open();

293-

if (mrb == NULL) {

294-

fputs("Invalid mrb_state, exiting test driver", stderr);

293+

if (!MRB_OPEN_SUCCESS(mrb)) {

294+

if (mrb) {

295+

/* Initialization failed - print exception details */

296+

mrb_print_error(mrb);

297+

mrb_close(mrb);

298+

}

299+

else {

300+

/* Allocation failed */

301+

fputs("Failed to allocate mrb_state, exiting test driver", stderr);

302+

}

295303

return EXIT_FAILURE;

296304

}

297305
Original file line numberDiff line numberDiff line change

@@ -741,13 +741,7 @@ mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state*, void*), void *opa

741741

body(mrb, opaque);

742742

err = 0;

743743

} MRB_CATCH(&c_jmp) {

744-

if (mrb->exc) {

745-

mrb_print_error(mrb);

746-

mrb->exc = NULL;

747-

}

748-

else {

749-

mrb_core_init_printabort(mrb);

750-

}

744+

/* Leave mrb->exc set for caller to inspect */

751745

} MRB_END_EXC(&c_jmp);

752746
753747

mrb->jmp = prev_jmp;

Original file line numberDiff line numberDiff line change

@@ -50,8 +50,8 @@ mrb_open_core(void)

5050

mrb->bootstrapping = TRUE;

5151
5252

if (mrb_core_init_protect(mrb, init_gc_and_core, NULL)) {

53-

mrb_close(mrb);

54-

return NULL;

53+

/* Return mrb with mrb->exc set for caller to inspect */

54+

return mrb;

5555

}

5656
5757

mrb_method_cache_clear(mrb);

@@ -74,14 +74,15 @@ mrb_open(void)

7474

{

7575

mrb_state *mrb = mrb_open_core();

7676
77-

if (mrb == NULL) {

78-

return NULL;

77+

if (mrb == NULL || mrb->exc) {

78+

/* Either allocation failed or core init failed */

79+

return mrb;

7980

}

8081
8182

#ifndef MRB_NO_GEMS

8283

if (mrb_core_init_protect(mrb, init_mrbgems, NULL)) {

83-

mrb_close(mrb);

84-

return NULL;

84+

/* Gem init failed - return mrb with mrb->exc set */

85+

return mrb;

8586

}

8687

mrb_gc_arena_restore(mrb, 0);

8788

#endif

Read the original on github.com ↗