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
 
    
        data/lib/v8/version.rb
    ADDED
    
    
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::Array do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "can store and retrieve a value" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                o = V8::C::Object::New()
         
     | 
| 
      
 6 
     | 
    
         
            +
                a = V8::C::Array::New()
         
     | 
| 
      
 7 
     | 
    
         
            +
                a.Length().should eql 0
         
     | 
| 
      
 8 
     | 
    
         
            +
                a.Set(0, o)
         
     | 
| 
      
 9 
     | 
    
         
            +
                a.Length().should eql 1
         
     | 
| 
      
 10 
     | 
    
         
            +
                a.Get(0).Equals(o).should be_true
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              it "can be initialized with a length" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                a = V8::C::Array::New(5)
         
     | 
| 
      
 15 
     | 
    
         
            +
                a.Length().should eql 5
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "has constant methods for Undefined, Null, True and False" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                [:Undefined, :Null, :True, :False].each do |name|
         
     | 
| 
      
 6 
     | 
    
         
            +
                  constant = V8::C.send(name)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  constant.should_not be_nil
         
     | 
| 
      
 8 
     | 
    
         
            +
                  V8::C.send(name).should be constant
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              it "has a value for the Empty handle" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                V8::C::Value::Empty.should_not be_nil
         
     | 
| 
      
 14 
     | 
    
         
            +
                V8::C::Value::Empty.should be V8::C::Value::Empty
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              it "can access the V8 version" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                V8::C::V8::GetVersion().should match /^3\.11/
         
     | 
| 
      
 19 
     | 
    
         
            +
              end
         
     | 
| 
      
 20 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::Exception do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "can be thrown from Ruby" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                t = V8::C::FunctionTemplate::New(method(:explode))
         
     | 
| 
      
 6 
     | 
    
         
            +
                @cxt.Global().Set("explode", t.GetFunction())
         
     | 
| 
      
 7 
     | 
    
         
            +
                script = V8::C::Script::New(<<-JS, '<eval>')
         
     | 
| 
      
 8 
     | 
    
         
            +
                (function() {
         
     | 
| 
      
 9 
     | 
    
         
            +
                  try {
         
     | 
| 
      
 10 
     | 
    
         
            +
                    explode()
         
     | 
| 
      
 11 
     | 
    
         
            +
                  } catch (e) {
         
     | 
| 
      
 12 
     | 
    
         
            +
                    return e.message
         
     | 
| 
      
 13 
     | 
    
         
            +
                  }
         
     | 
| 
      
 14 
     | 
    
         
            +
                })()
         
     | 
| 
      
 15 
     | 
    
         
            +
                JS
         
     | 
| 
      
 16 
     | 
    
         
            +
                result = script.Run()
         
     | 
| 
      
 17 
     | 
    
         
            +
                result.should_not be_nil
         
     | 
| 
      
 18 
     | 
    
         
            +
                result.should be_kind_of(V8::C::String)
         
     | 
| 
      
 19 
     | 
    
         
            +
                result.Utf8Value().should eql 'did not pay syntax'
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              def explode(arguments)
         
     | 
| 
      
 23 
     | 
    
         
            +
                error = V8::C::Exception::SyntaxError('did not pay syntax')
         
     | 
| 
      
 24 
     | 
    
         
            +
                V8::C::ThrowException(error)
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::Function do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "can be called" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                fn = run '(function() {return "foo"})'
         
     | 
| 
      
 6 
     | 
    
         
            +
                fn.Call(@cxt.Global(), []).Utf8Value().should eql "foo"
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              it "can be called with arguments and context" do
         
     | 
| 
      
 10 
     | 
    
         
            +
                fn = run '(function(one, two, three) {this.one = one; this.two = two; this.three = three})'
         
     | 
| 
      
 11 
     | 
    
         
            +
                one = V8::C::Object::New()
         
     | 
| 
      
 12 
     | 
    
         
            +
                two = V8::C::Object::New()
         
     | 
| 
      
 13 
     | 
    
         
            +
                fn.Call(@cxt.Global(), [one, two, 3])
         
     | 
| 
      
 14 
     | 
    
         
            +
                @cxt.Global().Get("one").should eql one
         
     | 
| 
      
 15 
     | 
    
         
            +
                @cxt.Global().Get("two").should eql two
         
     | 
