summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-03-07 17:54:49 +0000
committermarcandre <marcandre@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-03-07 17:54:49 +0000
commitdfde34cb3c968f3238afcfd05298bc6b88585bcb (patch)
tree634eea6b870bfb289dd47c3b2ab087353218ed16
parent221f2a1d8a7c42165b3144fbf22b9585e3026e18 (diff)
* class.c (rb_mod_ancestors): Include singleton_class in ancestors list
[Feature #8035] * test/ruby/test_module.rb (class): test for above * test/ruby/marshaltestlib.rb (module): adapt test * NEWS: list change git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39628 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--NEWS5
-rw-r--r--class.c2
-rw-r--r--test/ruby/marshaltestlib.rb52
-rw-r--r--test/ruby/test_module.rb14
4 files changed, 39 insertions, 34 deletions
diff --git a/NEWS b/NEWS
index dd33ecf03d..59453450bd 100644
--- a/NEWS
+++ b/NEWS
@@ -14,6 +14,11 @@ with all sufficient information, see the ChangeLog file.
=== Language changes
=== Core classes updates (outstanding ones only)
=== Core classes compatibility issues (excluding feature bug fixes)
+
+* Module#ancestors
+
+ The ancestors of a singleton class now include that singleton class.
+
=== Stdlib updates (outstanding ones only)
=== Stdlib compatibility issues (excluding feature bug fixes)
=== C API updates
diff --git a/class.c b/class.c
index b8e47df8f2..36b7f0d0cf 100644
--- a/class.c
+++ b/class.c
@@ -909,8 +909,6 @@ rb_mod_ancestors(VALUE mod)
VALUE p, ary = rb_ary_new();
for (p = mod; p; p = RCLASS_SUPER(p)) {
- if (FL_TEST(p, FL_SINGLETON))
- continue;
if (BUILTIN_TYPE(p) == T_ICLASS) {
rb_ary_push(ary, RBASIC(p)->klass);
}
diff --git a/test/ruby/marshaltestlib.rb b/test/ruby/marshaltestlib.rb
index c8f81da35c..1507b3a9f1 100644
--- a/test/ruby/marshaltestlib.rb
+++ b/test/ruby/marshaltestlib.rb
@@ -40,6 +40,14 @@ module MarshalTestLib
end
end
+ def marshal_equal_with_ancestry(o1, msg = nil)
+ marshal_equal(o1, msg) do |o|
+ ancestry = o.singleton_class.ancestors
+ ancestry[ancestry.index(o.singleton_class)] = :singleton_class
+ ancestry
+ end
+ end
+
class MyObject; def initialize(v) @v = v end; attr_reader :v; end
def test_object
o1 = Object.new
@@ -54,25 +62,17 @@ module MarshalTestLib
def test_object_extend
o1 = Object.new
o1.extend(Mod1)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
o1.extend(Mod2)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
end
def test_object_subclass_extend
o1 = MyObject.new(2)
o1.extend(Mod1)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
o1.extend(Mod2)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
end
class MyArray < Array
@@ -141,25 +141,17 @@ module MarshalTestLib
def test_hash_extend
o1 = Hash.new
o1.extend(Mod1)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
o1.extend(Mod2)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
end
def test_hash_subclass_extend
o1 = MyHash.new(2)
o1.extend(Mod1)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
o1.extend(Mod2)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
end
def test_bignum
@@ -289,13 +281,9 @@ module MarshalTestLib
def test_struct_subclass_extend
o1 = MyStruct.new
o1.extend(Mod1)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
o1.extend(Mod2)
- marshal_equal(o1) { |o|
- (class << self; self; end).ancestors
- }
+ marshal_equal_with_ancestry(o1)
end
def test_symbol
@@ -404,7 +392,7 @@ module MarshalTestLib
o = Object.new
o.extend Mod1
o.extend Mod2
- marshal_equal(o) {|obj| class << obj; ancestors end}
+ marshal_equal_with_ancestry(o)
o = Object.new
o.extend Module.new
assert_raise(TypeError) { marshaltest(o) }
@@ -417,7 +405,7 @@ module MarshalTestLib
o = ""
o.extend Mod1
o.extend Mod2
- marshal_equal(o) {|obj| class << obj; ancestors end}
+ marshal_equal_with_ancestry(o)
o = ""
o.extend Module.new
assert_raise(TypeError) { marshaltest(o) }
diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb
index 5450c8ff3a..af3150b8a0 100644
--- a/test/ruby/test_module.rb
+++ b/test/ruby/test_module.rb
@@ -1663,6 +1663,20 @@ class TestModule < Test::Unit::TestCase
end
end
+ def test_singleton_class_ancestors
+ feature8035 = '[ruby-core:53171]'
+ obj = Object.new
+ assert_equal [obj.singleton_class, Object], obj.singleton_class.ancestors.first(2), feature8035
+
+ mod = Module.new
+ obj.extend mod
+ assert_equal [obj.singleton_class, mod, Object], obj.singleton_class.ancestors.first(3)
+
+ obj = Object.new
+ obj.singleton_class.send :prepend, mod
+ assert_equal [mod, obj.singleton_class, Object], obj.singleton_class.ancestors.first(3)
+ end
+
private
def assert_top_method_is_private(method)