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/