summaryrefslogtreecommitdiffstats
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
commit9d517a703d71ab3bce6b68545788f663a087efc6 (patch)
tree010e3788c20f328d432dcacd8f1db880f832b266 /gc.c
parentb053e88b150554d9a6d718ea1126a269eb57b1d2 (diff)
downloadruby-9d517a703d71ab3bce6b68545788f663a087efc6.tar.gz
ruby-9d517a703d71ab3bce6b68545788f663a087efc6.tar.xz
ruby-9d517a703d71ab3bce6b68545788f663a087efc6.zip
* 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: http://svn.ruby-lang.org/repos/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 784949cf9..998772d15 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();
}