therubyracer-st 0.11.0beta5-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +23 -0
 - data/.travis.yml +10 -0
 - data/Changelog.md +242 -0
 - data/Gemfile +15 -0
 - data/README.md +185 -0
 - data/Rakefile +58 -0
 - data/benchmarks.rb +217 -0
 - data/ext/v8/accessor.cc +181 -0
 - data/ext/v8/array.cc +26 -0
 - data/ext/v8/backref.cc +54 -0
 - data/ext/v8/build.rb +53 -0
 - data/ext/v8/constants.cc +34 -0
 - data/ext/v8/constraints.cc +52 -0
 - data/ext/v8/context.cc +130 -0
 - data/ext/v8/date.cc +18 -0
 - data/ext/v8/exception.cc +38 -0
 - data/ext/v8/extconf.rb +23 -0
 - data/ext/v8/external.cc +43 -0
 - data/ext/v8/function.cc +58 -0
 - data/ext/v8/gc.cc +43 -0
 - data/ext/v8/handles.cc +34 -0
 - data/ext/v8/heap.cc +31 -0
 - data/ext/v8/init.cc +39 -0
 - data/ext/v8/invocation.cc +86 -0
 - data/ext/v8/locker.cc +77 -0
 - data/ext/v8/message.cc +51 -0
 - data/ext/v8/object.cc +334 -0
 - data/ext/v8/primitive.cc +8 -0
 - data/ext/v8/rr.cc +83 -0
 - data/ext/v8/rr.h +883 -0
 - data/ext/v8/script.cc +80 -0
 - data/ext/v8/signature.cc +18 -0
 - data/ext/v8/stack.cc +75 -0
 - data/ext/v8/string.cc +47 -0
 - data/ext/v8/template.cc +175 -0
 - data/ext/v8/trycatch.cc +86 -0
 - data/ext/v8/v8.cc +87 -0
 - data/ext/v8/value.cc +239 -0
 - data/lib/v8.rb +36 -0
 - data/lib/v8/access.rb +5 -0
 - data/lib/v8/access/indices.rb +40 -0
 - data/lib/v8/access/invocation.rb +47 -0
 - data/lib/v8/access/names.rb +65 -0
 - data/lib/v8/array.rb +26 -0
 - data/lib/v8/context.rb +243 -0
 - data/lib/v8/conversion.rb +35 -0
 - data/lib/v8/conversion/array.rb +11 -0
 - data/lib/v8/conversion/class.rb +120 -0
 - data/lib/v8/conversion/code.rb +38 -0
 - data/lib/v8/conversion/fundamental.rb +11 -0
 - data/lib/v8/conversion/hash.rb +11 -0
 - data/lib/v8/conversion/indentity.rb +31 -0
 - data/lib/v8/conversion/method.rb +26 -0
 - data/lib/v8/conversion/object.rb +28 -0
 - data/lib/v8/conversion/primitive.rb +7 -0
 - data/lib/v8/conversion/proc.rb +5 -0
 - data/lib/v8/conversion/reference.rb +16 -0
 - data/lib/v8/conversion/string.rb +12 -0
 - data/lib/v8/conversion/symbol.rb +7 -0
 - data/lib/v8/conversion/time.rb +13 -0
 - data/lib/v8/error.rb +25 -0
 - data/lib/v8/error/protect.rb +20 -0
 - data/lib/v8/error/try.rb +15 -0
 - data/lib/v8/function.rb +28 -0
 - data/lib/v8/helper.rb +30 -0
 - data/lib/v8/object.rb +79 -0
 - data/lib/v8/util/weakcell.rb +29 -0
 - data/lib/v8/version.rb +3 -0
 - data/spec/c/array_spec.rb +17 -0
 - data/spec/c/constants_spec.rb +20 -0
 - data/spec/c/exception_spec.rb +26 -0
 - data/spec/c/external_spec.rb +9 -0
 - data/spec/c/function_spec.rb +46 -0
 - data/spec/c/handles_spec.rb +35 -0
 - data/spec/c/locker_spec.rb +38 -0
 - data/spec/c/object_spec.rb +46 -0
 - data/spec/c/script_spec.rb +28 -0
 - data/spec/c/string_spec.rb +16 -0
 - data/spec/c/template_spec.rb +30 -0
 - data/spec/c/trycatch_spec.rb +51 -0
 - data/spec/mem/blunt_spec.rb +42 -0
 - data/spec/redjs_spec.rb +10 -0
 - data/spec/spec_helper.rb +45 -0
 - data/spec/threading_spec.rb +52 -0
 - data/spec/v8/context_spec.rb +19 -0
 - data/spec/v8/conversion_spec.rb +9 -0
 - data/spec/v8/error_spec.rb +21 -0
 - data/spec/v8/function_spec.rb +9 -0
 - data/spec/v8/object_spec.rb +15 -0
 - data/thefrontside.png +0 -0
 - data/therubyracer.gemspec +20 -0
 - data/vendor/v8.dll +0 -0
 - metadata +161 -0
 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Conversion
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Code
         
     | 
