Sha256: f554d915c6ec624b78d8da1a8782528a766866bdfc8ca20c6ca6cbb84ea16f77

Contents?: true

Size: 1.62 KB

Versions: 10

Compression:

Stored size: 1.62 KB

Contents

module V8
  module Weak
    # weak refs are broken on MRI 1.9 and merely slow on 1.8
    # so we mitigate this by using the 'ref' gem. However, this
    # only mitigates the problem. Under heavy load, you will still
    # get different or terminated objects being returned. bad stuff
    #
    # for other platforms we just use the stdlib 'weakref'
    # implementation
    if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby'
      require 'ref'
      Ref = ::Ref::WeakReference
      WeakValueMap = ::Ref::WeakValueMap
    else
      require 'weakref'
      class Ref
        def initialize(object)
          @ref = ::WeakRef.new(object)
        end
        def object
          @ref.__getobj__
        rescue ::WeakRef::RefError
          nil
        end
      end

      class WeakValueMap
        def initialize
          @values = {}
        end

        def [](key)
          if ref = @values[key]
            ref.object
          end
        end

        def []=(key, value)
          @values[key] = V8::Weak::Ref.new(value)
        end
      end
    end

    module Cell
      def weakcell(name, &block)
        unless storage = instance_variable_get("@#{name}")
          storage = instance_variable_set("@#{name}", Storage.new)
        end
        storage.access(&block)
      end
      class Storage
        def access(&block)
          if @ref
            @ref.object || populate(block)
          else
            populate(block)
          end
        end

        private

        def populate(block)
          occupant = block.call()
          @ref = V8::Weak::Ref.new(occupant)
          return occupant
        end
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 2 rubygems

Version Path
therubyracer-0.11.3 lib/v8/weak.rb
therubyracer-0.11.2 lib/v8/weak.rb
sunrise-cms-0.5.0.rc1 vendor/bundle/ruby/1.9.1/gems/therubyracer-0.11.0/lib/v8/weak.rb
therubyracer-0.11.1 lib/v8/weak.rb
therubyracer-0.11.1beta1 lib/v8/weak.rb
therubyracer-0.11.0 lib/v8/weak.rb
therubyracer-0.11.0beta8-x86-freebsd-9 lib/v8/weak.rb
therubyracer-0.11.0beta8-x86_64-linux lib/v8/weak.rb
therubyracer-0.11.0beta8-x86-linux lib/v8/weak.rb
therubyracer-0.11.0beta8 lib/v8/weak.rb