なかだです。

At Thu, 15 Apr 2004 23:06:00 +0900,
Yukihiro Matsumoto wrote in [ruby-dev:23391]:
> |1.8でもexitはtrue/falseを受け付けるようになってるんで、あったほ
> |うがすべてtrue/falseで通せるようにはなりますね。
> 
> じゃあ、1.8にも。

一つ見落としてました。SystemExitにもEXIT_SUCCESSかどうか調べる
メソッドがあったほうがいいと思います。

もう一点、ずっと忘れていたんですが、Errno::EXXXXを継承した例外
が実質的に使用不能です。

  $ ruby -e 'class NoFile<Errno::ENOENT;end;raise NoFile'
  -e:1:in `initialize': uninitialized constant NoFile::Errno (NameError)
          from -e:1:in `exception'
          from -e:1:in `raise'
          from -e:1


Index: error.c =================================================================== RCS file: /cvs/ruby/src/ruby/error.c,v retrieving revision 1.96 diff -u -2 -p -r1.96 error.c --- error.c 5 Apr 2004 15:55:06 -0000 1.96 +++ error.c 16 Jul 2004 00:39:42 -0000 @@ -23,4 +23,10 @@ #define va_init_list(a,b) va_start(a) #endif +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif extern const char ruby_version[], ruby_release_date[], ruby_platform[]; @@ -513,5 +519,5 @@ check_backtrace(bt) /* * call-seq: - * exc.set_backtrace(array_ => array + * exc.set_backtrace(array) => array * * Sets the backtrace information associated with <i>exc</i>. The @@ -560,5 +566,4 @@ exit_initialize(argc, argv, exc) */ - static VALUE exit_status(exc) @@ -568,4 +573,19 @@ exit_status(exc) } + +/* + * call-seq: + * system_exit.success? => true or false + * + * Returns +true+ if exiting successful, +false+ if not. + */ + +static VALUE +exit_success_p(exc) + VALUE exc; +{ + return rb_attr_get(exc, rb_intern("status")) == EXIT_SUCCESS; +} + void #ifdef HAVE_STDARG_PROTOTYPES @@ -860,5 +880,4 @@ syserr_initialize(argc, argv, self) #endif char *err; - char *buf; VALUE mesg, error; VALUE klass = rb_obj_class(self); @@ -879,13 +898,15 @@ syserr_initialize(argc, argv, self) else { rb_scan_args(argc, argv, "01", &mesg); - error = rb_const_get_at(klass, rb_intern("Errno")); + error = rb_const_get(klass, rb_intern("Errno")); } if (!NIL_P(error)) err = strerror(NUM2LONG(error)); else err = "unknown error"; if (!NIL_P(mesg)) { - StringValue(mesg); - buf = ALLOCA_N(char, strlen(err)+RSTRING(mesg)->len+4); - sprintf(buf, "%s - %.*s", err, (int)RSTRING(mesg)->len, RSTRING(mesg)->ptr); - mesg = rb_str_new2(buf); + VALUE str = mesg; + StringValue(str); + mesg = rb_str_new(0, strlen(err)+RSTRING(mesg)->len+3); + sprintf(RSTRING(mesg)->ptr, "%s - %.*s", err, + (int)RSTRING(str)->len, RSTRING(str)->ptr); + rb_str_resize(mesg, strlen(RSTRING(mesg)->ptr)); } else { @@ -970,4 +991,5 @@ Init_Exception() rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1); rb_define_method(rb_eSystemExit, "status", exit_status, 0); + rb_define_method(rb_eSystemExit, "status", exit_success_p, 0); rb_eFatal = rb_define_class("fatal", rb_eException);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