| 
      
 16 
     | 
    
         
            +
                @cxt.Global().Get("three").should eql 3
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              it "can be called as a constructor" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                fn = run '(function() {this.foo = "foo"})'
         
     | 
| 
      
 21 
     | 
    
         
            +
                fn.NewInstance().Get(V8::C::String::New('foo')).Utf8Value().should eql "foo"
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              it "can be called as a constructor with arguments" do
         
     | 
| 
      
 25 
     | 
    
         
            +
                fn = run '(function(foo) {this.foo = foo})'
         
     | 
| 
      
 26 
     | 
    
         
            +
                object = fn.NewInstance([V8::C::String::New("bar")])
         
     | 
| 
      
 27 
     | 
    
         
            +
                object.Get(V8::C::String::New('foo')).Utf8Value().should eql "bar"
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              it "doesn't kill the world if invoking it throws a javascript exception" do
         
     | 
| 
      
 31 
     | 
    
         
            +
                V8::C::TryCatch() do
         
     | 
| 
      
 32 
     | 
    
         
            +
                  fn = run '(function() { throw new Error("boom!")})'
         
     | 
| 
      
 33 
     | 
    
         
            +
                  fn.Call(@cxt.Global(), [])
         
     | 
| 
      
 34 
     | 
    
         
            +
                  fn.NewInstance([])
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              def run(source)
         
     | 
| 
      
 40 
     | 
    
         
            +
                source = V8::C::String::New(source.to_s)
         
     | 
| 
      
 41 
     | 
    
         
            +
                filename = V8::C::String::New("<eval>")
         
     | 
| 
      
 42 
     | 
    
         
            +
                script = V8::C::Script::New(source, filename)
         
     | 
| 
      
 43 
     | 
    
         
            +
                result = script.Run()
         
     | 
| 
      
 44 
     | 
    
         
            +
                result.kind_of?(V8::C::String) ? result.Utf8Value() : result
         
     | 
| 
      
 45 
     | 
    
         
            +
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "setting up handles scopes" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              include ExplicitScoper
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              before do
         
     | 
| 
      
 7 
     | 
    
         
            +
                def self.instance_eval(*args, &block)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  V8::C::Locker() do
         
     | 
| 
      
 9 
     | 
    
         
            +
                    cxt = V8::C::Context::New()
         
     | 
| 
      
 10 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 11 
     | 
    
         
            +
                      cxt.Enter()
         
     | 
| 
      
 12 
     | 
    
         
            +
                      super(*args, &block)
         
     | 
| 
      
 13 
     | 
    
         
            +
                    ensure
         
     | 
| 
      
 14 
     | 
    
         
            +
                      cxt.Exit()
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              it "can allocate handle scopes" do
         
     | 
| 
      
 21 
     | 
    
         
            +
                  V8::C::HandleScope() do
         
     | 
| 
      
 22 
     | 
    
         
            +
                    V8::C::Object::New()
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end.class.should eql V8::C::Object
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              it "isn't the end of the world if a ruby exception is raised inside a HandleScope" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                begin
         
     | 
| 
      
 28 
     | 
    
         
            +
                  V8::C::HandleScope() do
         
     | 
| 
      
 29 
     | 
    
         
            +
                    raise "boom!"
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                rescue StandardError => e
         
     | 
| 
      
 32 
     | 
    
         
            +
                  e.message.should eql "boom!"
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::Locker do
         
     | 
| 
      
 4 
     | 
    
         
            +
              include ExplicitScoper
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              it "can lock and unlock the VM" do
         
     | 
| 
      
 7 
     | 
    
         
            +
                V8::C::Locker::IsLocked().should be_false
         
     | 
| 
      
 8 
     | 
    
         
            +
                V8::C::Locker() do
         
     | 
| 
      
 9 
     | 
    
         
            +
                  V8::C::Locker::IsLocked().should be_true
         
     | 
| 
      
 10 
     | 
    
         
            +
                  V8::C::Unlocker() do
         
     | 
| 
      
 11 
     | 
    
         
            +
                    V8::C::Locker::IsLocked().should be_false
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
                V8::C::Locker::IsLocked().should be_false
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              it "properly unlocks if an exception is thrown inside a lock block" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                begin
         
     | 
| 
      
 19 
     | 
    
         
            +
                  V8::C::Locker() do
         
     | 
