therubyracer-st 0.11.0beta5-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/.gitignore +23 -0
  2. data/.travis.yml +10 -0
  3. data/Changelog.md +242 -0
  4. data/Gemfile +15 -0
  5. data/README.md +185 -0
  6. data/Rakefile +58 -0
  7. data/benchmarks.rb +217 -0
  8. data/ext/v8/accessor.cc +181 -0
  9. data/ext/v8/array.cc +26 -0
  10. data/ext/v8/backref.cc +54 -0
  11. data/ext/v8/build.rb +53 -0
  12. data/ext/v8/constants.cc +34 -0
  13. data/ext/v8/constraints.cc +52 -0
  14. data/ext/v8/context.cc +130 -0
  15. data/ext/v8/date.cc +18 -0
  16. data/ext/v8/exception.cc +38 -0
  17. data/ext/v8/extconf.rb +23 -0
  18. data/ext/v8/external.cc +43 -0
  19. data/ext/v8/function.cc +58 -0
  20. data/ext/v8/gc.cc +43 -0
  21. data/ext/v8/handles.cc +34 -0
  22. data/ext/v8/heap.cc +31 -0
  23. data/ext/v8/init.cc +39 -0
  24. data/ext/v8/invocation.cc +86 -0
  25. data/ext/v8/locker.cc +77 -0
  26. data/ext/v8/message.cc +51 -0
  27. data/ext/v8/object.cc +334 -0
  28. data/ext/v8/primitive.cc +8 -0
  29. data/ext/v8/rr.cc +83 -0
  30. data/ext/v8/rr.h +883 -0
  31. data/ext/v8/script.cc +80 -0
  32. data/ext/v8/signature.cc +18 -0
  33. data/ext/v8/stack.cc +75 -0
  34. data/ext/v8/string.cc +47 -0
  35. data/ext/v8/template.cc +175 -0
  36. data/ext/v8/trycatch.cc +86 -0
  37. data/ext/v8/v8.cc +87 -0
  38. data/ext/v8/value.cc +239 -0
  39. data/lib/v8.rb +36 -0
  40. data/lib/v8/access.rb +5 -0
  41. data/lib/v8/access/indices.rb +40 -0
  42. data/lib/v8/access/invocation.rb +47 -0
  43. data/lib/v8/access/names.rb +65 -0
  44. data/lib/v8/array.rb +26 -0
  45. data/lib/v8/context.rb +243 -0
  46. data/lib/v8/conversion.rb +35 -0
  47. data/lib/v8/conversion/array.rb +11 -0
  48. data/lib/v8/conversion/class.rb +120 -0
  49. data/lib/v8/conversion/code.rb +38 -0
  50. data/lib/v8/conversion/fundamental.rb +11 -0
  51. data/lib/v8/conversion/hash.rb +11 -0
  52. data/lib/v8/conversion/indentity.rb +31 -0
  53. data/lib/v8/conversion/method.rb +26 -0
  54. data/lib/v8/conversion/object.rb +28 -0
  55. data/lib/v8/conversion/primitive.rb +7 -0
  56. data/lib/v8/conversion/proc.rb +5 -0
  57. data/lib/v8/conversion/reference.rb +16 -0
  58. data/lib/v8/conversion/string.rb +12 -0
  59. data/lib/v8/conversion/symbol.rb +7 -0
  60. data/lib/v8/conversion/time.rb +13 -0
  61. data/lib/v8/error.rb +25 -0
  62. data/lib/v8/error/protect.rb +20 -0
  63. data/lib/v8/error/try.rb +15 -0
  64. data/lib/v8/function.rb +28 -0
  65. data/lib/v8/helper.rb +30 -0
  66. data/lib/v8/object.rb +79 -0
  67. data/lib/v8/util/weakcell.rb +29 -0
  68. data/lib/v8/version.rb +3 -0
  69. data/spec/c/array_spec.rb +17 -0
  70. data/spec/c/constants_spec.rb +20 -0
  71. data/spec/c/exception_spec.rb +26 -0
  72. data/spec/c/external_spec.rb +9 -0
  73. data/spec/c/function_spec.rb +46 -0
  74. data/spec/c/handles_spec.rb +35 -0
  75. data/spec/c/locker_spec.rb +38 -0
  76. data/spec/c/object_spec.rb +46 -0
  77. data/spec/c/script_spec.rb +28 -0
  78. data/spec/c/string_spec.rb +16 -0
  79. data/spec/c/template_spec.rb +30 -0
  80. data/spec/c/trycatch_spec.rb +51 -0
  81. data/spec/mem/blunt_spec.rb +42 -0
  82. data/spec/redjs_spec.rb +10 -0
  83. data/spec/spec_helper.rb +45 -0
  84. data/spec/threading_spec.rb +52 -0
  85. data/spec/v8/context_spec.rb +19 -0
  86. data/spec/v8/conversion_spec.rb +9 -0
  87. data/spec/v8/error_spec.rb +21 -0
  88. data/spec/v8/function_spec.rb +9 -0
  89. data/spec/v8/object_spec.rb +15 -0
  90. data/thefrontside.png +0 -0
  91. data/therubyracer.gemspec +20 -0
  92. data/vendor/v8.dll +0 -0
  93. 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,11 @@
1
+ class V8::Conversion
2
+ module Fundamental
3
+ def to_ruby(v8_object)
4
+ v8_object.to_ruby
5
+ end
6
+
7
+ def to_v8(ruby_object)
8
+ ruby_object.to_v8
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class V8::Conversion
2
+ module Hash
3
+ def to_v8
4
+ object = V8::Object.new
5
+ each do |key, value|
6
+ object[key] = value
7
+ end
8
+ return object.to_v8
9
+ end
10
+ end
11
+ 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,7 @@
1
+ class V8::Conversion
2
+ module Primitive
3
+ def to_v8
4
+ return self
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class V8::Conversion
2
+ module Proc
3
+ include V8::Conversion::Code
4
+ end
5
+ 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
@@ -0,0 +1,12 @@
1
+ class V8::Conversion
2
+ module String
3
+ def to_v8
4
+ V8::C::String::New(self)
5
+ end
6
+ end
7
+ module NativeString
8
+ def to_ruby
9
+ self.Utf8Value()
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ class V8::Conversion
2
+ module Symbol
3
+ def to_v8
4
+ V8::C::String::NewSymbol(to_s)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ class V8::Conversion
2
+ module Time
3
+ def to_v8
4
+ V8::C::Date::New(to_f * 1000)
5
+ end
6
+ end
7
+
8
+ module NativeDate
9
+ def to_ruby
10
+ ::Time.at(self.NumberValue() / 1000)
11
+ end
12
+ end
13
+ end
@@ -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
@@ -0,0 +1,15 @@
1
+ class V8::Error
2
+ module Try
3
+ def try
4
+ context = V8::Context.current
5
+ V8::C::TryCatch() do |trycatch|
6
+ result = yield
7
+ if trycatch.HasCaught()
8
+ V8::Error(trycatch.Exception())
9
+ else
10
+ result
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -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
@@ -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
@@ -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