summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-01-11 10:00:34 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-01-11 10:00:34 +0900
commit814328595608a6eb6a2d1b7578d3151d47f9be79 (patch)
treeeb151545f86c5c33a5a7b7a3e930cab52515fd4e
parentfb2e0b721fdcf5a65b907ee69ad8e09763632db2 (diff)
parentad492eb9f3f217f60fd539bc23cce10ad40a36d1 (diff)
downloadmruby-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.c2
-rw-r--r--test/t/class.rb13
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 }