diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-07-17 09:38:10 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-07-17 09:38:10 +0000 |
commit | 448e63d627bf3653da0b3dc0dcf93e161829dc71 (patch) | |
tree | f79b454b1c6352c12dae4915f0e136c228d71a9f /lib/weakref.rb | |
parent | 23dd3051c06c781b3905c993fd8fc1b3ccff6b81 (diff) |
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@837 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/weakref.rb')
-rw-r--r-- | lib/weakref.rb | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/lib/weakref.rb b/lib/weakref.rb index a6519e64c0..3307a2e5aa 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -18,33 +18,33 @@ class WeakRef<Delegator ID_MAP = {} # obj -> [ref,...] ID_REV_MAP = {} # ref -> obj - ObjectSpace.add_finalizer(lambda{|id| - __old_status = Thread.critical - Thread.critical = true - begin - rids = ID_MAP[id] - if rids - for rid in rids - ID_REV_MAP[rid] = nil - end - ID_MAP[id] = nil - end - rid = ID_REV_MAP[id] - if rid - ID_REV_MAP[id] = nil - ID_MAP[rid].delete(id) - ID_MAP[rid] = nil if ID_MAP[rid].empty? - end - ensure - Thread.critical = __old_status - end - }) + @@final = lambda{|id| + __old_status = Thread.critical + Thread.critical = true + begin + rids = ID_MAP[id] + if rids + for rid in rids + ID_REV_MAP[rid] = nil + end + ID_MAP[id] = nil + end + rid = ID_REV_MAP[id] + if rid + ID_REV_MAP[id] = nil + ID_MAP[rid].delete(id) + ID_MAP[rid] = nil if ID_MAP[rid].empty? + end + ensure + Thread.critical = __old_status + end + } def initialize(orig) super @__id = orig.__id__ - ObjectSpace.call_finalizer orig - ObjectSpace.call_finalizer self + ObjectSpace.define_finalizer orig, @@final + ObjectSpace.defin_finalizer self, @@final ID_MAP[@__id] = [] unless ID_MAP[@__id] ID_MAP[@__id].push self.__id__ ID_REV_MAP[self.id] = @__id @@ -64,10 +64,6 @@ class WeakRef<Delegator false end end - - def [] - __getobj__ - end end if __FILE__ == $0 |