| 
      
 20 
     | 
    
         
            +
                    raise "boom!"
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                rescue
         
     | 
| 
      
 23 
     | 
    
         
            +
                  V8::C::Locker::IsLocked().should be_false
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              it "properly re-locks if an exception is thrown inside an un-lock block" do
         
     | 
| 
      
 28 
     | 
    
         
            +
                V8::C::Locker() do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 30 
     | 
    
         
            +
                    V8::C::Unlocker() do
         
     | 
| 
      
 31 
     | 
    
         
            +
                      raise "boom!"
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
                  rescue
         
     | 
| 
      
 34 
     | 
    
         
            +
                    V8::C::Locker::IsLocked().should be_true
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::Object do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              it "can store and retrieve a value" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                o = V8::C::Object::New()
         
     | 
| 
      
 7 
     | 
    
         
            +
                key = V8::C::String::New("foo")
         
     | 
| 
      
 8 
     | 
    
         
            +
                value = V8::C::String::New("bar")
         
     | 
| 
      
 9 
     | 
    
         
            +
                o.Set(key, value)
         
     | 
| 
      
 10 
     | 
    
         
            +
                o.Get(key).Utf8Value().should eql "bar"
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              it "can retrieve all property names" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                o = V8::C::Object::New()
         
     | 
| 
      
 15 
     | 
    
         
            +
                o.Set(V8::C::String::New("foo"), V8::C::String::New("bar"))
         
     | 
| 
      
 16 
     | 
    
         
            +
                o.Set(V8::C::String::New("baz"), V8::C::String::New("bang"))
         
     | 
| 
      
 17 
     | 
    
         
            +
                names = o.GetPropertyNames()
         
     | 
| 
      
 18 
     | 
    
         
            +
                names.Length().should eql 2
         
     | 
| 
      
 19 
     | 
    
         
            +
                names.Get(0).Utf8Value().should eql "foo"
         
     | 
| 
      
 20 
     | 
    
         
            +
                names.Get(1).Utf8Value().should eql "baz"
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
              it "can set an accessor from ruby" do
         
     | 
| 
      
 23 
     | 
    
         
            +
                o = V8::C::Object::New()
         
     | 
| 
      
 24 
     | 
    
         
            +
                property = V8::C::String::New("statement")
         
     | 
| 
      
 25 
     | 
    
         
            +
                callback_data = V8::C::String::New("I am Legend")
         
     | 
| 
      
 26 
     | 
    
         
            +
                left = V8::C::String::New("Yo! ")
         
     | 
| 
      
 27 
     | 
    
         
            +
                getter = proc do |name, info|
         
     | 
| 
      
 28 
     | 
    
         
            +
                  info.This().StrictEquals(o).should be_true
         
     | 
| 
      
 29 
     | 
    
         
            +
                  info.Holder().StrictEquals(o).should be_true
         
     | 
| 
      
 30 
     | 
    
         
            +
                  V8::C::String::Concat(left, info.Data())
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
                setter = proc do |name, value, info|
         
     | 
| 
      
 33 
     | 
    
         
            +
                  left = value
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
                o.SetAccessor(property, getter, setter, callback_data)
         
     | 
| 
      
 36 
     | 
    
         
            +
                o.Get(property).Utf8Value().should eql "Yo! I am Legend"
         
     | 
| 
      
 37 
     | 
    
         
            +
                o.Set(property, V8::C::String::New("Bro! "))
         
     | 
| 
      
 38 
     | 
    
         
            +
                o.Get(property).Utf8Value().should eql "Bro! I am Legend"
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
              it "always returns the same ruby object for the same V8 object" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                one = V8::C::Object::New()
         
     | 
| 
      
 42 
     | 
    
         
            +
                two = V8::C::Object::New()
         
     | 
| 
      
 43 
     | 
    
         
            +
                one.Set("two", two)
         
     | 
| 
      
 44 
     | 
    
         
            +
                one.Get("two").should be two
         
     | 
| 
      
 45 
     | 
    
         
            +
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: UTF-8
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            describe V8::C::Script do
         
     | 
| 
      
 5 
     | 
    
         
            +
              it "can run a script and return a polymorphic result" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                source = V8::C::String::New("(new Array())")
         
     | 
| 
      
 7 
     | 
    
         
            +
                filename = V8::C::String::New("<eval>")
         
     | 
