diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-07 15:15:05 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-12-07 15:15:05 +0000 |
commit | 1f9981df2ae3adecf4831945cdda1fbc3e2365e1 (patch) | |
tree | 191efc9f9def16eba2e785ab5b8d9b842fdb70e3 /lib/weakref.rb | |
parent | 1e8e90612afc60e770000574f0f3f26368daf7c0 (diff) | |
download | ruby-1f9981df2ae3adecf4831945cdda1fbc3e2365e1.tar.gz |
* lib/weakref.rb (WeakRef::__setobj__): should support
marshaling. [ruby-talk:228508]
* lib/delegate.rb (Delegator::marshal_load): need to call
__setobj__.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@11363 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/weakref.rb')
-rw-r--r-- | lib/weakref.rb | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/lib/weakref.rb b/lib/weakref.rb index 7d43f71264..591819c948 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -48,18 +48,7 @@ class WeakRef<Delegator # Create a new WeakRef from +orig+. def initialize(orig) super - @__id = orig.__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.__id__ - @@id_rev_map[self.__id__] = @__id + __setobj__(orig) end # Return the object this WeakRef references. Raises RefError if the object @@ -76,6 +65,23 @@ class WeakRef<Delegator end end + def __setobj__(obj) + @__id = obj.__id__ + __old_status = Thread.critical + begin + Thread.critical = true + unless @@id_rev_map.key?(self) + ObjectSpace.define_finalizer obj, @@final + ObjectSpace.define_finalizer self, @@final + end + @@id_map[@__id] = [] unless @@id_map[@__id] + ensure + Thread.critical = __old_status + end + @@id_map[@__id].push self.__id__ + @@id_rev_map[self.__id__] = @__id + end + # Returns true if the referenced object still exists, and false if it has # been garbage collected. def weakref_alive? |