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
sunrise-cms-0.3.1 vendor/bundle/ruby/1.9.1/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
sunrise-cms-0.3.0 vendor/bundle/ruby/1.9.1/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.8 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
therubyracer-freebsd-0.10.1 lib/v8/portal/templates.rb
classiccms-0.3.7 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.6 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.5 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.4 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.3 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.2 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
classiccms-0.3.1 vendor/bundle/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
sunrise-cms-0.3.0.rc vendor/bundle/ruby/1.9.1/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
horseman-0.0.5 vendor/ruby/1.9.1/gems/therubyracer-0.10.1/lib/v8/portal/templates.rb
therubyracer-0.10.1 lib/v8/portal/templates.rb
therubyracer-0.10.0 lib/v8/portal/templates.rb
therubyracer-0.9.10 lib/v8/portal/templates.rb
therubyracer-0.9.9 lib/v8/portal/templates.rb
therubyracer-0.9.8 lib/v8/portal/templates.rb
therubyracer-0.10.0beta1 lib/v8/portal/templates.rb
therubyracer-0.9.7 lib/v8/portal/templates.rb