diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-07 15:17:14 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-07 15:17:14 +0000 |
commit | dc859c017d45b204533e7491a193c0d4cb1fa5ad (patch) | |
tree | 262adb2b406121a2ebb9981643a616c61472e62e /lib/weakref.rb | |
parent | e03d9621a6fd80d9fe4b9cb56c495c0cfc0603ce (diff) | |
download | ruby-dc859c017d45b204533e7491a193c0d4cb1fa5ad.tar.gz |
* lib/weakref.rb (WeakRef::__setobj__): should support
marshaling. [ruby-talk:228508]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11365 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/weakref.rb')
-rw-r--r-- | lib/weakref.rb | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/lib/weakref.rb b/lib/weakref.rb index b1c430523b..048f06f459 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -24,7 +24,6 @@ class WeakRef<Delegator @@id_map = {} # obj -> [ref,...] @@id_rev_map = {} # ref -> obj @@final = lambda {|id| - printf "final: %p\n", id __old_status = Thread.critical Thread.critical = true begin @@ -48,19 +47,7 @@ class WeakRef<Delegator # Create a new WeakRef from +orig+. def initialize(orig) - @__id = orig.object_id - printf "orig: %p\n", @__id - ObjectSpace.define_finalizer orig, @@final - ObjectSpace.define_finalizer self, @@final - __old_status = Thread.critical - begin - Thread.critical = true - @@id_map[@__id] = [] unless @@id_map[@__id] - ensure - Thread.critical = __old_status - end - @@id_map[@__id].push self.object_id - @@id_rev_map[self.object_id] = @__id + __setobj__(orig) super end @@ -79,6 +66,18 @@ class WeakRef<Delegator end def __setobj__(obj) + @__id = obj.object_id + ObjectSpace.define_finalizer obj, @@final + ObjectSpace.define_finalizer self, @@final + __old_status = Thread.critical + begin + Thread.critical = true + @@id_map[@__id] = [] unless @@id_map[@__id] + ensure + Thread.critical = __old_status + end + @@id_map[@__id].push self.object_id + @@id_rev_map[self.object_id] = @__id end # Returns true if the referenced object still exists, and false if it has |