| 
      
 3 
     | 
    
         
            +
                include V8::Util::Weakcell
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def to_v8
         
     | 
| 
      
 6 
     | 
    
         
            +
                  fn = to_template.GetFunction()
         
     | 
| 
      
 7 
     | 
    
         
            +
                  V8::Context.link self, fn
         
     | 
| 
      
 8 
     | 
    
         
            +
                  return fn
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def to_template
         
     | 
| 
      
 12 
     | 
    
         
            +
                  weakcell(:template) {V8::C::FunctionTemplate::New(InvocationHandler.new(self))}
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                class InvocationHandler
         
     | 
| 
      
 16 
     | 
    
         
            +
                  include V8::Error::Protect
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  def initialize(code)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @code = code
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  def call(arguments)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    protect do
         
     | 
| 
      
 24 
     | 
    
         
            +
                      context = V8::Context.current
         
     | 
| 
      
 25 
     | 
    
         
            +
                      access = context.access
         
     | 
| 
      
 26 
     | 
    
         
            +
                      args = ::Array.new(arguments.Length())
         
     | 
| 
      
 27 
     | 
    
         
            +
                      0.upto(args.length - 1) do |i|
         
     | 
| 
      
 28 
     | 
    
         
            +
                        if i < args.length
         
     | 
| 
      
 29 
     | 
    
         
            +
                          args[i] = context.to_ruby arguments[i]
         
     | 
| 
      
 30 
     | 
    
         
            +
                        end
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
                      this = context.to_ruby arguments.This()
         
     | 
| 
      
 33 
     | 
    
         
            +
                      context.to_v8 access.methodcall(@code, this, args)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'ref'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class V8::Conversion
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Identity
         
     | 
| 
      
 5 
     | 
    
         
            +
                def to_ruby(v8_object)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  if v8_object.class <= V8::C::Object
         
     | 
| 
      
 7 
     | 
    
         
            +
                    v8_idmap[v8_object.GetIdentityHash()] || super(v8_object)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  else
         
     | 
| 
      
 9 
     | 
    
         
            +
                    super(v8_object)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  end
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def to_v8(ruby_object)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  return super(ruby_object) if ruby_object.is_a?(String) || ruby_object.is_a?(Primitive)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  rb_idmap[ruby_object.object_id] || super(ruby_object)
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def equate(ruby_object, v8_object)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  v8_idmap[v8_object.GetIdentityHash()] = ruby_object
         
     | 
| 
      
 20 
     | 
    
         
            +
                  rb_idmap[ruby_object.object_id] = v8_object
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def v8_idmap
         
     | 
| 
      
 24 
     | 
    
         
            +
                  @v8_idmap ||= Ref::WeakValueMap.new
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def rb_idmap
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @ruby_idmap ||= Ref::WeakValueMap.new
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Conversion
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Method
         
     | 
