Commit 5efe77fe authored by Kouichi Nakanishi's avatar Kouichi Nakanishi

Modify class variable definition in singleton class; fix #3539

parent 898077a2
...@@ -819,12 +819,22 @@ mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v) ...@@ -819,12 +819,22 @@ mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
c = c->super; c = c->super;
} }
if (!cls->iv) { if (cls && cls->tt == MRB_TT_SCLASS) {
cls->iv = iv_new(mrb); mrb_value klass;
klass = mrb_obj_iv_get(mrb, (struct RObject*)cls,
mrb_intern_lit(mrb, "__attached__"));
c = mrb_class_ptr(klass);
}else{
c = cls;
}
if (!c->iv) {
c->iv = iv_new(mrb);
} }
mrb_write_barrier(mrb, (struct RBasic*)cls); mrb_write_barrier(mrb, (struct RBasic*)c);
iv_put(mrb, cls->iv, sym, v); iv_put(mrb, c->iv, sym, v);
} }
MRB_API void MRB_API void
......
...@@ -384,6 +384,19 @@ assert('class variable and class << self style class method') do ...@@ -384,6 +384,19 @@ assert('class variable and class << self style class method') do
assert_equal("value", ClassVariableTest.class_variable) assert_equal("value", ClassVariableTest.class_variable)
end end
assert('class variable definition in singleton_class') do
class ClassVariableDefinitionInSingletonTest
class << self
@@class_variable = "value"
end
def class_variable
@@class_variable
end
end
assert_equal("value", ClassVariableDefinitionInSingletonTest.new.class_variable)
end
assert('class variable in module and class << self style class method') do assert('class variable in module and class << self style class method') do
module ClassVariableInModuleTest module ClassVariableInModuleTest
@@class_variable = "value" @@class_variable = "value"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment