Sha256: 5243f4f0ebca8bffcc74ac7dbefcb5bcf87a2c9a1678ac3a720292bce66a09bf

Contents?: true

Size: 1.76 KB

Versions: 77

Compression:

Stored size: 1.76 KB

Contents

module V8
  class Portal
    class Templates

      attr_reader :portal

      def initialize(portal)
        @portal = portal
        @constructors = {}
        @methods = {}
        @procs = {}
        @releases = {}
      end

      def to_constructor(ruby_class)
        class_id = ruby_class.object_id
        if constructor = @constructors[class_id]
          return constructor
        else
          constructor = @constructors[class_id] = ConstructorAdapter.new(self, class_id)
          ObjectSpace.define_finalizer(ruby_class, release(@constructors, class_id))
          return constructor
        end
      end

      def to_function(code)
        case code
        when Method, UnboundMethod
          if fn = @methods[code.to_s]
            return fn
          else
            function = @methods[code.to_s] = FunctionAdapter.new(@portal, code)
            #TODO: test this weak behavior
            function.template.MakeWeak(0, release(@methods, code.to_s))
            return function
          end
        else
          if fn = @procs[code]
            return fn
          else
            function = @procs[code] = FunctionAdapter.new(@portal, code)
            #TODO: test this weak behavior
            function.template.MakeWeak(0, release(@procs, code))
            return function
          end
        end
      end

      def proxies
        @portal.proxies
      end

      def release(refs, id)
        release = Release.new(@releases, refs, id)
        @releases[release] = true
        return release
      end

      class Release
        def initialize(releases, refs, id)
          @releases, @refs, @id = releases, refs, id
        end

        def call(*args)
          @refs.delete(@id)
          @releases.delete(self)
        end

      end
    end
  end
end

Version data entries

77 entries across 77 versions & 5 rubygems

Version Path
therubyracer-0.9.6 lib/v8/portal/templates.rb
therubyracer-0.9.5 lib/v8/portal/templates.rb
therubyracer-0.9.4 lib/v8/portal/templates.rb
therubyracer-0.9.3 lib/v8/portal/templates.rb
therubyracer-0.9.3beta1 lib/v8/portal/templates.rb
therubyracer-0.9.2 lib/v8/portal/templates.rb
therubyracer-0.9.2beta1 lib/v8/portal/templates.rb
therubyracer-0.9.1 lib/v8/portal/templates.rb
therubyracer-0.9.1beta1 lib/v8/portal/templates.rb
therubyracer-0.9.0 lib/v8/portal/templates.rb
therubyracer-0.9.0beta7 lib/v8/portal/templates.rb
therubyracer-0.9.0beta6 lib/v8/portal/templates.rb
therubyracer-0.9.0beta5 lib/v8/portal/templates.rb
therubyracer-0.9.0beta4 lib/v8/portal/templates.rb
therubyracer-0.9.0beta3 lib/v8/portal/templates.rb
therubyracer-0.9.0beta2 lib/v8/portal/templates.rb
therubyracer-0.9.0beta1 lib/v8/portal/templates.rb