summaryrefslogtreecommitdiffstats
path: root/lib/delegate.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-04 12:52:08 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-02-04 12:52:08 +0000
commit96b94b2d9153632e0d141be549ae585d01e4efee (patch)
tree44a60ed7c76562084f515dd56f7c29f1ad02519f /lib/delegate.rb
parent8e982e54d885d07b39bd3b472b1599e951d7db8e (diff)
downloadruby-96b94b2d9153632e0d141be549ae585d01e4efee.tar.gz
ruby-96b94b2d9153632e0d141be549ae585d01e4efee.tar.xz
ruby-96b94b2d9153632e0d141be549ae585d01e4efee.zip
* lib/delegate.rb (DelegateClass): use define_method instead of
module_eval to improve performance. [ruby-dev:33586] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@15376 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/delegate.rb')
-rw-r--r--lib/delegate.rb32
1 files changed, 15 insertions, 17 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb
index 970bb9d34..c50eac2f6 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -143,7 +143,7 @@ class Delegator
target.__send__(m, *args, &block)
end
rescue Exception
- $@.delete_if{|s| /^#{__FILE__}:\d+:in `method_missing'$/ =~ s} #`
+ $@.delete_if{|s| %r"\A#{__FILE__}:\d+:in `method_missing'\z"o =~ s}
::Kernel::raise
end
end
@@ -246,9 +246,17 @@ class SimpleDelegator<Delegator
end
# :stopdoc:
-# backward compatibility ^_^;;;
-Delegater = Delegator
-SimpleDelegater = SimpleDelegator
+def Delegator.delegating_block(mid)
+ lambda do |*args, &block|
+ begin
+ @delegate_dc_obj.__send__(mid, *args, &block)
+ rescue
+ re = /\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:/o
+ $!.backtrace.delete_if {|t| re =~ t}
+ raise
+ end
+ end
+end
# :startdoc:
#
@@ -280,19 +288,9 @@ def DelegateClass(superclass)
@delegate_dc_obj = obj
end
}
- for method in methods
- begin
- klass.module_eval <<-EOS, __FILE__, __LINE__+1
- def #{method}(*args, &block)
- begin
- @delegate_dc_obj.__send__(:#{method}, *args, &block)
- rescue
- raise $!, $@[2..-1]
- end
- end
- EOS
- rescue SyntaxError
- raise NameError, "invalid identifier %s" % method, caller(3)
+ klass.module_eval do
+ methods.each do |method|
+ define_method(method, Delegator.delegating_block(method))
end
end
return klass