[#23884] Ruby 1.8.2 preview1にむけて — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

34 messages 2004/07/13
[#23917] Re: Ruby 1.8.2 preview1にむけて — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/07/16

山本です。

[#23920] Re: Ruby 1.8.2 preview1にむけて — "NAKAMURA, Hiroshi" <nakahiro@...> 2004/07/16

なひです。

[#23922] ruby 1.8.2 preview1 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

27 messages 2004/07/16

[#23995] String#each -> String#each_char — Shugo Maeda <shugo@...>

前田です。

27 messages 2004/07/30
[#23996] Re: String#each -> String#each_char — matz@... (Yukihiro Matsumoto) 2004/07/30

まつもと ゆきひろです

[#23997] Re: String#each -> String#each_char — "U.Nakamura" <usa@...> 2004/07/30

こんにちは、なかむら(う)です。

[#23999] Re: String#each -> String#each_char — matz@... (Yukihiro Matsumoto) 2004/07/30

まつもと ゆきひろです

[#24000] Re: String#each -> String#each_char — "U.Nakamura" <usa@...> 2004/07/30

こんにちは、なかむら(う)です。

[#24005] Re: String#each -> String#each_char — Minero Aoki <aamine@...> 2004/07/31

青木です。

[#24012] Re: String#each -> String#each_char — Shugo Maeda <shugo@...> 2004/08/01

前田です。

[#24014] Re: String#each -> String#each_char — Minero Aoki <aamine@...> 2004/08/02

青木です。

[ruby-dev:23912] Re: Process::Status as boolean

From: nobu.nakada@...
Date: 2004-07-16 00:49:32 UTC
List: ruby-dev #23912
なかだです。

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はできる。
    中田 伸悦

In This Thread