diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 08:28:39 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 08:28:39 +0000 |
commit | 2521b33ed74822cb6e81a180bfbcfff3e1683815 (patch) | |
tree | 834de15f9d5c89449fe1bbeea9d4f905b35aad12 /object.c | |
parent | 98da73bc963e17b25c9df961f407c91cffbfc2f4 (diff) | |
download | ruby-2521b33ed74822cb6e81a180bfbcfff3e1683815.tar.gz |
* 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
Diffstat (limited to 'object.c')
-rw-r--r-- | object.c | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -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; } |