diff options
author | Akira Matsuda <ronnie@dio.jp> | 2013-07-22 13:49:50 +0900 |
---|---|---|
committer | Arun Agrawal <arunagw@gmail.com> | 2013-09-10 19:57:52 +0200 |
commit | 5374960a04d7333ced9b6c4ca36b708af498b1ca (patch) | |
tree | cc3a3276b79681050424be1a2a0b3fc0a4df3de1 /railties | |
parent | ad6adcb601a6c556a96381e887ef4e4c39c0968b (diff) | |
download | rails-5374960a04d7333ced9b6c4ca36b708af498b1ca.tar.gz rails-5374960a04d7333ced9b6c4ca36b708af498b1ca.tar.bz2 rails-5374960a04d7333ced9b6c4ca36b708af498b1ca.zip |
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
Diffstat (limited to 'railties')
-rw-r--r-- | railties/lib/rails/engine.rb | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index f25f629aa5..e8adef2fd3 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -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 |