Bug #8297 ยป singleton-class-class-variable-lookup-8297.patch
| test/ruby/test_variable.rb | ||
|---|---|---|
|
end
|
||
|
end
|
||
|
def test_singleton_class_included_class_variable
|
||
|
c = Class.new
|
||
|
c.extend(Olympians)
|
||
|
assert_empty(c.singleton_class.class_variables)
|
||
|
assert_raise(NameError){ c.singleton_class.class_variable_get(:@@rule) }
|
||
|
c.class_variable_set(:@@foo, 1)
|
||
|
assert_equal([:@@foo], c.singleton_class.class_variables)
|
||
|
assert_equal(1, c.singleton_class.class_variable_get(:@@foo))
|
||
|
|
||
|
c = Class.new
|
||
|
c.extend(Olympians)
|
||
|
sc = Class.new(c)
|
||
|
assert_empty(sc.singleton_class.class_variables)
|
||
|
assert_raise(NameError){ sc.singleton_class.class_variable_get(:@@rule) }
|
||
|
c.class_variable_set(:@@foo, 1)
|
||
|
assert_equal([:@@foo], sc.singleton_class.class_variables)
|
||
|
assert_equal(1, sc.singleton_class.class_variable_get(:@@foo))
|
||
|
c = Class.new
|
||
|
o = c.new
|
||
|
o.extend(Olympians)
|
||
|
assert_equal([:@@rule], o.singleton_class.class_variables)
|
||
|
assert_equal("Zeus", o.singleton_class.class_variable_get(:@@rule))
|
||
|
c.class_variable_set(:@@foo, 1)
|
||
|
assert_equal([:@@foo, :@@rule], o.singleton_class.class_variables.sort)
|
||
|
assert_equal(1, o.singleton_class.class_variable_get(:@@foo))
|
||
|
end
|
||
|
def test_variable
|
||
|
assert_instance_of(Integer, $$)
|
||
| variable.c | ||
|---|---|---|
|
mod_cvar_of(VALUE mod, void *data)
|
||
|
{
|
||
|
VALUE tmp = mod;
|
||
|
if (FL_TEST(mod, FL_SINGLETON)) {
|
||
|
if (rb_namespace_p(rb_ivar_get(mod, id__attached__))) {
|
||
|
data = mod_cvar_at(tmp, data);
|
||
|
tmp = cvar_front_klass(tmp);
|
||
|
}
|
||
|
}
|
||
|
for (;;) {
|
||
|
data = mod_cvar_at(tmp, data);
|
||
|
tmp = RCLASS_SUPER(tmp);
|
||