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 | d5469749a8ea139bd83b5766b8cc4507146eaa8b (patch) | |
| tree | 262adb2b406121a2ebb9981643a616c61472e62e /lib/weakref.rb | |
| parent | 0cb6bc63c2a3aa73369ee02b009626559b6481c3 (diff) | |
| download | ruby-d5469749a8ea139bd83b5766b8cc4507146eaa8b.tar.gz ruby-d5469749a8ea139bd83b5766b8cc4507146eaa8b.tar.xz ruby-d5469749a8ea139bd83b5766b8cc4507146eaa8b.zip | |
* lib/weakref.rb (WeakRef::__setobj__): should support
marshaling. [ruby-talk:228508]
git-svn-id: http://svn.ruby-lang.org/repos/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 b1c430523..048f06f45 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 |