| 
      
 3 
     | 
    
         
            +
                include V8::Conversion::Code
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def to_v8
         
     | 
| 
      
 6 
     | 
    
         
            +
                  template = @@method_cache[self] ||= to_template
         
     | 
| 
      
 7 
     | 
    
         
            +
                  template.GetFunction()
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                class MethodCache
         
     | 
| 
      
 11 
     | 
    
         
            +
                  def initialize
         
     | 
| 
      
 12 
     | 
    
         
            +
                    @map = Ref::WeakValueMap.new
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  def [](method)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    @map[method.to_s]
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  def []=(method, template)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @map[method.to_s] = template
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                @@method_cache = MethodCache.new
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Conversion
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Object
         
     | 
| 
      
 3 
     | 
    
         
            +
                def to_v8
         
     | 
| 
      
 4 
     | 
    
         
            +
                  Reference.construct! self
         
     | 
| 
      
 5 
     | 
    
         
            +
                end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def to_ruby
         
     | 
| 
      
 8 
     | 
    
         
            +
                  self
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              module NativeObject
         
     | 
| 
      
 13 
     | 
    
         
            +
                def to_ruby
         
     | 
| 
      
 14 
     | 
    
         
            +
                  wrap = if IsArray()
         
     | 
| 
      
 15 
     | 
    
         
            +
                    ::V8::Array
         
     | 
| 
      
 16 
     | 
    
         
            +
                  elsif IsFunction()
         
     | 
| 
      
 17 
     | 
    
         
            +
                    ::V8::Function
         
     | 
| 
      
 18 
     | 
    
         
            +
                  else
         
     | 
| 
      
 19 
     | 
    
         
            +
                    ::V8::Object
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                  wrap.new(self)
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def to_v8
         
     | 
| 
      
 25 
     | 
    
         
            +
                  self
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Conversion
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Reference
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                def self.construct!(object)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  context = V8::Context.current
         
     | 
| 
      
 6 
     | 
    
         
            +
                  constructor = context.to_v8(object.class)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  reference = constructor.NewInstance([V8::C::External::New(object)])
         
     | 
| 
      
 8 
     | 
    
         
            +
                  return reference
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def to_v8
         
     | 
| 
      
 12 
     | 
    
         
            +
                  Reference.construct! self
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/v8/error.rb
    ADDED
    
    | 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module V8
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Error < StandardError
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_reader :value
         
     | 
| 
      
 4 
     | 
    
         
            +
                def initialize(message, value)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  super(message)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  @value = value
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
              const_set :JSError, Error
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              def self.Error(exception)
         
     | 
| 
      
 12 
     | 
    
         
            +
                value = exception.to_ruby
         
     | 
| 
      
 13 
     | 
    
         
            +
                if !exception.kind_of?(V8::C::Value)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  raise V8::Error.new(exception.to_s, value)
         
     | 
| 
      
 15 
     | 
    
         
            +
                elsif exception.IsNativeError()
         
     | 
| 
      
 16 
     | 
    
         
            +
                  if football = exception.GetHiddenValue("rr::Football")
         
     | 
| 
      
 17 
     | 
    
         
            +
                    raise football.Value()
         
     | 
| 
      
 18 
     | 
    
         
            +
                  else
         
     | 
| 
      
 19 
     | 
    
         
            +
                    raise V8::Error.new(exception.Get("message").to_ruby, value)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                else
         
     | 
| 
      
 22 
     | 
    
         
            +
                  raise V8::Error.new(exception.ToString().to_ruby, value)
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Error
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Protect
         
     | 
| 
      
 3 
     | 
    
         
            +
                def protect
         
     | 
| 
      
 4 
     | 
    
         
            +
                  yield
         
     | 
| 
      
 5 
     | 
    
         
            +
                rescue Football => e
         
     | 
