summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-12-07 15:15:05 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-12-07 15:15:05 +0000
commit1f9981df2ae3adecf4831945cdda1fbc3e2365e1 (patch)
tree191efc9f9def16eba2e785ab5b8d9b842fdb70e3 /lib
parent1e8e90612afc60e770000574f0f3f26368daf7c0 (diff)
* 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')
-rw-r--r--lib/delegate.rb1
-rw-r--r--lib/weakref.rb30
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?