From: KOSAKI Motohiro <kosaki.motohiro@...>
Date: 2013-08-04T11:21:31+09:00
Subject: [ruby-dev:47580] Re: [ruby-trunk - Feature #8726][Open] Class#source_location

2013/8/3 Nobuyoshi Nakada <nobu@ruby-lang.org>:
> (13/08/04 6:33), KOSAKI Motohiro wrote:
>>> なるせさん、わたし、あのバックトレースの整形処理がイマイチ理解できんのだが、
>>> あれはどういう処理を意図してるの。
>>
>> printfデバッグした感じだと
>>
>>       (bt = e.backtrace).reject! {|m| rej =~ m}
>>
>> の行で取り除かれてる行はないように見える。うーん、コード履歴を追う必要があるかなあ
>
> そこで取り除いているのは、Thread#raise用のタイマースレッドの終了待ちの行です。
> timeout.rbからのバックトレースを取り除いているのは、その後のwhileループ中のbt.delete_atです。

やってみました? bt.delete_atのほうは意図通り動いてそうだからコメントしなかったのだけど、こっちのrejectは

% ./ruby-trunk ../test.rb
/home/kosaki/local/ruby-trunk/lib/ruby/2.1.0/timeout.rb:70:in `join':
execution expired (Timeout::Error)
from ../test.rb:7:in `<main>'

と、現在は仕様としてファイル名行番号の後ろに in `join' がついているため、
\z が邪魔してマッチしていません。

\zを取ると以下のように変化しこちらが意図した結果ではないかと

% ./ruby-trunk ../test.rb
../test.rb:7:in `<main>': execution expired (Timeout::Error)


ちょっと最初の説明が足りなかったか。

ただ、話をもとに戻すと、なるせさんの、そもそもなんで無理やり整形して情報量落とす必要あるのだという指摘は至極まっとうなものに思えます。

前回のメールのスクリプトをruby-1.8.7で実行すると

% /usr/bin/ruby ../test.rb
/usr/lib/ruby/1.8/timeout.rb:64:in `foo': execution expired (Timeout::Error)
from ../test.rb:8
from ../test.rb:7

timeout.rb という文字列が見えているので1.9からの変更だと思うのですが、
こう変えるメリットがちと想像つかぬ