* lib/delegate.rb (DelegateClass): use define_method instead of
module_eval to improve performance. [ruby-dev:33586] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15376 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
b00bc5f2a8
commit
23757bce57
@ -1,3 +1,8 @@
|
|||||||
|
Mon Feb 4 21:52:06 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/delegate.rb (DelegateClass): use define_method instead of
|
||||||
|
module_eval to improve performance. [ruby-dev:33586]
|
||||||
|
|
||||||
Mon Feb 4 16:44:24 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Mon Feb 4 16:44:24 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* configure.in (darwin): NSIG is not defined if _XOPEN_SOURCE > 500L.
|
* configure.in (darwin): NSIG is not defined if _XOPEN_SOURCE > 500L.
|
||||||
|
@ -143,7 +143,7 @@ class Delegator
|
|||||||
target.__send__(m, *args, &block)
|
target.__send__(m, *args, &block)
|
||||||
end
|
end
|
||||||
rescue Exception
|
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
|
::Kernel::raise
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -246,9 +246,17 @@ class SimpleDelegator<Delegator
|
|||||||
end
|
end
|
||||||
|
|
||||||
# :stopdoc:
|
# :stopdoc:
|
||||||
# backward compatibility ^_^;;;
|
def Delegator.delegating_block(mid)
|
||||||
Delegater = Delegator
|
lambda do |*args, &block|
|
||||||
SimpleDelegater = SimpleDelegator
|
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:
|
# :startdoc:
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -280,19 +288,9 @@ def DelegateClass(superclass)
|
|||||||
@delegate_dc_obj = obj
|
@delegate_dc_obj = obj
|
||||||
end
|
end
|
||||||
}
|
}
|
||||||
for method in methods
|
klass.module_eval do
|
||||||
begin
|
methods.each do |method|
|
||||||
klass.module_eval <<-EOS, __FILE__, __LINE__+1
|
define_method(method, Delegator.delegating_block(method))
|
||||||
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)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return klass
|
return klass
|
||||||
|
Loading…
x
Reference in New Issue
Block a user