Skip to content

Commit bb66074

Browse files
committed
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
1 parent 2958eca commit bb66074

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Thu Nov 21 18:47:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
2+
3+
* lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.
4+
5+
* lib/delegate.rb (DelegateClass#__getobj__): ditto.
6+
17
Thu Nov 21 18:28:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
28

39
* lib/tempfile.rb (Tempfile#initialize): use class method to get rid

lib/delegate.rb

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@
4343
class Delegator < BasicObject
4444
kernel = ::Kernel.dup
4545
kernel.class_eval do
46+
alias __raise__ raise
4647
[:to_s,:inspect,:=~,:!~,:===,:<=>,:eql?,:hash].each do |m|
4748
undef_method m
4849
end
4950
private_instance_methods.each do |m|
50-
next if /\Ablock_given\?\z|iterator\?\z/ =~ m
51+
if /\Ablock_given\?\z|iterator\?\z|\A__raise__\z/ =~ m
52+
next
53+
end
5154
undef_method m
5255
end
5356
end
@@ -152,15 +155,15 @@ def !
152155
# method calls are being delegated to.
153156
#
154157
def __getobj__
155-
raise NotImplementedError, "need to define `__getobj__'"
158+
__raise__ ::NotImplementedError, "need to define `__getobj__'"
156159
end
157160

158161
#
159162
# This method must be overridden by subclasses and change the object delegate
160163
# to _obj_.
161164
#
162165
def __setobj__(obj)
163-
raise NotImplementedError, "need to define `__setobj__'"
166+
__raise__ ::NotImplementedError, "need to define `__setobj__'"
164167
end
165168

166169
#
@@ -303,6 +306,7 @@ def self.public_api # :nodoc:
303306
class SimpleDelegator<Delegator
304307
# Returns the current object method calls are being delegated to.
305308
def __getobj__
309+
__raise__ ::ArgumentError, "not delegated" unless defined?(@delegate_sd_obj)
306310
@delegate_sd_obj
307311
end
308312

@@ -321,7 +325,7 @@ def __getobj__
321325
# puts names[1] # => Sinclair
322326
#
323327
def __setobj__(obj)
324-
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
328+
__raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
325329
@delegate_sd_obj = obj
326330
end
327331
end
@@ -377,10 +381,11 @@ def DelegateClass(superclass)
377381
methods -= [:to_s,:inspect,:=~,:!~,:===]
378382
klass.module_eval do
379383
def __getobj__ # :nodoc:
384+
__raise__ ::ArgumentError, "not delegated" unless defined?(@delegate_dc_obj)
380385
@delegate_dc_obj
381386
end
382387
def __setobj__(obj) # :nodoc:
383-
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
388+
__raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
384389
@delegate_dc_obj = obj
385390
end
386391
methods.each do |method|

test/test_delegate.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,18 @@ def foo
154154
end.new(Object.new)
155155
assert_equal("foo", d.send(:foo))
156156
end
157+
158+
def test_unset_simple_delegator
159+
d = SimpleDelegator.allocate
160+
assert_raise_with_message(ArgumentError, /not delegated/) {
161+
d.__getobj__
162+
}
163+
end
164+
165+
def test_unset_delegate_class
166+
d = IV.allocate
167+
assert_raise_with_message(ArgumentError, /not delegated/) {
168+
d.__getobj__
169+
}
170+
end
157171
end

0 commit comments

Comments
 (0)