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

ruby-changes:14710

From: nobu <ko1@a...>
Date: Thu, 4 Feb 2010 08:16:56 +0900 (JST)
Subject: [ruby-changes:14710] Ruby:r26566 (trunk): * lib/delegate.rb (Delegator): now inherits BasicObject.

nobu	2010-02-04 08:15:55 +0900 (Thu, 04 Feb 2010)

  New Revision: 26566

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26566

  Log:
    * lib/delegate.rb (Delegator): now inherits BasicObject.
      [ruby-dev:39154], [Bug #2679], [ruby-dev:40242]

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26565)
+++ ChangeLog	(revision 26566)
@@ -1,3 +1,8 @@
+Thu Feb  4 08:15:53 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* lib/delegate.rb (Delegator): now inherits BasicObject.
+	  [ruby-dev:39154], [Bug #2679], [ruby-dev:40242]
+
 Thu Feb  4 03:00:59 2010  Yusuke Endoh  <mame@t...>
 
 	* ext/bigdecimal/bigdecimal.c (BigDecimal_DoDivmod): get red of
Index: lib/delegate.rb
===================================================================
--- lib/delegate.rb	(revision 26565)
+++ lib/delegate.rb	(revision 26566)
@@ -114,11 +114,21 @@
 # subclasses.  Subclasses should redefine \_\_getobj\_\_.  For a concrete
 # implementation, see SimpleDelegator.
 #
-class Delegator
-  [:to_s,:inspect,:=~,:!~,:===,:<=>].each do |m|
-    undef_method m
+class Delegator < BasicObject
+  # :stopdoc:
+  def class
+    (class << self; self; end).superclass
   end
 
+  def extend(*mods)
+    (class << self; self; end).class_eval {include(*mods)}
+  end
+
+  def self.const_missing(n)
+    ::Object.const_get(n)
+  end
+  # :startdoc:
+
   #
   # Pass in the _obj_ to delegate method calls to.  All methods supported by
   # _obj_ will be delegated to.
@@ -131,12 +141,12 @@
   def method_missing(m, *args, &block)
     begin
       target = self.__getobj__
-      unless target.respond_to?(m)
+      unless target.respond_to?(m, true)
         super(m, *args, &block)
       else
         target.__send__(m, *args, &block)
       end
-    rescue Exception
+    rescue ::Exception
       if i = $@.index{|s| %r"\A#{Regexp.quote(__FILE__)}:\d+:in `method_missing'\z"o =~ s}
         $@[0..i] = []
       end
@@ -248,17 +258,6 @@
     raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
     @delegate_sd_obj = obj
   end
-
-  def initialize(obj)   # :nodoc:
-    (self.public_methods - Delegator.public_api).each do |m|
-      class << self
-        self
-      end.class_eval do
-        undef_method m
-      end
-    end
-    super
-  end
 end
 
 # :stopdoc:
Index: test/test_delegate.rb
===================================================================
--- test/test_delegate.rb	(revision 26565)
+++ test/test_delegate.rb	(revision 26566)
@@ -34,12 +34,20 @@
     def m
       :o
     end
+    private
+    def delegate_test_m
+      :o
+    end
   end
 
   class Foo
     def m
       :m
     end
+    private
+    def delegate_test_m
+      :m
+    end
   end
 
   class Bar < DelegateClass(Foo)
@@ -50,6 +58,9 @@
     assert_equal(:m, Foo.new.m)
     assert_equal(:m, SimpleDelegator.new(Foo.new).m)
     assert_equal(:m, Bar.new(Foo.new).m)
+    bug = '[ruby-dev:39154]'
+    assert_equal(:m, SimpleDelegator.new(Foo.new).__send__(:delegate_test_m), bug)
+    assert_equal(:m, Bar.new(Foo.new).__send__(:delegate_test_m), bug)
   end
 
   class IV < DelegateClass(Integer)
@@ -67,4 +78,11 @@
     d = Marshal.load(Marshal.dump(c))
     assert_equal(1, d.var, bug1744)
   end
+
+  def test_copy_frozen
+    bug2679 = '[ruby-dev:40242]'
+    a = [42, :hello].freeze
+    d = SimpleDelegator.new(a)
+    assert_nothing_raised(bug2679) {d.dup[0] += 1}
+  end
 end

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

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