diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-01-11 10:00:34 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-01-11 10:00:34 +0900 |
| commit | 814328595608a6eb6a2d1b7578d3151d47f9be79 (patch) | |
| tree | eb151545f86c5c33a5a7b7a3e930cab52515fd4e | |
| parent | fb2e0b721fdcf5a65b907ee69ad8e09763632db2 (diff) | |
| parent | ad492eb9f3f217f60fd539bc23cce10ad40a36d1 (diff) | |
| download | mruby-814328595608a6eb6a2d1b7578d3151d47f9be79.tar.gz mruby-814328595608a6eb6a2d1b7578d3151d47f9be79.zip | |
Merge pull request #3080 from kou/fix-class-variable-in-module
Fix class variable reference in module
| -rw-r--r-- | src/variable.c | 2 | ||||
| -rw-r--r-- | test/t/class.rb | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/variable.c b/src/variable.c index bda7b2a98..3b5674923 100644 --- a/src/variable.c +++ b/src/variable.c @@ -773,7 +773,7 @@ mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym) klass = mrb_obj_iv_get(mrb, (struct RObject *)cls, mrb_intern_lit(mrb, "__attached__")); c = mrb_class_ptr(klass); - if (c->tt == MRB_TT_CLASS) { + if (c->tt == MRB_TT_CLASS || c->tt == MRB_TT_MODULE) { while (c) { if (c->iv && iv_get(mrb, c->iv, sym, &v)) { return v; diff --git a/test/t/class.rb b/test/t/class.rb index 720fd37fa..7bcaaf90d 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -384,6 +384,19 @@ assert('class variable and class << self style class method') do assert_equal("value", ClassVariableTest.class_variable) end +assert('class variable in module and class << self style class method') do + module ClassVariableInModuleTest + @@class_variable = "value" + class << self + def class_variable + @@class_variable + end + end + end + + assert_equal("value", ClassVariableInModuleTest.class_variable) +end + assert('class with non-class/module outer raises TypeError') do assert_raise(TypeError) { class 0::C1; end } assert_raise(TypeError) { class []::C2; end } |
