From: nobu.nakada@... Date: 2003-08-27T14:37:32+09:00 Subject: [ruby-dev:21273] Re: Regexp#initializeが $SAFE==4 で落ちる なかだです。 At Wed, 27 Aug 2003 13:40:02 +0900, Nobuyoshi-Nakada wrote: > > |> また、$SAFE=4でabort(3)が呼ばれるのも避けたい気がします。 > > |> いや、後者はbugなんだから直せよって気はしますが。 > > | > > |そもそもrb_bug()はabort()を呼ぶためのものなので、違いは警告を出 > > |すかどうかだけです。 > > > > んじゃ、こっちは採用ということで。 rb_bug()は他のメソッドを呼ぶべきじゃないんじゃないかという気が して来ました。$stderrを置き換えておいたところで、何か使えるわけ じゃなし、そもそも非常事態なのでメッセージが消えてしまうこと自 体まずいんじゃないでしょうか。 > [ruby-dev:21264]だと、ついでにwriteの呼び出しを減らすようにして > るんですが、\nを別にしている積極的な理由ってありましたっけ。 もうひとつ、rb_sys_fail()でerrno==0のときに情報を追加してました。 Index: error.c =================================================================== RCS file: /cvs/ruby/src/ruby/error.c,v retrieving revision 1.77 diff -u -2 -p -r1.77 error.c --- error.c 15 Aug 2003 03:01:52 -0000 1.77 +++ error.c 27 Aug 2003 05:33:01 -0000 @@ -112,8 +112,10 @@ warn_print(fmt, args) { char buf[BUFSIZ]; + int len; err_snprintf(buf, BUFSIZ, fmt, args); - rb_write_error(buf); - rb_write_error("\n"); + len = strlen(buf); + buf[len++] = '\n'; + rb_write_error2(buf, len); } @@ -181,14 +183,14 @@ rb_bug(fmt, va_alist) char buf[BUFSIZ]; va_list args; + FILE *out = stderr; - snprintf(buf, BUFSIZ, "[BUG] %s", fmt); - ruby_in_eval = 0; - - va_init_list(args, fmt); - warn_print(buf, args); - va_end(args); - snprintf(buf, BUFSIZ, "ruby %s (%s) [%s]\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM); - rb_write_error(buf); - rb_write_error("\n"); + if (out || (out = stdout)) { + fwrite(buf, 1, err_position(buf, BUFSIZ), out); + fputs("[BUG] ", out); + va_init_list(args, fmt); + vfprintf(out, fmt, args); + va_end(args); + fprintf(out, "\nruby %s (%s) [%s]\n\n", RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM); + } abort(); } @@ -759,5 +761,5 @@ rb_sys_fail(mesg) errno = 0; if (n == 0) { - rb_bug("rb_sys_fail() - errno == 0"); + rb_bug("rb_sys_fail(%s) - errno == 0", mesg ? mesg : ""); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