| 
      
 6 
     | 
    
         
            +
                  e.kickoff!
         
     | 
| 
      
 7 
     | 
    
         
            +
                rescue Exception => e
         
     | 
| 
      
 8 
     | 
    
         
            +
                  e.extend Football
         
     | 
| 
      
 9 
     | 
    
         
            +
                  e.kickoff!
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              module Football
         
     | 
| 
      
 14 
     | 
    
         
            +
                def kickoff!
         
     | 
| 
      
 15 
     | 
    
         
            +
                  error = V8::C::Exception::Error(message)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  error.SetHiddenValue("rr::Football", V8::C::External::New(self))
         
     | 
| 
      
 17 
     | 
    
         
            +
                  V8::C::ThrowException(error)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/v8/error/try.rb
    ADDED
    
    
    
        data/lib/v8/function.rb
    ADDED
    
    | 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Function < V8::Object
         
     | 
| 
      
 2 
     | 
    
         
            +
              include V8::Error::Try
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              def initialize(native = nil)
         
     | 
| 
      
 5 
     | 
    
         
            +
                super do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  native || V8::C::FunctionTemplate::New().GetFunction()
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              def methodcall(this, *args)
         
     | 
| 
      
 11 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  this ||= @context.native.Global()
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @context.to_ruby try {native.Call(@context.to_v8(this), args.map {|a| @context.to_v8 a})}
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              def call(*args)
         
     | 
| 
      
 18 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  methodcall @context.native.Global(), *args
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def new(*args)
         
     | 
| 
      
 24 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @context.to_ruby try {native.NewInstance(args.map {|a| @context.to_v8 a})}
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/v8/helper.rb
    ADDED
    
    | 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module V8
         
     | 
| 
      
 2 
     | 
    
         
            +
              module_function
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              def find_file(name, where)
         
     | 
| 
      
 5 
     | 
    
         
            +
                where.split(File::PATH_SEPARATOR).each do |path|
         
     | 
| 
      
 6 
     | 
    
         
            +
                file = File.join(path, name)
         
     | 
| 
      
 7 
     | 
    
         
            +
                return file if File.exist? file
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
                false
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              def v8_path
         
     | 
| 
      
 13 
     | 
    
         
            +
                begin
         
     | 
| 
      
 14 
     | 
    
         
            +
                  require 'libv8'
         
     | 
| 
      
 15 
     | 
    
         
            +
                  return Libv8.libv8_source_path
         
     | 
| 
      
 16 
     | 
    
         
            +
                rescue LoadError
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                v8_path = find_file("libv8.a", ENV['PATH'])
         
     | 
| 
      
 20 
     | 
    
         
            +
                File.dirname v8_path if v8_path
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def darwin?
         
     | 
| 
      
 24 
     | 
    
         
            +
                RUBY_PLATFORM =~ /darwin/
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              def mingw?
         
     | 
| 
      
 28 
     | 
    
         
            +
                RUBY_PLATFORM =~ /mingw/
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/v8/object.rb
    ADDED
    
    | 
         @@ -0,0 +1,79 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class V8::Object
         
     | 
| 
      
 2 
     | 
    
         
            +
              include Enumerable
         
     | 
| 
      
 3 
     | 
    
         
            +
              attr_reader :native
         
     | 
