summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-05 07:38:10 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-05 07:38:10 +0000
commit7873c05684839a88b1b9fd61272f3e70af8e3ac4 (patch)
tree3a8d210fbc43a25bcaac17fdb3ad60f422c4c629
parent1c4fe5395db05b45014734126ae448d40989db80 (diff)
* 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26580 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--lib/delegate.rb26
-rw-r--r--test/test_delegate.rb48
3 files changed, 65 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 3428103c4bb..9264597acfc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Feb 5 16:38:08 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* bignum.c (big_op): remove unused variables.
diff --git a/lib/delegate.rb b/lib/delegate.rb
index 473fa0cb8fa..0d5dc23b6e4 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -115,15 +115,15 @@
# implementation, see SimpleDelegator.
#
class Delegator < BasicObject
- # :stopdoc:
- def class
- (class << self; self; end).superclass
- end
-
- def extend(*mods)
- (class << self; self; end).class_eval {include(*mods)}
+ kernel = ::Kernel.dup
+ kernel.class_eval do
+ [:to_s,:inspect,:=~,:!~,:===,:<=>].each do |m|
+ undef_method m
+ end
end
+ include kernel
+ # :stopdoc:
def self.const_missing(n)
::Object.const_get(n)
end
@@ -141,7 +141,7 @@ class Delegator < BasicObject
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,9 +211,13 @@ class Delegator < BasicObject
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.
diff --git a/test/test_delegate.rb b/test/test_delegate.rb
index f57263bef0e..bbabf58968c 100644
--- a/test/test_delegate.rb
+++ b/test/test_delegate.rb
@@ -23,11 +23,15 @@ class TestDelegateClass < Test::Unit::TestCase
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 @@ class TestDelegateClass < Test::Unit::TestCase
def m
:m
end
- private
def delegate_test_m
:m
end
@@ -54,13 +57,16 @@ class TestDelegateClass < Test::Unit::TestCase
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 @@ class TestDelegateClass < Test::Unit::TestCase
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