Use Ruby 2.0 caller_locations instead of caller if available

* we no more have to manipulate the each caller strings by ourselves using caller_locations

* caller_locations runs slightly faster, and creates less objects than good old caller
Benchmark (loading an Engine 1000 times):
  caller: 262.89 ms
  caller_locations: 186.068 ms
This commit is contained in:
Akira Matsuda 2013-07-22 13:49:50 +09:00 committed by Arun Agrawal
parent ad6adcb601
commit 5374960a04
1 changed files with 7 additions and 2 deletions

View File

@ -351,8 +351,13 @@ module Rails
Rails::Railtie::Configuration.eager_load_namespaces << base
base.called_from = begin
# Remove the line number from backtraces making sure we don't leave anything behind
call_stack = caller.map { |p| p.sub(/:\d+.*/, '') }
call_stack = if Kernel.respond_to?(:caller_locations)
caller_locations.map(&:path)
else
# Remove the line number from backtraces making sure we don't leave anything behind
caller.map { |p| p.sub(/:\d+.*/, '') }
end
File.dirname(call_stack.detect { |p| p !~ %r[railties[\w.-]*/lib/rails|rack[\w.-]*/lib/rack] })
end
end