Skip to content

Commit

Permalink
Implement safer WeakMap based on WeakRef
Browse files Browse the repository at this point in the history
  • Loading branch information
piroor committed Nov 21, 2014
1 parent 1c8833c commit aa10780
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions lib/droonga/buffered_tcp_socket.rb
Original file line number Diff line number Diff line change
Expand Up @@ -114,16 +114,18 @@ class Chunk
else
# XXX Ruby 1.9.x (installed by default on Ubuntu 14.0.4LTS etc.)
# doesn't have WeakMap...
require "weakref"

class WeakMap
def initialize
@ids = {}
end

def [](key)
value_object_id = @ids[key.object_id]
if value_object_id
value_ref = @ids[key.object_id]
if value_ref and value_ref.weakref_alive?
begin
ObjectSpace._id2ref(value_object_id)
value_ref.__getobj__
rescue RangeError
nil
end
Expand All @@ -133,7 +135,8 @@ def [](key)
end

def []=(key, value)
@ids[key.object_id] = value.object_id
ref = WeakRef.new(value)
@ids[key.object_id] = ref
value
end
end
Expand Down

0 comments on commit aa10780

Please sign in to comment.