| 
      
 8 
     | 
    
         
            +
                script = V8::C::Script::New(source, filename)
         
     | 
| 
      
 9 
     | 
    
         
            +
                result = script.Run()
         
     | 
| 
      
 10 
     | 
    
         
            +
                result.should be_kind_of V8::C::Array
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              it "can accept precompiled script data" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                source = "7 * 6"
         
     | 
| 
      
 15 
     | 
    
         
            +
                name = V8::C::String::New("<spec>")
         
     | 
| 
      
 16 
     | 
    
         
            +
                origin = V8::C::ScriptOrigin.new(name)
         
     | 
| 
      
 17 
     | 
    
         
            +
                data = V8::C::ScriptData::PreCompile(source, source.length)
         
     | 
| 
      
 18 
     | 
    
         
            +
                data.HasError().should be_false
         
     | 
| 
      
 19 
     | 
    
         
            +
                script = V8::C::Script::New(V8::C::String::New(source), origin, data)
         
     | 
| 
      
 20 
     | 
    
         
            +
                script.Run().should eql 42
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              it "can detect errors in the script data" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                source = "^ = ;"
         
     | 
| 
      
 25 
     | 
    
         
            +
                data = V8::C::ScriptData::PreCompile(source, source.length)
         
     | 
| 
      
 26 
     | 
    
         
            +
                data.HasError().should be_true
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::String do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "can hold Unicode values outside the Basic Multilingual Plane" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                string = V8::C::String::New("\u{100000}")
         
     | 
| 
      
 6 
     | 
    
         
            +
                string.Utf8Value().should eql "\u{100000}"
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              it "can naturally translate ruby strings into v8 strings" do
         
     | 
| 
      
 10 
     | 
    
         
            +
                V8::C::String::Concat(V8::C::String::New("Hello "), "World").Utf8Value().should eql "Hello World"
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              it "can naturally translate ruby objects into v8 strings" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                V8::C::String::Concat(V8::C::String::New("forty two is "), 42).Utf8Value().should eql "forty two is 42"
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::Template do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              describe V8::C::FunctionTemplate do
         
     | 
| 
      
 6 
     | 
    
         
            +
                it "can be created with no arguments" do
         
     | 
| 
      
 7 
     | 
    
         
            +
                  t = V8::C::FunctionTemplate::New()
         
     | 
| 
      
 8 
     | 
    
         
            +
                  t.GetFunction().Call(@cxt.Global(),[]).StrictEquals(@cxt.Global()).should be_true
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                it "can be created with a callback" do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  receiver = V8::C::Object::New()
         
     | 
| 
      
 13 
     | 
    
         
            +
                  f = nil
         
     | 
| 
      
 14 
     | 
    
         
            +
                  callback = lambda do |arguments|
         
     | 
| 
      
 15 
     | 
    
         
            +
                    arguments.Length().should be(2)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    arguments[0].Utf8Value().should eql 'one'
         
     | 
| 
      
 17 
     | 
    
         
            +
                    arguments[1].Utf8Value().should eql 'two'
         
     | 
| 
      
 18 
     | 
    
         
            +
                    arguments.Callee().StrictEquals(f).should be_true
         
     | 
| 
      
 19 
     | 
    
         
            +
                    arguments.This().StrictEquals(receiver).should be_true
         
     | 
| 
      
 20 
     | 
    
         
            +
                    arguments.Holder().StrictEquals(receiver).should be_true
         
     | 
| 
      
 21 
     | 
    
         
            +
                    arguments.IsConstructCall().should be_false
         
     | 
| 
      
 22 
     | 
    
         
            +
                    arguments.Data().Value().should be(42)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    V8::C::String::New("result")
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
                  t = V8::C::FunctionTemplate::New(callback, V8::C::External::New(42))
         
     | 
| 
      
 26 
     | 
    
         
            +
                  f = t.GetFunction()
         
     | 
| 
      
 27 
     | 
    
         
            +
                  f.Call(receiver, [V8::C::String::New('one'), V8::C::String::New('two')]).Utf8Value().should eql "result"
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe V8::C::External do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              it "can catch javascript exceptions" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                V8::C::V8::SetCaptureStackTraceForUncaughtExceptions(true, 99, V8::C::StackTrace::kDetailed)
         
     | 
