ruby-trunk-changes r29351 - r29354

たくさんスターを頂きました。ありがとうございます。

ko1:r29351 2010-09-27 23:47:30 +0900

[ruby-dev:42304] でささださんが詳しく解説されていますのでこれを読めばだいたい OK だと思います。
opt_case_dispatch では case 文の when のマッチに一部の組み込みクラスのものはハッシュテーブルを使っていて、それ以外も opt_case_dispatch 内で st_foreach して === を呼んでいたのですが、実は YARV の Instruction Sequence (バイトコード、という呼称は YARV ではあまり使いたくないそうです)でも同じことをしているので不要だった上にそちらにまかせたほうが少し速かったということで st_foreach するのを消しています。

ちなみに case 文がどんな ISeq にコンパイルされているかはこんな感じに確認できます。

% ruby --dump=insns -e '              
quote> case a
quote> when 0,1
quote>   p :a
quote> when 2
quote>   p :b
quote> else
quote>   p :c
quote> end'
== disasm: <RubyVM::InstructionSequence:<main>@-e>======================
0000 trace            1                                               (   2)
0002 putnil           
0003 send             :a, 0, nil, 24, <ic:0>
0009 dup              
0010 opt_case_dispatch <cdhash>, 49
0013 putobject        0                                               (   3)
0015 topn             1
0017 send             :===, 1, nil, 0, <ic:2>
0023 branchif         63
0025 putobject        1
0027 topn             1
0029 send             :===, 1, nil, 0, <ic:3>
0035 branchif         63
0037 putobject        2                                               (   5)
0039 topn             1
0041 send             :===, 1, nil, 0, <ic:5>
0047 branchif         77
0049 pop                                                              (   8)
0050 trace            1
0052 putnil           
0053 putobject        :c
0055 send             :p, 1, nil, 8, <ic:6>
0061 leave            
0062 pop              
0063 pop                                                              (   9)
0064 trace            1                                               (   4)
0066 putnil           
0067 putobject        :a
0069 send             :p, 1, nil, 8, <ic:1>
0075 leave                                                            (   9)
0076 pop              
0077 pop              
0078 trace            1                                               (   6)
0080 putnil           
0081 putobject        :b
0083 send             :p, 1, nil, 8, <ic:4>
0089 leave                                                            (   8)

0010 の opt_case_dispatch 命令で常にジャンプしてしまっていたわけですが、その後に when の各要素との比較をしてジャンプするコードも存在していたわけですね。

usa:r29352 2010-09-28 20:08:56 +0900

[Feature #3875] に投稿された、Windows で SEGV した時の C のバックトレースの出力をサポートするパッチが取り込まれています。
Windows のことはさっぱりわかりませんが dbghelp.dll という DLL を利用してバックトレースを取得しているらしいです。 dbhhelp.dll は標準で入ってるんでしょうか?

svn:r29353 2010-09-28 20:08:58 +0900

version.h の日付更新。

nobu:r29354 2010-09-28 20:50:29 +0900

r29347 で mingw64 のターゲットの指定方法に alias をつけたものにさらに x86_64-w64 という指定も追加。
うーん、ターゲットの指定方法に(Ruby に限らず)正解ってあるんでしょうか。