diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/delegate.rb | 2 | ||||
-rw-r--r-- | lib/weakref.rb | 27 |
2 files changed, 14 insertions, 15 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb index a961cbaad3..8574bc39ec 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -115,7 +115,7 @@ # implementation, see SimpleDelegator. # class Delegator - preserved = ["__id__", "object_id", "__send__", "__send", "__send!", "respond_to?", "send", "funcall"] + preserved = [:__id__, :object_id, :__send__, :__send, :__send!, :respond_to?, :send, :funcall] instance_methods.each do |m| next if preserved.include?(m) undef_method m diff --git a/lib/weakref.rb b/lib/weakref.rb index b1c430523b..048f06f459 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 |