| 
      
 7 
     | 
    
         
            +
                V8::C::TryCatch() do |trycatch|
         
     | 
| 
      
 8 
     | 
    
         
            +
                  source = V8::C::String::New(<<-JS)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  function one() {
         
     | 
| 
      
 10 
     | 
    
         
            +
                    two()
         
     | 
| 
      
 11 
     | 
    
         
            +
                  }
         
     | 
| 
      
 12 
     | 
    
         
            +
                  function two() {
         
     | 
| 
      
 13 
     | 
    
         
            +
                    three()
         
     | 
| 
      
 14 
     | 
    
         
            +
                  }
         
     | 
| 
      
 15 
     | 
    
         
            +
                  function three() {
         
     | 
| 
      
 16 
     | 
    
         
            +
                    boom()
         
     | 
| 
      
 17 
     | 
    
         
            +
                  }
         
     | 
| 
      
 18 
     | 
    
         
            +
                  function boom() {
         
     | 
| 
      
 19 
     | 
    
         
            +
                    throw new Error('boom!')
         
     | 
| 
      
 20 
     | 
    
         
            +
                  }
         
     | 
| 
      
 21 
     | 
    
         
            +
                  eval('one()')
         
     | 
| 
      
 22 
     | 
    
         
            +
                  JS
         
     | 
| 
      
 23 
     | 
    
         
            +
                  filename = V8::C::String::New("<eval>")
         
     | 
| 
      
 24 
     | 
    
         
            +
                  script = V8::C::Script::New(source, filename)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  result = script.Run()
         
     | 
| 
      
 26 
     | 
    
         
            +
                  trycatch.HasCaught().should be_true
         
     | 
| 
      
 27 
     | 
    
         
            +
                  trycatch.CanContinue().should be_true
         
     | 
| 
      
 28 
     | 
    
         
            +
                  exception = trycatch.Exception()
         
     | 
| 
      
 29 
     | 
    
         
            +
                  exception.should_not be_nil
         
     | 
| 
      
 30 
     | 
    
         
            +
                  exception.IsNativeError().should be_true
         
     | 
| 
      
 31 
     | 
    
         
            +
                  trycatch.StackTrace().Utf8Value().should match /boom.*three.*two.*one/m
         
     | 
| 
      
 32 
     | 
    
         
            +
                  message = trycatch.Message();
         
     | 
| 
      
 33 
     | 
    
         
            +
                  message.should_not be_nil
         
     | 
| 
      
 34 
     | 
    
         
            +
                  message.Get().Utf8Value().should eql "Uncaught Error: boom!"
         
     | 
| 
      
 35 
     | 
    
         
            +
                  message.GetSourceLine().Utf8Value().should eql "        throw new Error('boom!')"
         
     | 
| 
      
 36 
     | 
    
         
            +
                  message.GetScriptResourceName().Utf8Value().should eql "<eval>"
         
     | 
| 
      
 37 
     | 
    
         
            +
                  message.GetLineNumber().should eql 11
         
     | 
| 
      
 38 
     | 
    
         
            +
                  stack = message.GetStackTrace()
         
     | 
| 
      
 39 
     | 
    
         
            +
                  stack.should_not be_nil
         
     | 
| 
      
 40 
     | 
    
         
            +
                  stack.GetFrameCount().should eql 6
         
     | 
| 
      
 41 
     | 
    
         
            +
                  frame = stack.GetFrame(0)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  frame.GetLineNumber().should eql 11
         
     | 
| 
      
 43 
     | 
    
         
            +
                  frame.GetColumn().should eql 15
         
     | 
| 
      
 44 
     | 
    
         
            +
                  frame.GetScriptName().Utf8Value().should eql "<eval>"
         
     | 
| 
      
 45 
     | 
    
         
            +
                  frame.GetScriptNameOrSourceURL().Utf8Value().should eql "<eval>"
         
     | 
| 
      
 46 
     | 
    
         
            +
                  frame.IsEval().should be_false
         
     | 
| 
      
 47 
     | 
    
         
            +
                  stack.GetFrame(4).IsEval().should be_true
         
     | 
| 
      
 48 
     | 
    
         
            +
                  frame.IsConstructor().should be_false
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "A Very blunt test to make sure that we aren't doing stupid leaks", :memory => true do
         
     | 
