From 6d33d9cfb832fbd318cd460dfba5b1b3a2edfb5a Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 18 Dec 2007 08:28:39 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@14294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- object.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'object.c') diff --git a/object.c b/object.c index aa1b1caaf..c33123b2f 100644 --- a/object.c +++ b/object.c @@ -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; } -- cgit