discourse/lib/freedom_patches/fix_rubyracer_memory_leak.rb

34 lines
697 B
Ruby

## TODO: DELETE ME WHEN https://github.com/cowboyd/therubyracer/pull/336
# is upstreamed and released
#
module V8
module Weak
class WeakValueMap
def initialize
@values = {}
end
def [](key)
if ref = @values[key]
ref.object
end
end
def []=(key, value)
ref = V8::Weak::Ref.new(value)
ObjectSpace.define_finalizer(value, self.class.ensure_cleanup(@values, key, ref))
@values[key] = ref
end
private
def self.ensure_cleanup(values,key,ref)
proc {
values.delete(key) if values[key] == ref
}
end
end
end
end