1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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
This commit is contained in:
nobu 2014-09-12 14:25:01 +00:00
parent 4817ab23b3
commit 3889eaca02
2 changed files with 13 additions and 5 deletions

4
eval.c
View file

@ -409,10 +409,6 @@ rb_frozen_class_p(VALUE klass)
noclass:
Check_Type(klass, T_CLASS);
}
if (FL_TEST(klass, FL_SINGLETON)) {
VALUE obj = rb_ivar_get(klass, id__attached__);
if (OBJ_FROZEN(obj)) OBJ_FREEZE(klass);
}
if (OBJ_FROZEN(klass)) {
const char *desc;

View file

@ -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))