summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-12 14:25:01 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-12 14:25:01 (GMT)
commit3889eaca02a641d5b5acf2f15bdf0d4dac4e3d00 (patch)
tree43c33edc50133d4bef4db944dbc5f31e28215b2a /include
parent4817ab23b31c2c71682c3d54e9da45f53fa7f154 (diff)
ruby/ruby.h: freeze singleton class
* include/ruby/ruby.h (rb_obj_freeze_inline): propagate freezing to the singleton class if it is existing. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47557 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'include')
-rw-r--r--include/ruby/ruby.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index c7ab5ef..b198e65 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -1105,7 +1105,19 @@ struct RStruct {
RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT : 0)
#define OBJ_FROZEN(x) (FL_ABLE(x) ? !!(RBASIC(x)->flags&FL_FREEZE) : 1)
-#define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
+#define OBJ_FREEZE(x) rb_obj_freeze_inline((VALUE)x)
+
+static inline void
+rb_obj_freeze_inline(VALUE x)
+{
+ if (FL_ABLE(x)) {
+ VALUE klass = RBASIC_CLASS(x);
+ RBASIC(x)->flags |= FL_FREEZE;
+ if (FL_TEST(klass, (FL_SINGLETON|FL_FREEZE)) == FL_SINGLETON) {
+ RBASIC(klass)->flags |= FL_FREEZE;
+ }
+ }
+}
#if USE_RGENGC
#define OBJ_PROMOTED_RAW(x) ((RBASIC(x)->flags & (FL_PROMOTED0|FL_PROMOTED1)) == (FL_PROMOTED0|FL_PROMOTED1))