[#38371] Re: [ruby-cvs:30538] Ruby:r23320 (trunk): * lib/set.rb (SortedSet#add): Do not let an uncomparable object — "Yugui (Yuki Sonoda)" <yugui@...>
Yuguiです。
At Mon, 4 May 2009 23:44:22 +0900,
遠藤です。
At Fri, 8 May 2009 02:00:10 +0900,
[#38372] making install-sh more descriptive — "Yugui (Yuki Sonoda)" <yugui@...>
install-shが空になって久しい(r520)です。
[#38382] [Bug #1442] indentation check and coverage for toplevel do not work — Yusuke Endoh <redmine@...>
Bug #1442: indentation check and coverage for toplevel do not work
[#38390] [Bug:1.8] Tempfile and extended Enumerable — Tanaka Akira <akr@...>
1.8.8dev で、以下のように、Enumerable に each2 を定義し、
[#38392] Enumerable#gather_each — Tanaka Akira <akr@...>
ときに、複数行をまとめて扱いたいことがあります。
ujihisaと申します。
まつもと ゆきひろです
At Sun, 10 May 2009 06:00:08 +0900,
In article <E1M2t0u-0000Aa-Sd@x61.netlab.jp>,
まつもと ゆきひろです
In article <E1M4oSd-00005c-WB@x61.netlab.jp>,
In article <873ab3531u.fsf@fsij.org>,
まつもと ゆきひろです
At Sat, 9 May 2009 15:30:20 +0900,
In article <86r5yy2nrg.knu@iDaemons.org>,
At Sun, 10 May 2009 10:08:47 +0900,
In article <86ocu132gq.knu@iDaemons.org>,
At Sun, 10 May 2009 15:57:33 +0900,
In article <86my9l2tts.knu@iDaemons.org>,
Haskell の groupBy と Python の groupby が似ている、という話
遠藤です。
In article <e0b1e5700905140800y6d701c6fj731a59ffd83b9d79@mail.gmail.com>,
[#38423] longlife gc — Narihiro Nakamura <authornari@...>
nariと申します.
[#38446] [Bug:1.9] exact Time and inexact Time — Yusuke ENDOH <mame@...>
遠藤です。
In article <e0b1e5700905132145i32bed2f0y80faef19c119824f@mail.gmail.com>,
遠藤です。
[#38463] SQLiteライブラリ — "NARUSE, Yui" <naruse@...>
成瀬です。
[#38486] [Bug #1483] some commands installed without program-suffix — Kazuhiro NISHIYAMA <redmine@...>
Bug #1483: some commands installed without program-suffix
[#38493] [Feature:trunk] enhancement of Array#drop — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
まつもと ゆきひろです
こんにちは、なかむら(う)です。
[#38518] [Bug:1.9] Enumerator.new { }.take(1).inject(&:+) causes stack overflow — Yusuke ENDOH <mame@...>
遠藤です。
[#38524] [Bug #1503] -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる — sinnichi eguchi <redmine@...>
Bug #1503: -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる
[ruby-dev:38518] [Bug:1.9] Enumerator.new { }.take(1).inject(&:+) causes stack overflow
遠藤です。
以下のようにすると、謎の SystemStackError が出てきます。
$ ./ruby -ve 'Enumerator.new { }.take(1).inject(&:+)'
ruby 1.9.2dev (2009-05-19 trunk 23489) [i686-linux]
-e:1:in `proc': stack level too deep (SystemStackError)
from -e:1:in `to_proc'
from -e:1:in `<main>'
1.9.1-p0 でも同じでした。
調べてみたところ、現在のブロックの cfp->lfp[0] が指すブロックが
自分自身になっているようです (正確には、他のブロックを解して
間接的に循環しているようでした) 。
そのせいで、vm.c の rb_vm_make_proc と vm_make_proc_from_block が
相互に呼び出しあって無限再帰しているようです。
cfp->lfp[0] がおかしくなる原因はたぶん enumerator.c で、
- yielder_new が rb_iterate(yielder_new_i, ...) を呼ぶ
- passed_block が設定される
- yielder_new_i は Ruby レベルのメソッドを呼ばずに終了する
- passed_block が設定されたまま、yielder_new が終わり、YARV の
eval ループに戻る
- passed_block がどこか変なところで cfp->lfp[0] に代入される
という流れになっているように感じました (yielder がどんなものかは
よくわかっていません) 。
そこで、以下のように、yielder_new_i で proc メソッドを呼ぶことで
バグは直りました。
Index: enumerator.c
===================================================================
--- enumerator.c (revision 23508)
+++ enumerator.c (working copy)
@@ -720,7 +720,7 @@
static VALUE
yielder_new_i(VALUE dummy)
{
- return yielder_init(yielder_allocate(rb_cYielder), rb_block_proc());
+ return yielder_init(yielder_allocate(rb_cYielder),
rb_funcall(Qnil, rb_intern("proc"), 0));
}
static VALUE
ささださんがいいと言ってくれたら (もしくは何も言わないなら)
コミットしようと思います。
上に関係して、Ruby のソースコードには以下のアサーションが暗黙に
存在すると思ったのですが、正しいでしょうか。
- passed_block が設定されたら、eval ループに戻る前に Ruby レベルの
メソッドを呼んで passed_block を回収させないといけない
- rb_iterate や rb_block_call の第一引数に渡される関数は、その中で
Ruby レベルのメソッドを呼ばないといけない
後者は C API に関わる話なので、正しいようなら README.EXT に書き
加えた方がいいと思います。というか書き加えようと思います。
--
Yusuke ENDOH <mame@tsg.ne.jp>