From: SASADA Koichi Date: 2012-05-24T00:54:02+09:00 Subject: [ruby-dev:45673] Bug?: level argument of caller  ささだです.  caller(level) のように,caller メソッドでは何段上からバックトレースを 持ってくるか,というのを level という引数で指定できます.  なんとなく,level 分だけバックトレースの情報が減るように思えるのです が,つまり caller(0).size - level == caller(level).size となりそうなもんですが,実際はそうなりません. 例: a = [1] a.map{ a.map{ a.map{ 10.times{|i| p [i, caller(i).size] } } } } #=> ruby 2.0.0dev (2012-05-04 trunk 35535) [i386-mswin32_100] [0, 9] [1, 8] [2, 8] # 上と変わらない [3, 7] [4, 6] [5, 6] # 上と変わらない [6, 5] [7, 4] [8, 4] # 上と変わらない [9, 3]  理由は,level を,VM のスタックフレームを level 個スキップする,と扱っ ているのですが,スタックフレームの種類によってはバックトレースに出てこな い場合もあるので,そのスキップされた分を level でスキップする数にいれて いるから,という理由です.  1.8 だと期待通り(?)動きます. #=> ruby 1.8.7 (2012-02-08 patchlevel 358) [i386-cygwin] [0, 9] [1, 8] [2, 7] [3, 6] [4, 5] [5, 4] [6, 3] [7, 2] [8, 1] [9, 0]  というわけで,バグな気もするんですが,どうしたもんでしょう.これまで苦 情も来てないから,どうでもいいような気もするんですが.2.0 から直します? -- // SASADA Koichi at atdot dot net