| 
      
 4 
     | 
    
         
            +
              before do
         
     | 
| 
      
 5 
     | 
    
         
            +
                if Object.const_defined?(:RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
         
     | 
| 
      
 6 
     | 
    
         
            +
                  pending 'need to figure out how to do memory sanity checks on rbx'
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
                #allocate a single context to make sure that v8 loads its snapshot and
         
     | 
| 
      
 9 
     | 
    
         
            +
                #we pay the overhead.
         
     | 
| 
      
 10 
     | 
    
         
            +
                V8::Context.new
         
     | 
| 
      
 11 
     | 
    
         
            +
                @start_memory = process_memory
         
     | 
| 
      
 12 
     | 
    
         
            +
                GC.stress = true
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              after do
         
     | 
| 
      
 16 
     | 
    
         
            +
                GC.stress = false
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
              it "won't increase process memory by more than 50% no matter how many contexts we create" do
         
     | 
| 
      
 19 
     | 
    
         
            +
                500.times do
         
     | 
| 
      
 20 
     | 
    
         
            +
                   V8::Context.new
         
     | 
| 
      
 21 
     | 
    
         
            +
                   run_v8_gc
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
                process_memory.should <= @start_memory * 1.5
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              it "can eval simple value passing statements repeatedly without significantly increasing memory" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                V8::C::Locker() do
         
     | 
| 
      
 28 
     | 
    
         
            +
                  cxt = V8::Context.new
         
     | 
| 
      
 29 
     | 
    
         
            +
                  500.times do
         
     | 
| 
      
 30 
     | 
    
         
            +
                    cxt.eval('7 * 6')
         
     | 
| 
      
 31 
     | 
    
         
            +
                    run_v8_gc
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
                  process_memory.should <= @start_memory * 1.1
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              def process_memory
         
     | 
| 
      
 38 
     | 
    
         
            +
                /\w*[ ]*#{Process.pid}[ ]*([.,\d]*)[ ]*([.,\d]*)[ ]*([\d]*)[ ]*([\d]*)/.match(`ps aux`)[4].to_i
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
    
        data/spec/redjs_spec.rb
    ADDED
    
    
    
        data/spec/spec_helper.rb
    ADDED
    
    | 
         @@ -0,0 +1,45 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'v8'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            def run_v8_gc
         
     | 
| 
      
 4 
     | 
    
         
            +
              V8::C::V8::LowMemoryNotification()
         
     | 
| 
      
 5 
     | 
    
         
            +
              while !V8::C::V8::IdleNotification() do
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
            end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            def rputs(msg)
         
     | 
| 
      
 10 
     | 
    
         
            +
              puts "<pre>#{ERB::Util.h(msg)}</pre>"
         
     | 
| 
      
 11 
     | 
    
         
            +
              $stdout.flush
         
     | 
| 
      
 12 
     | 
    
         
            +
            end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            module ExplicitScoper;end
         
     | 
| 
      
 15 
     | 
    
         
            +
            module Autoscope
         
     | 
| 
      
 16 
     | 
    
         
            +
              def instance_eval(*args, &block)
         
     | 
| 
      
 17 
     | 
    
         
            +
                return super unless low_level_c_spec? && !explicitly_defines_scope?
         
     | 
| 
      
 18 
     | 
    
         
            +
                V8::C::Locker() do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  V8::C::HandleScope() do
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @cxt = V8::C::Context::New()
         
     | 
| 
      
 21 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 22 
     | 
    
         
            +
                      @cxt.Enter()
         
     | 
| 
      
 23 
     | 
    
         
            +
                      super(*args, &block)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    ensure
         
     | 
| 
      
 25 
     | 
    
         
            +
                      @cxt.Exit()
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              def low_level_c_spec?
         
     | 
| 
      
 32 
     | 
    
         
            +
                return false unless described_class
         
     | 
| 
      
 33 
     | 
    
         
            +
                described_class.name =~ /^V8::C::/
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              def explicitly_defines_scope?
         
     | 
| 
      
 37 
     | 
    
         
            +
                is_a?(ExplicitScoper)
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            RSpec.configure do |c|
         
     | 
| 
      
 42 
     | 
    
         
            +
              c.before(:each) do
         
     | 
| 
      
 43 
     | 
    
         
            +
                extend Autoscope
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     |