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:
parent
4817ab23b3
commit
3889eaca02
2 changed files with 13 additions and 5 deletions
4
eval.c
4
eval.c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue