Fix protect exception for print error message

This commit is contained in:
dearblue
2019-01-20 15:25:09 +09:00
parent 100642750e
commit d9c7b6be6e
2 changed files with 36 additions and 4 deletions
+9 -1
View File
@@ -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
View File
@@ -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