summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--lib/delegate.rb1
-rw-r--r--lib/weakref.rb30
3 files changed, 27 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 0ca9b0dc93..773be8af70 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Dec 7 09:29:02 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * lib/weakref.rb (WeakRef::__setobj__): should support
+ marshaling. [ruby-talk:228508]
+
+ * lib/delegate.rb (Delegator::marshal_load): need to call
+ __setobj__.
+
Wed Dec 6 23:56:14 2006 Nobuyoshi Nakada <nobu@ruby-lang.org>
* Makefile.in, common.mk (NULLCMD): moved for platforms that empty
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?