summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-10 22:02:51 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-10 22:02:51 +0900
commit9094415acfff11b4590f156eb44cf24483a6fb00 (patch)
tree7a3bd2000609a665d2c67f8cc028e7e4ac736fd9 /src/variable.c
parent0048dd118a0d57ff87265593819f9e93e05fafed (diff)
downloadmruby-9094415acfff11b4590f156eb44cf24483a6fb00.tar.gz
mruby-9094415acfff11b4590f156eb44cf24483a6fb00.zip
An object attached to a singleton class may not be a class; fix #3587
The fix for #3539 was incomplete.
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/variable.c b/src/variable.c
index f130a968f..e639eeb50 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -821,10 +821,19 @@ mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
if (cls && cls->tt == MRB_TT_SCLASS) {
mrb_value klass;
- klass = mrb_obj_iv_get(mrb, (struct RObject*)cls,
- mrb_intern_lit(mrb, "__attached__"));
- c = mrb_class_ptr(klass);
+ klass = mrb_obj_iv_get(mrb, (struct RObject*)cls,
+ mrb_intern_lit(mrb, "__attached__"));
+ switch (mrb_type(klass)) {
+ case MRB_TT_CLASS:
+ case MRB_TT_MODULE:
+ case MRB_TT_SCLASS:
+ c = mrb_class_ptr(klass);
+ break;
+ default:
+ c = cls;
+ break;
+ }
}
else{
c = cls;