diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | error.c | 21 | ||||
-rw-r--r-- | include/ruby/ruby.h | 3 |
3 files changed, 30 insertions, 1 deletions
@@ -1,3 +1,10 @@ +Tue Nov 9 07:30:15 2010 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * error.c (rb_syserr_new): new function to make SystemCallError + instance without errno. [EXPERIMENTAL] + + * error.c (rb_syserr_fail, rb_mod_syserr_fail): ditto. + Tue Nov 9 05:54:57 2010 Marc-Andre Lafortune <ruby-core@marc-andre.ca> * lib/*.rb: Remove unused variable warnings. @@ -1532,18 +1532,29 @@ static VALUE make_errno_exc(const char *mesg) { int n = errno; - VALUE arg; errno = 0; if (n == 0) { rb_bug("rb_sys_fail(%s) - errno == 0", mesg ? mesg : ""); } + return rb_syserr_new(n, mesg); +} +VALUE +rb_syserr_new(int n, const char *mesg) +{ + VALUE arg; arg = mesg ? rb_str_new2(mesg) : Qnil; return rb_class_new_instance(1, &arg, get_syserr(n)); } void +rb_syserr_fail(int e, const char *mesg) +{ + rb_exc_raise(rb_syserr_new(e, mesg)); +} + +void rb_sys_fail(const char *mesg) { rb_exc_raise(make_errno_exc(mesg)); @@ -1558,6 +1569,14 @@ rb_mod_sys_fail(VALUE mod, const char *mesg) } void +rb_mod_syserr_fail(VALUE mod, int e, const char *mesg) +{ + VALUE exc = rb_syserr_new(e, mesg); + rb_extend_object(exc, mod); + rb_exc_raise(exc); +} + +void rb_sys_warning(const char *fmt, ...) { char buf[BUFSIZ]; diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index 4a3e0ffc71..3dc61e2738 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1152,6 +1152,9 @@ NORETURN(void rb_mod_sys_fail(VALUE, const char*)); NORETURN(void rb_iter_break(void)); NORETURN(void rb_exit(int)); NORETURN(void rb_notimplement(void)); +VALUE rb_syserr_new(int, const char *); +NORETURN(void rb_syserr_fail(int, const char*)); +NORETURN(void rb_mod_syserr_fail(VALUE, int, const char*)); /* reports if `-W' specified */ PRINTF_ARGS(void rb_warning(const char*, ...), 1, 2); |