diff options
| -rw-r--r-- | src/class.c | 11 | ||||
| -rw-r--r-- | test/t/class.rb | 14 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/class.c b/src/class.c index 7cb544b43..baefe3fde 100644 --- a/src/class.c +++ b/src/class.c @@ -127,10 +127,19 @@ MRB_API struct RClass* mrb_class_outer_module(mrb_state *mrb, struct RClass *c) { mrb_value outer; + struct RClass *cls; outer = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__outer__")); if (mrb_nil_p(outer)) return NULL; - return mrb_class_ptr(outer); + cls = mrb_class_ptr(outer); + if (cls->tt == MRB_TT_SCLASS) + { + mrb_value klass; + klass = mrb_obj_iv_get(mrb, (struct RObject *)cls, + mrb_intern_lit(mrb, "__attached__")); + cls = mrb_class_ptr(klass); + } + return cls; } static void diff --git a/test/t/class.rb b/test/t/class.rb index 54fadc0ca..eb077fce6 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -410,6 +410,20 @@ assert('class variable in module and class << self style class method') do assert_equal("value", ClassVariableInModuleTest.class_variable) end +assert('child class/module defined in singleton class get parent constant') do + actual = module GetParentConstantTest + EXPECT = "value" + class << self + class CHILD + class << self + EXPECT + end + end + end + end + assert_equal("value", actual) +end + assert('overriding class variable with a module (#3235)') do module ModuleWithCVar @@class_variable = 1 |
