From b3c7867df7cd186e73021f0ed9d17680999f190f Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 8 Nov 2010 22:30:20 +0000 Subject: [PATCH] * error.c (rb_syserr_new): new function to make SystemCallError instance without errno. [EXPERIMENTAL] * error.c (rb_syserr_fail, rb_mod_syserr_fail): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29728 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ error.c | 21 ++++++++++++++++++++- include/ruby/ruby.h | 3 +++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index df57616d80..ee64ca9ece 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Nov 9 07:30:15 2010 Nobuyoshi Nakada + + * 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 * lib/*.rb: Remove unused variable warnings. diff --git a/error.c b/error.c index b355cf890c..29d93fead6 100644 --- a/error.c +++ b/error.c @@ -1532,17 +1532,28 @@ 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) { @@ -1557,6 +1568,14 @@ rb_mod_sys_fail(VALUE mod, const char *mesg) rb_exc_raise(exc); } +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, ...) { 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);