なかだです。

At Sat, 12 Aug 2006 20:19:27 +0900,
arton wrote in [ruby-dev:29262]:
> > $0への代入がまずいんでしょうか。
> パッチをためしてみました。
> 1.8.5-preview3で、そのままでは現象が再現し、パッチ適用後に解決することを
> 確認しました。

その後もうひとつ思い付いたことがあります。

今のところ、$0に代入された文字列をargv[0]にセットした後でargvの
残りはNULLでうめています。もしかしたら、memcmp()に渡されている
のはこれかもしれません。

以下のパッチも試してみてもらえますか。

> ただし、こちらの環境(OS X 10.4.7 PPC G4 というか何を見ればいいのかな?)
> では、__MacOS_X__は未定義だったので
> -#if defined(_WIN32) || defined(__MacOS_X__)
> +#if defined(_WIN32) || defined(__APPLE__) && defined(__MACH__)
> としました。

すいません、これは間違いでした。__MacOS_X__というのはprocess.c
で使っているマクロなんですが、次のように自前で定義しているもの
でした。ですから、__APPLE__&__MACH__という条件は正しいはずです。

#if defined(__APPLE__) && ( defined(__MACH__) || defined(__DARWIN__) ) && !defined(__MacOS_X__)
#define __MacOS_X__ 1
#endif


* ruby.c (set_arg0): fill argv other than the first with an empty
  string instead of NULL.


Index: ruby.c =================================================================== RCS file: /cvs/ruby/src/ruby/ruby.c,v retrieving revision 1.83.2.13 diff -p -U 2 -r1.83.2.13 ruby.c --- ruby.c 1 Feb 2006 13:27:47 -0000 1.83.2.13 +++ ruby.c 12 Aug 2006 13:22:53 -0000 @@ -1066,16 +1066,11 @@ set_arg0(val, id) if (i >= len) { i = len; - memcpy(origargv[0], s, i); - origargv[0][i] = '\0'; - } - else { - memcpy(origargv[0], s, i); - s = origargv[0]+i; - *s++ = '\0'; - while (++i < len) - *s++ = ' '; - for (i = 1; i < origargc; i++) - origargv[i] = 0; } + memcpy(origargv[0], s, i); + s = origargv[0] + i; + *s = '\0'; + if (++i < len) memset(s + 1, ' ', len - i); + for (i = 1; i < origargc; i++) + origargv[i] = s; rb_progname = rb_tainted_str_new2(origargv[0]); #endif
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