diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-07 11:39:11 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-04-07 11:39:11 +0900 |
| commit | 7e285107255877f92db2df84d104afef54030ea8 (patch) | |
| tree | 8da0d34869be64e1080f6ed67ea384bf9037f14a | |
| parent | e5b61d34f65cabfbe88f3f1709a1f9cff86585de (diff) | |
| parent | fd0f79ca677759251e011cbe3f7fbbe88db57b62 (diff) | |
| download | mruby-7e285107255877f92db2df84d104afef54030ea8.tar.gz mruby-7e285107255877f92db2df84d104afef54030ea8.zip | |
Merge pull request #3594 from keizo042/fix_isssue_3575
Get constant of parent class even if child class is defined in signle…
| -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 |
