diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/delegate.rb | 1 | ||||
-rw-r--r-- | lib/weakref.rb | 30 |
2 files changed, 19 insertions, 12 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb index 93c9803a18..d810ccad42 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -184,6 +184,7 @@ class Delegator # Reinitializes delegation from a serialized object. def marshal_load(obj) initialize_methods(obj) + __setobj__(obj) end end 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? |