mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Fix protect exception for print error message
This commit is contained in:
+9
-1
@@ -490,6 +490,8 @@ mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt,
|
||||
mrb_exc_raise(mrb, exc);
|
||||
}
|
||||
|
||||
void mrb_core_init_printabort(void);
|
||||
|
||||
int
|
||||
mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *opaque)
|
||||
{
|
||||
@@ -502,7 +504,13 @@ mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *o
|
||||
body(mrb, opaque);
|
||||
err = 0;
|
||||
} MRB_CATCH(&c_jmp) {
|
||||
mrb->exc = NULL;
|
||||
if (mrb->exc) {
|
||||
mrb_p(mrb, mrb_obj_value(mrb->exc));
|
||||
mrb->exc = NULL;
|
||||
}
|
||||
else {
|
||||
mrb_core_init_printabort();
|
||||
}
|
||||
} MRB_END_EXC(&c_jmp);
|
||||
|
||||
mrb->jmp = prev_jmp;
|
||||
|
||||
+27
-3
@@ -7,24 +7,48 @@
|
||||
#include <mruby.h>
|
||||
#include <mruby/string.h>
|
||||
#include <mruby/variable.h>
|
||||
#include <mruby/error.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef MRB_DISABLE_STDIO
|
||||
static void
|
||||
printcstr(const char *str, size_t len, FILE *stream)
|
||||
{
|
||||
if (str) {
|
||||
fwrite(str, len, 1, stream);
|
||||
putc('\n', stream);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
printstr(mrb_value obj, FILE *stream)
|
||||
{
|
||||
if (mrb_string_p(obj)) {
|
||||
fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stream);
|
||||
putc('\n', stream);
|
||||
printcstr(RSTRING_PTR(obj), RSTRING_LEN(obj), stream);
|
||||
}
|
||||
}
|
||||
#else
|
||||
# define printcstr(str, len, stream) (void)0
|
||||
# define printstr(obj, stream) (void)0
|
||||
#endif
|
||||
|
||||
void
|
||||
mrb_core_init_printabort(void)
|
||||
{
|
||||
static const char *str = "Failed mruby core initialization";
|
||||
printcstr(str, strlen(str), stdout);
|
||||
}
|
||||
|
||||
MRB_API void
|
||||
mrb_p(mrb_state *mrb, mrb_value obj)
|
||||
{
|
||||
printstr(mrb_inspect(mrb, obj), stdout);
|
||||
if (mrb_type(obj) == MRB_TT_EXCEPTION && mrb_obj_ptr(obj) == mrb->nomem_err) {
|
||||
static const char *str = "Out of memory";
|
||||
printcstr(str, strlen(str), stdout);
|
||||
}
|
||||
else {
|
||||
printstr(mrb_inspect(mrb, obj), stdout);
|
||||
}
|
||||
}
|
||||
|
||||
MRB_API void
|
||||
|
||||
Reference in New Issue
Block a user