Sha256: ebce65dfc85da20ab74643eefdd89ee1b8d26525448f63e2526c8bb6ae3e148f

Contents?: true

Size: 1.18 KB

Versions: 2

Compression:

Stored size: 1.18 KB

Contents

module V8
  class Object
    include Enumerable

    def initialize(native, portal)
      @native, @portal = native, portal
    end

    def [](key)
      @portal.open do |to|
        to.rb(@native.Get(to.v8(key)))
      end
    end

    def []=(key, value)
      value.tap do
        @portal.open do |to|
          @native.Set(to.v8(key), to.v8(value))
        end
      end
    end

    def to_s
      @portal.open do |to|
        to.rb(@native.ToString())
      end
    end

    def each
      @portal.open do |to|
        for prop in to.rb(@native.GetPropertyNames())
          yield prop, self[prop]
        end
      end
    end

    def respond_to?(method)
      self[method] != nil
    end

    def method_missing(name, *args, &block)
      return super(name, *args, &block) unless self.respond_to?(name)
      property = self[name]
      if property.kind_of?(V8::Function)
        property.methodcall(self, *args)
      elsif args.empty?
        property
      else
        raise ArgumentError, "wrong number of arguments (#{args.length} for 0)" unless args.empty?
      end
    end
  end
end

class Object  
  def eval_js(javascript)
    V8::Context.new(:with => self).eval(javascript)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
therubyracer-0.8.0.pre2 lib/v8/object.rb
therubyracer-0.8.0.pre lib/v8/object.rb