
Issue #20335 has been updated by Eregon (Benoit Daloze). Right, Range is problematic, and only Range with positive indices seems an weird restriction so I think better no Range. `Thread.each_caller_location(1, 20)` I think there are basically no use cases for this, so I wouldn't add it to keep things simple. If one wants to e.g. detect the boundary between an app and a gem they should look at locations, not hardcode some frame depth limit. It's kind of the purpose of `Thread.each_caller_location` to be able to dynamically detect the limit, and then an extra Integer limit feels redundant. Could you change your proposal to only add `start = 1`, unless you have/find some good use cases for `Thread.each_caller_location(1, 20)`? ---------------------------------------- Feature #20335: `Thread.each_caller_location` should accept the same arguments as `caller` and `caller_locations` https://bugs.ruby-lang.org/issues/20335#change-107272 * Author: byroot (Jean Boussier) * Status: Open ---------------------------------------- `Thread.each_caller_location` was added to Ruby 3.2 as part of [Feature #16663] and is a very useful API for emitting warnings with a proper source location and similar use cases. However in many of the cases where I used it, or seen it used, it was needed to skip the first, or a couple frames: Examples: Sorbet: https://github.com/Shopify/sorbet/blob/b27a14c247ace7cabdf0f348bfb11fdf0b7e9... ```ruby def self.find_caller skiped_first = false Thread.each_caller_location do |loc| unless skiped_first skiped_first = true next end next if loc.path&.start_with?("<internal:") return loc if yield(loc) end nil end ``` @fxn 's PR: https://github.com/ruby/ruby/blob/9c2e686719a5a4df5ea0b8a3b6a373ca6003c229/l... ```ruby frames_to_skip = 2 location = nil Thread.each_caller_location do |cl| if frames_to_skip >= 1 frames_to_skip -= 1 next end # snipp... ``` ### Proposal I think it would be very useful if `Thread.each_caller_location` accepted the same arguments as `caller` and `caller_locations`: ```ruby #each_caller_location(start = 1, length = nil) #each_caller_location(range) ``` @jeremyevans0 what do you think? -- https://bugs.ruby-lang.org/