summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-03-11 08:03:26 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-03-11 08:03:26 +0000
commitc0667c018769699cbc7eecac0411e2e3b9e7af93 (patch)
tree5b8587767502fcda5020b47101e51e93e7c6775b /lib
parent1c411796ef50c6e4da9f0628d12816219d5f864a (diff)
* lib/delegate.rb (Delegator#initialize, DelegateClass): skip correct
backtrace. [ruby-dev:34019] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@15747 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/delegate.rb16
1 files changed, 7 insertions, 9 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb
index d810ccad42..1559c80542 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -115,6 +115,7 @@
# implementation, see SimpleDelegator.
#
class Delegator
+ IgnoreBacktracePat = %r"\A#{Regexp.quote(__FILE__)}:\d+:in `"
#
# Pass in the _obj_ to delegate method calls to. All methods supported by
@@ -133,14 +134,12 @@ class Delegator
for method in obj.methods
next if preserved.include? method
begin
- eval <<-EOS
+ eval <<-EOS, nil, __FILE__, __LINE__+1
def self.#{method}(*args, &block)
begin
__getobj__.__send__(:#{method}, *args, &block)
- rescue Exception
- $@.delete_if{|s| /:in `__getobj__'$/ =~ s} #`
- $@.delete_if{|s| /^\\(eval\\):/ =~ s}
- Kernel::raise
+ ensure
+ $@.delete_if{|s|IgnoreBacktracePat=~s}
end
end
EOS
@@ -291,13 +290,12 @@ def DelegateClass(superclass)
}
for method in methods
begin
- klass.module_eval <<-EOS
+ klass.module_eval <<-EOS, __FILE__, __LINE__+1
def #{method}(*args, &block)
begin
@_dc_obj.__send__(:#{method}, *args, &block)
- rescue
- $@[0,2] = nil
- raise
+ ensure
+ $@.delete_if{|s| ::Delegator::IgnoreBacktracePat =~ s}
end
end
EOS