From bb6607404a993c98d1ede9560b0f34c7551bf0f5 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 21 Nov 2013 09:47:31 +0000 Subject: delegate.rb: check if target is set * lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set. * lib/delegate.rb (DelegateClass#__getobj__): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/delegate.rb | 15 ++++++++++----- test/test_delegate.rb | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index ee75315c92..bc4f94f0e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Thu Nov 21 18:47:29 2013 Nobuyoshi Nakada + + * lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set. + + * lib/delegate.rb (DelegateClass#__getobj__): ditto. + Thu Nov 21 18:28:42 2013 Nobuyoshi Nakada * lib/tempfile.rb (Tempfile#initialize): use class method to get rid diff --git a/lib/delegate.rb b/lib/delegate.rb index 442a3762f2..0eaf37122b 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -43,11 +43,14 @@ class Delegator < BasicObject kernel = ::Kernel.dup kernel.class_eval do + alias __raise__ raise [:to_s,:inspect,:=~,:!~,:===,:<=>,:eql?,:hash].each do |m| undef_method m end private_instance_methods.each do |m| - next if /\Ablock_given\?\z|iterator\?\z/ =~ m + if /\Ablock_given\?\z|iterator\?\z|\A__raise__\z/ =~ m + next + end undef_method m end end @@ -152,7 +155,7 @@ class Delegator < BasicObject # method calls are being delegated to. # def __getobj__ - raise NotImplementedError, "need to define `__getobj__'" + __raise__ ::NotImplementedError, "need to define `__getobj__'" end # @@ -160,7 +163,7 @@ class Delegator < BasicObject # to _obj_. # def __setobj__(obj) - raise NotImplementedError, "need to define `__setobj__'" + __raise__ ::NotImplementedError, "need to define `__setobj__'" end # @@ -303,6 +306,7 @@ end class SimpleDelegator Sinclair # def __setobj__(obj) - raise ArgumentError, "cannot delegate to self" if self.equal?(obj) + __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj) @delegate_sd_obj = obj end end @@ -377,10 +381,11 @@ def DelegateClass(superclass) methods -= [:to_s,:inspect,:=~,:!~,:===] klass.module_eval do def __getobj__ # :nodoc: + __raise__ ::ArgumentError, "not delegated" unless defined?(@delegate_dc_obj) @delegate_dc_obj end def __setobj__(obj) # :nodoc: - raise ArgumentError, "cannot delegate to self" if self.equal?(obj) + __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj) @delegate_dc_obj = obj end methods.each do |method| diff --git a/test/test_delegate.rb b/test/test_delegate.rb index 6448ef90dd..58fefea608 100644 --- a/test/test_delegate.rb +++ b/test/test_delegate.rb @@ -154,4 +154,18 @@ class TestDelegateClass < Test::Unit::TestCase end.new(Object.new) assert_equal("foo", d.send(:foo)) end + + def test_unset_simple_delegator + d = SimpleDelegator.allocate + assert_raise_with_message(ArgumentError, /not delegated/) { + d.__getobj__ + } + end + + def test_unset_delegate_class + d = IV.allocate + assert_raise_with_message(ArgumentError, /not delegated/) { + d.__getobj__ + } + end end -- cgit v1.2.3