[前][次][番号順一覧][スレッド一覧]

ruby-changes:3887

From: ko1@a...
Date: Mon, 4 Feb 2008 21:52:43 +0900 (JST)
Subject: [ruby-changes:3887] nobu - Ruby:r15376 (trunk): * lib/delegate.rb (DelegateClass): use define_method instead of

nobu	2008-02-04 21:52:08 +0900 (Mon, 04 Feb 2008)

  New Revision: 15376

  Modified files:
    trunk/ChangeLog
    trunk/lib/delegate.rb

  Log:
    * lib/delegate.rb (DelegateClass): use define_method instead of
      module_eval to improve performance.  [ruby-dev:33586]


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/delegate.rb?r1=15376&r2=15375&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15376&r2=15375&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15375)
+++ ChangeLog	(revision 15376)
@@ -1,3 +1,8 @@
+Mon Feb  4 21:52:06 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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@r...>
 
 	* configure.in (darwin): NSIG is not defined if _XOPEN_SOURCE > 500L.
Index: lib/delegate.rb
===================================================================
--- lib/delegate.rb	(revision 15375)
+++ lib/delegate.rb	(revision 15376)
@@ -143,7 +143,7 @@
           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 @@
 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 @@
       @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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]