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

* object.c (rb_obj_freeze): preserve frozen state of immediate

values in internal hash table, a la generic_ivar.

* object.c (rb_obj_frozen_p): check immediate values too.

* variable.c (generic_ivar_set): add frozen check fro immediate
  values.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2007-12-18 08:28:39 +00:00
parent 98da73bc96
commit 2521b33ed7
4 changed files with 24 additions and 2 deletions

View file

@ -1,3 +1,13 @@
Tue Dec 18 17:27:12 2007 Yukihiro Matsumoto <matz@ruby-lang.org>
* object.c (rb_obj_freeze): preserve frozen state of immediate
values in internal hash table, a la generic_ivar.
* object.c (rb_obj_frozen_p): check immediate values too.
* variable.c (generic_ivar_set): add frozen check fro immediate
values.
Tue Dec 18 17:04:25 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* transcode.c (rb_str_transcode_bang, rb_str_transcode): set new

View file

@ -385,6 +385,7 @@ VALUE rb_obj_taint(VALUE);
VALUE rb_obj_tainted(VALUE);
VALUE rb_obj_untaint(VALUE);
VALUE rb_obj_freeze(VALUE);
VALUE rb_obj_frozen_p(VALUE);
VALUE rb_obj_id(VALUE);
VALUE rb_obj_class(VALUE);
VALUE rb_class_real(VALUE);

View file

@ -697,6 +697,7 @@ rb_obj_infect(VALUE obj1, VALUE obj2)
OBJ_INFECT(obj1, obj2);
}
static st_table *immediate_frozen_tbl = 0;
/*
* call-seq:
@ -725,6 +726,12 @@ rb_obj_freeze(VALUE obj)
rb_raise(rb_eSecurityError, "Insecure: can't freeze object");
}
OBJ_FREEZE(obj);
if (SPECIAL_CONST_P(obj)) {
if (!immediate_frozen_tbl) {
immediate_frozen_tbl = st_init_numtable();
}
st_insert(immediate_frozen_tbl, obj, (st_data_t)Qtrue);
}
}
return obj;
}
@ -740,10 +747,14 @@ rb_obj_freeze(VALUE obj)
* a.frozen? #=> true
*/
static VALUE
VALUE
rb_obj_frozen_p(VALUE obj)
{
if (OBJ_FROZEN(obj)) return Qtrue;
if (SPECIAL_CONST_P(obj)) {
if (!immediate_frozen_tbl) return Qfalse;
if (st_lookup(immediate_frozen_tbl, obj, 0)) return Qtrue;
}
return Qfalse;
}

View file

@ -804,12 +804,12 @@ generic_ivar_set(VALUE obj, ID id, VALUE val)
st_data_t data;
if (rb_special_const_p(obj)) {
if (rb_obj_frozen_p(obj)) rb_error_frozen("object");
special_generic_ivar = 1;
}
if (!generic_iv_tbl) {
generic_iv_tbl = st_init_numtable();
}
if (!st_lookup(generic_iv_tbl, obj, &data)) {
FL_SET(obj, FL_EXIVAR);
tbl = st_init_numtable();