summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-11 09:11:48 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-02-11 09:11:48 +0000
commite3c5fbba9163f608d21e2b14652603258de63f5a (patch)
tree010e3788c20f328d432dcacd8f1db880f832b266 /gc.c
parenta2c779be35d7721a1e067227086a5458f9a16f9a (diff)
* gc.c (define_final, undefine_final): shouldn't add/remove finalizer
of forzen objects. * gc.c (undefine_final): should remove FL_FINALIZE flag. [ruby-dev:37964] (also see [ruby-dev:37959]) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22240 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index 784949cf9e..998772d150 100644
--- a/gc.c
+++ b/gc.c
@@ -2261,9 +2261,11 @@ static VALUE
undefine_final(VALUE os, VALUE obj)
{
rb_objspace_t *objspace = &rb_objspace;
+ if (OBJ_FROZEN(obj)) rb_error_frozen("object");
if (finalizer_table) {
st_delete(finalizer_table, (st_data_t*)&obj, 0);
}
+ FL_UNSET(obj, FL_FINALIZE);
return obj;
}
@@ -2283,6 +2285,7 @@ define_final(int argc, VALUE *argv, VALUE os)
VALUE obj, block, table;
rb_scan_args(argc, argv, "11", &obj, &block);
+ if (OBJ_FROZEN(obj)) rb_error_frozen("object");
if (argc == 1) {
block = rb_block_proc();
}