From: Satoshi Nojo Date: 2000-03-15T17:12:23+09:00 Subject: [ruby-list:21454] Re: ruby 1.4.4 Yukihiro Matsumoto さんは書きました: >問題の報告が無ければ近いうちに公開されるでしょう。 Hash のバグでしょうか。 ruby 1.4.4 (2000-03-14) [i586-cygwin] ruby 1.4.4 (2000-03-13) [i386-mswin32] で発生しました。1.5.3 でも発生しそうです(未確認)。 | C:\tmp>ruby -e 'Hash[1]' | c:\windows\TEMP/rb001000:1:in `[]': stack level too deep (SystemStackError) | from c:\windows\TEMP/rb001000:1 ソースを見ると、 ---- hash.c (rb_hash_s_create) VALUE a = rb_Array(argv[0]); return rb_hash_s_create(RARRAY(a)->len, RARRAY(a)->ptr, klass); ---- となっていますが、こうでしょうか? ---- hash.c (rb_hash_s_create) VALUE a = rb_Array(argv[0]); return rb_hash_s_new(RARRAY(a)->len, RARRAY(a)->ptr, klass); /* ^^^ */ ---- また、mswin 版では、SystemStackError にならず、 「不正な処理をしました」 の強制終了ダイアログがでます。 ---- eval.c /* # define STACK_LEVEL_MAX 655300 */ # define STACK_LEVEL_MAX 515921 ---- eval.c の STACK_LEVEL_MAX を変更したら、 SystemStackError が出るようになりました。 ちなみに、STACK_LEVEL_MAX 515922 では ^^^ SystemStackError がでず、強制終了ダイアログがでました。 対応がこれでのかわかりません。が、パッチ。 --- eval.c.orig Tue Mar 14 01:19:12 2000 +++ eval.c Wed Mar 15 16:33:52 2000 @@ -3713,5 +3713,11 @@ extern int _stacksize; # define STACK_LEVEL_MAX (_stacksize - 4096) #else + +#ifdef NT +# define STACK_LEVEL_MAX 515921 +#else # define STACK_LEVEL_MAX 655300 +#endif + #endif #endif --- hash.c.orig Mon Jan 17 22:45:20 2000 +++ hash.c Wed Mar 15 15:59:18 2000 @@ -252,7 +252,7 @@ } else { VALUE a = rb_Array(argv[0]); - return rb_hash_s_create(RARRAY(a)->len, RARRAY(a)->ptr, klass); + return rb_hash_s_new(RARRAY(a)->len, RARRAY(a)->ptr, klass); } } ---- のうじょう さとし