mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
This commit is contained in:
parent
221f2a1d8a
commit
dfde34cb3c
4 changed files with 39 additions and 34 deletions
5
NEWS
5
NEWS
|
@ -14,6 +14,11 @@ with all sufficient information, see the ChangeLog file.
|
||||||
=== Language changes
|
=== Language changes
|
||||||
=== Core classes updates (outstanding ones only)
|
=== Core classes updates (outstanding ones only)
|
||||||
=== Core classes compatibility issues (excluding feature bug fixes)
|
=== 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 updates (outstanding ones only)
|
||||||
=== Stdlib compatibility issues (excluding feature bug fixes)
|
=== Stdlib compatibility issues (excluding feature bug fixes)
|
||||||
=== C API updates
|
=== C API updates
|
||||||
|
|
2
class.c
2
class.c
|
@ -909,8 +909,6 @@ rb_mod_ancestors(VALUE mod)
|
||||||
VALUE p, ary = rb_ary_new();
|
VALUE p, ary = rb_ary_new();
|
||||||
|
|
||||||
for (p = mod; p; p = RCLASS_SUPER(p)) {
|
for (p = mod; p; p = RCLASS_SUPER(p)) {
|
||||||
if (FL_TEST(p, FL_SINGLETON))
|
|
||||||
continue;
|
|
||||||
if (BUILTIN_TYPE(p) == T_ICLASS) {
|
if (BUILTIN_TYPE(p) == T_ICLASS) {
|
||||||
rb_ary_push(ary, RBASIC(p)->klass);
|
rb_ary_push(ary, RBASIC(p)->klass);
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,14 @@ module MarshalTestLib
|
||||||
end
|
end
|
||||||
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
|
class MyObject; def initialize(v) @v = v end; attr_reader :v; end
|
||||||
def test_object
|
def test_object
|
||||||
o1 = Object.new
|
o1 = Object.new
|
||||||
|
@ -54,25 +62,17 @@ module MarshalTestLib
|
||||||
def test_object_extend
|
def test_object_extend
|
||||||
o1 = Object.new
|
o1 = Object.new
|
||||||
o1.extend(Mod1)
|
o1.extend(Mod1)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
o1.extend(Mod2)
|
o1.extend(Mod2)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_object_subclass_extend
|
def test_object_subclass_extend
|
||||||
o1 = MyObject.new(2)
|
o1 = MyObject.new(2)
|
||||||
o1.extend(Mod1)
|
o1.extend(Mod1)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
o1.extend(Mod2)
|
o1.extend(Mod2)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class MyArray < Array
|
class MyArray < Array
|
||||||
|
@ -141,25 +141,17 @@ module MarshalTestLib
|
||||||
def test_hash_extend
|
def test_hash_extend
|
||||||
o1 = Hash.new
|
o1 = Hash.new
|
||||||
o1.extend(Mod1)
|
o1.extend(Mod1)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
o1.extend(Mod2)
|
o1.extend(Mod2)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_hash_subclass_extend
|
def test_hash_subclass_extend
|
||||||
o1 = MyHash.new(2)
|
o1 = MyHash.new(2)
|
||||||
o1.extend(Mod1)
|
o1.extend(Mod1)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
o1.extend(Mod2)
|
o1.extend(Mod2)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_bignum
|
def test_bignum
|
||||||
|
@ -289,13 +281,9 @@ module MarshalTestLib
|
||||||
def test_struct_subclass_extend
|
def test_struct_subclass_extend
|
||||||
o1 = MyStruct.new
|
o1 = MyStruct.new
|
||||||
o1.extend(Mod1)
|
o1.extend(Mod1)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
o1.extend(Mod2)
|
o1.extend(Mod2)
|
||||||
marshal_equal(o1) { |o|
|
marshal_equal_with_ancestry(o1)
|
||||||
(class << self; self; end).ancestors
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_symbol
|
def test_symbol
|
||||||
|
@ -404,7 +392,7 @@ module MarshalTestLib
|
||||||
o = Object.new
|
o = Object.new
|
||||||
o.extend Mod1
|
o.extend Mod1
|
||||||
o.extend Mod2
|
o.extend Mod2
|
||||||
marshal_equal(o) {|obj| class << obj; ancestors end}
|
marshal_equal_with_ancestry(o)
|
||||||
o = Object.new
|
o = Object.new
|
||||||
o.extend Module.new
|
o.extend Module.new
|
||||||
assert_raise(TypeError) { marshaltest(o) }
|
assert_raise(TypeError) { marshaltest(o) }
|
||||||
|
@ -417,7 +405,7 @@ module MarshalTestLib
|
||||||
o = ""
|
o = ""
|
||||||
o.extend Mod1
|
o.extend Mod1
|
||||||
o.extend Mod2
|
o.extend Mod2
|
||||||
marshal_equal(o) {|obj| class << obj; ancestors end}
|
marshal_equal_with_ancestry(o)
|
||||||
o = ""
|
o = ""
|
||||||
o.extend Module.new
|
o.extend Module.new
|
||||||
assert_raise(TypeError) { marshaltest(o) }
|
assert_raise(TypeError) { marshaltest(o) }
|
||||||
|
|
|
@ -1663,6 +1663,20 @@ class TestModule < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
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
|
private
|
||||||
|
|
||||||
def assert_top_method_is_private(method)
|
def assert_top_method_is_private(method)
|
||||||
|
|
Loading…
Add table
Reference in a new issue