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

ruby-changes:14724

From: nobu <ko1@a...>
Date: Fri, 5 Feb 2010 16:38:33 +0900 (JST)
Subject: [ruby-changes:14724] Ruby:r26580 (trunk): * lib/delegate.rb (Delegator): include copy of Kernel.

nobu	2010-02-05 16:38:10 +0900 (Fri, 05 Feb 2010)

  New Revision: 26580

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

  Log:
    * lib/delegate.rb (Delegator): include copy of Kernel.
      [ruby-dev:40314]
    
    * lib/delegate.rb (Delegator#{dup,clone}): class of copy should be
      Delegator.  [ruby-dev:40313]

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26579)
+++ ChangeLog	(revision 26580)
@@ -1,3 +1,11 @@
+Fri Feb  5 16:38:08 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* lib/delegate.rb (Delegator): include copy of Kernel.
+	  [ruby-dev:40314]
+
+	* lib/delegate.rb (Delegator#{dup,clone}): class of copy should be
+	  Delegator.  [ruby-dev:40313]
+
 Fri Feb  5 09:26:54 2010  NARUSE, Yui  <naruse@r...>
 
 	* bignum.c (big_op): remove unused variables.
Index: lib/delegate.rb
===================================================================
--- lib/delegate.rb	(revision 26579)
+++ lib/delegate.rb	(revision 26580)
@@ -115,15 +115,15 @@
 # implementation, see SimpleDelegator.
 #
 class Delegator < BasicObject
-  # :stopdoc:
-  def class
-    (class << self; self; end).superclass
+  kernel = ::Kernel.dup
+  kernel.class_eval do
+    [:to_s,:inspect,:=~,:!~,:===,:<=>].each do |m|
+      undef_method m
+    end
   end
+  include kernel
 
-  def extend(*mods)
-    (class << self; self; end).class_eval {include(*mods)}
-  end
-
+  # :stopdoc:
   def self.const_missing(n)
     ::Object.const_get(n)
   end
@@ -141,7 +141,7 @@
   def method_missing(m, *args, &block)
     begin
       target = self.__getobj__
-      unless target.respond_to?(m, true)
+      unless target.respond_to?(m)
         super(m, *args, &block)
       else
         target.__send__(m, *args, &block)
@@ -211,10 +211,14 @@
     end
   end
 
-  # clone/dup support for the object returned by \_\_getobj\_\_.
-  def initialize_copy(other)
-    self.__setobj__(other.__getobj__.clone)
+  # :nodoc:
+  def dup
+    self.class.new(__getobj__.dup)
   end
+  # :nodoc:
+  def clone
+    self.class.new(__getobj__.clone)
+  end
 
   # Freeze self and target at once.
   def freeze
Index: test/test_delegate.rb
===================================================================
--- test/test_delegate.rb	(revision 26579)
+++ test/test_delegate.rb	(revision 26580)
@@ -23,11 +23,15 @@
   def test_delegateclass_class
     myclass=Myclass.new([])
     assert_equal(Myclass,myclass.class)
+    assert_equal(Myclass,myclass.dup.class,'[ruby-dev:40313]')
+    assert_equal(Myclass,myclass.clone.class,'[ruby-dev:40313]')
   end
 
   def test_simpledelegator_class
     simple=SimpleDelegator.new([])
     assert_equal(SimpleDelegator,simple.class)
+    assert_equal(SimpleDelegator,simple.dup.class)
+    assert_equal(SimpleDelegator,simple.clone.class)
   end
 
   class Object
@@ -44,7 +48,6 @@
     def m
       :m
     end
-    private
     def delegate_test_m
       :m
     end
@@ -54,13 +57,16 @@
   end
 
   def test_override
+    foo = Foo.new
+    foo2 = SimpleDelegator.new(foo)
+    bar = Bar.new(foo)
     assert_equal(:o, Object.new.m)
-    assert_equal(:m, Foo.new.m)
-    assert_equal(:m, SimpleDelegator.new(Foo.new).m)
-    assert_equal(:m, Bar.new(Foo.new).m)
+    assert_equal(:m, foo.m)
+    assert_equal(:m, foo2.m)
+    assert_equal(:m, bar.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)
+    assert_equal(:m, foo2.send(:delegate_test_m), bug)
+    assert_equal(:m, bar.send(:delegate_test_m), bug)
   end
 
   class IV < DelegateClass(Integer)
@@ -85,4 +91,34 @@
     d = SimpleDelegator.new(a)
     assert_nothing_raised(bug2679) {d.dup[0] += 1}
   end
+
+  def test_frozen
+    d = SimpleDelegator.new([1, :foo])
+    d.freeze
+    assert_raise(RuntimeError, '[ruby-dev:40314]#1') {d.__setobj__("foo")}
+    assert_equal([1, :foo], d)
+  end
+
+  def test_instance_method
+    s = SimpleDelegator.new("foo")
+    m = s.method("upcase")
+    s.__setobj__([1,2,3])
+    assert_raise(NoMethodError, '[ruby-dev:40314]#3') {m.call}
+  end
+
+  class Foo
+    private
+    def delegate_test_private
+      :m
+    end
+  end
+
+  def test_private_method
+    foo = Foo.new
+    d = SimpleDelegator.new(foo)
+    assert_raise(NoMethodError) {foo.delegate_test_private}
+    assert_equal(:m, foo.send(:delegate_test_private))
+    assert_raise(NoMethodError, '[ruby-dev:40314]#4') {d.delegate_test_private}
+    assert_raise(NoMethodError, '[ruby-dev:40314]#5') {d.send(:delegate_test_private)}
+  end
 end

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

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