summaryrefslogtreecommitdiff
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
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
-rw-r--r--ChangeLog8
-rw-r--r--gc.c3
2 files changed, 11 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 5d19e8a3e4..4d52135bff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed Feb 11 18:09:41 2009 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * 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])
+
Wed Feb 11 17:37:41 2009 Tanaka Akira <akr@fsij.org>
* ext/socket/lib/socket.rb (Socket.udp_server_sockets): call the block
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();
}