| 
      
 4 
     | 
    
         
            +
              alias_method :to_v8, :native
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              def initialize(native = nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                @context = V8::Context.current or fail "tried to initialize a #{self.class} without being in an entered V8::Context"
         
     | 
| 
      
 8 
     | 
    
         
            +
                @native = block_given? ? yield : native || V8::C::Object::New()
         
     | 
| 
      
 9 
     | 
    
         
            +
                @context.link self, @native
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              def [](key)
         
     | 
| 
      
 13 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @context.to_ruby @native.Get(@context.to_v8(key))
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def []=(key, value)
         
     | 
| 
      
 19 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @native.Set(@context.to_v8(key), @context.to_v8(value))
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
                return value
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              def keys
         
     | 
| 
      
 26 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 27 
     | 
    
         
            +
                  names = @native.GetPropertyNames()
         
     | 
| 
      
 28 
     | 
    
         
            +
                  0.upto( names.Length() - 1).to_enum.map {|i| @context.to_ruby names.Get(i)}
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              def values
         
     | 
| 
      
 33 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 34 
     | 
    
         
            +
                  names = @native.GetPropertyNames()
         
     | 
| 
      
 35 
     | 
    
         
            +
                  0.upto( names.Length() - 1).to_enum.map {|i| @context.to_ruby @native.Get(names.Get(i))}
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              def each
         
     | 
| 
      
 40 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 41 
     | 
    
         
            +
                  names = @native.GetPropertyNames()
         
     | 
| 
      
 42 
     | 
    
         
            +
                  0.upto(names.Length() - 1) do |i|
         
     | 
| 
      
 43 
     | 
    
         
            +
                    name = names.Get(i)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    yield @context.to_ruby(name), @context.to_ruby(@native.Get(name))
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              def to_s
         
     | 
| 
      
 50 
     | 
    
         
            +
                @context.enter do
         
     | 
| 
      
 51 
     | 
    
         
            +
                  @context.to_ruby @native.ToString()
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
              def respond_to?(method)
         
     | 
| 
      
 56 
     | 
    
         
            +
                super or self[method] != nil
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              def method_missing(name, *args, &block)
         
     | 
| 
      
 60 
     | 
    
         
            +
                if name.to_s =~ /(.*)=$/
         
     | 
| 
      
 61 
     | 
    
         
            +
                  if args.length > 1
         
     | 
| 
      
 62 
     | 
    
         
            +
                    self[$1] = args
         
     | 
| 
      
 63 
     | 
    
         
            +
                    return args
         
     | 
| 
      
 64 
     | 
    
         
            +
                  else
         
     | 
| 
      
 65 
     | 
    
         
            +
                    self[$1] = args.first
         
     | 
| 
      
 66 
     | 
    
         
            +
                    return args
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
                return super(name, *args, &block) unless self.respond_to?(name)
         
     | 
| 
      
 70 
     | 
    
         
            +
                property = self[name]
         
     | 
| 
      
 71 
     | 
    
         
            +
                if property.kind_of?(V8::Function)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  property.methodcall(self, *args)
         
     | 
| 
      
 73 
     | 
    
         
            +
                elsif args.empty?
         
     | 
| 
      
 74 
     | 
    
         
            +
                  property
         
     | 
| 
      
 75 
     | 
    
         
            +
                else
         
     | 
| 
      
 76 
     | 
    
         
            +
                  raise ArgumentError, "wrong number of arguments (#{args.length} for 0)" unless args.empty?
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module V8
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Util
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Weakcell
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def weakcell(name, &block)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    unless storage = instance_variable_get("@#{name}")
         
     | 
| 
      
 6 
     | 
    
         
            +
                      storage = instance_variable_set("@#{name}", Storage.new)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    end
         
     | 
| 
      
 8 
     | 
    
         
            +
                    storage.access(&block)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class Storage
         
     | 
| 
      
 11 
     | 
    
         
            +
                    def access(&block)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      if @ref
         
     | 
| 
      
 13 
     | 
    
         
            +
                        @ref.object || populate(block)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      else
         
     | 
| 
      
 15 
     | 
    
         
            +
                        populate(block)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      end
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    private
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    def populate(block)
         
     | 
| 
      
 22 
     | 
    
         
            +
                      occupant = block.call()
         
     | 
| 
      
 23 
     | 
    
         
            +
                      @ref = Ref::WeakReference.new(occupant)
         
     | 
| 
      
 24 
     | 
    
         
            +
                      return occupant
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     |