From 7103e032746df1b4359f6e6a6bb117ad7a434aa1 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Wed, 13 Mar 2013 09:55:06 +0900 Subject: mrb_sys_fail raises SystemCallError if we have it. --- src/class.c | 6 ++++++ src/error.c | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 0ba702919..a00000375 100644 --- a/src/class.c +++ b/src/class.c @@ -203,6 +203,12 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id return c; } +int +mrb_class_defined(mrb_state *mrb, const char *name) +{ + return mrb_const_defined(mrb, mrb_obj_value(mrb->object_class), mrb_intern(mrb, name)); +} + static struct RClass * class_from_sym(mrb_state *mrb, struct RClass *klass, mrb_sym id) { diff --git a/src/error.c b/src/error.c index ed30173bc..9dd8890ba 100644 --- a/src/error.c +++ b/src/error.c @@ -5,6 +5,7 @@ */ #include "mruby.h" +#include #include #include #include @@ -401,7 +402,20 @@ mrb_make_exception(mrb_state *mrb, int argc, mrb_value *argv) void mrb_sys_fail(mrb_state *mrb, const char *mesg) { - mrb_raise(mrb, E_RUNTIME_ERROR, mesg); + struct RClass *sce; + mrb_int no; + + no = (mrb_int)errno; + if (mrb_class_defined(mrb, "SystemCallError")) { + sce = mrb_class_get(mrb, "SystemCallError"); + if (mesg != NULL) { + mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new2(mrb, mesg)); + } else { + mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 1, mrb_fixnum_value(no)); + } + } else { + mrb_raise(mrb, E_RUNTIME_ERROR, mesg); + } } void -- cgit v1.2.3 From c0b844033f19cc6ae2a2beee5383f335eebaeba4 Mon Sep 17 00:00:00 2001 From: Tomoyuki Sahara Date: Wed, 13 Mar 2013 10:29:17 +0900 Subject: mrb_str_new2 -> mrb_str_new_cstr --- src/error.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/error.c b/src/error.c index 98b32a7bb..6bd891768 100644 --- a/src/error.c +++ b/src/error.c @@ -409,7 +409,7 @@ mrb_sys_fail(mrb_state *mrb, const char *mesg) if (mrb_class_defined(mrb, "SystemCallError")) { sce = mrb_class_get(mrb, "SystemCallError"); if (mesg != NULL) { - mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new2(mrb, mesg)); + mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 2, mrb_fixnum_value(no), mrb_str_new_cstr(mrb, mesg)); } else { mrb_funcall(mrb, mrb_obj_value(sce), "_sys_fail", 1, mrb_fixnum_value(no)); } -- cgit v1.2.3