Skip to content
This repository was archived by the owner on Dec 4, 2023. It is now read-only.

Commit d9f7042

Browse files
committed
Merge pull request #370 from cowboyd/4.5/start-implementing-context-specs
add back simple evaluation specs
2 parents da152e3 + 78ac679 commit d9f7042

8 files changed

Lines changed: 1150 additions & 109 deletions

File tree

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ before_install:
2323
script:
2424
- bundle exec rake compile
2525
- bundle exec rspec spec/c
26+
- bundle exec rspec spec/v8/context_spec.rb
2627
sudo: false
2728
addons:
2829
apt:

lib/v8.rb

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
require "v8/version"
22

3-
require 'v8/weak'
43
require 'v8/init'
5-
require 'v8/error'
6-
require 'v8/stack'
4+
require 'v8/isolate'
5+
require 'v8/context'
6+
# require 'v8/error'
7+
# require 'v8/stack'
78
require 'v8/conversion/fundamental'
8-
require 'v8/conversion/indentity'
9-
require 'v8/conversion/reference'
10-
require 'v8/conversion/primitive'
11-
require 'v8/conversion/code'
12-
require 'v8/conversion/class'
13-
require 'v8/conversion/object'
14-
require 'v8/conversion/time'
15-
require 'v8/conversion/hash'
16-
require 'v8/conversion/array'
17-
require 'v8/conversion/proc'
18-
require 'v8/conversion/method'
19-
require 'v8/conversion/symbol'
20-
require 'v8/conversion/string'
21-
require 'v8/conversion/fixnum'
9+
# require 'v8/conversion/indentity'
10+
# require 'v8/conversion/reference'
11+
# require 'v8/conversion/primitive'
12+
# require 'v8/conversion/code'
13+
# require 'v8/conversion/class'
14+
# require 'v8/conversion/object'
15+
# require 'v8/conversion/time'
16+
# require 'v8/conversion/hash'
17+
# require 'v8/conversion/array'
18+
# require 'v8/conversion/proc'
19+
# require 'v8/conversion/method'
20+
# require 'v8/conversion/symbol'
21+
# require 'v8/conversion/string'
22+
# require 'v8/conversion/fixnum'
2223
require 'v8/conversion'
23-
require 'v8/access/names'
24-
require 'v8/access/indices'
25-
require 'v8/access/invocation'
26-
require 'v8/access'
27-
require 'v8/context'
28-
require 'v8/object'
29-
require 'v8/array'
30-
require 'v8/function'
24+
# require 'v8/access/names'
25+
# require 'v8/access/indices'
26+
# require 'v8/access/invocation'
27+
# require 'v8/access'
28+
# require 'v8/context'
29+
# require 'v8/object'
30+
# require 'v8/array'
31+
# require 'v8/function'

lib/v8/context.rb

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ module V8
2626
# cxt.eval('num') # => 5
2727
# end
2828
class Context
29-
include V8::Error::Try
29+
# include V8::Error::Try
3030

3131
# @!attribute [r] conversion
3232
# @return [V8::Conversion] conversion behavior for this context
@@ -44,6 +44,10 @@ class Context
4444
# @return [Number] maximum execution time in milliseconds for scripts executed in this context
4545
attr_reader :timeout
4646

47+
# @!attribute [r] isolate
48+
# @return [V8::Isolate]
49+
attr_reader :isolate
50+
4751
# Creates a new context.
4852
#
4953
# If passed the `:with` option, that object will be used as
@@ -62,20 +66,24 @@ class Context
6266
# * :with scope serves as the global scope of the new context
6367
# @yield [V8::Context] the newly created context
6468
def initialize(options = {})
65-
@conversion = Conversion.new
66-
@access = Access.new
67-
@timeout = options[:timeout]
68-
if global = options[:with]
69-
Context.new.enter do
70-
global_template = global.class.to_template.InstanceTemplate()
71-
@native = V8::C::Context::New(nil, global_template)
72-
end
73-
enter {link global, @native.Global()}
74-
else
75-
V8::C::Locker() do
76-
@native = V8::C::Context::New()
77-
end
69+
@isolate = options[:isolate] || V8::Isolate.new
70+
V8::C::HandleScope(@isolate.native) do
71+
@native = V8::C::Context::New(@isolate.native)
7872
end
73+
@conversion = Conversion.new
74+
# @access = Access.new
75+
# @timeout = options[:timeout]
76+
# if global = options[:with]
77+
# Context.new.enter do
78+
# global_template = global.class.to_template.InstanceTemplate()
79+
# @native = V8::C::Context::New(nil, global_template)
80+
# end
81+
# enter {link global, @native.Global()}
82+
# else
83+
# V8::C::Locker() do
84+
# @native = V8::C::Context::New()
85+
# end
86+
# end
7987
yield self if block_given?
8088
end
8189

@@ -92,12 +100,11 @@ def eval(source, filename = '<eval>', line = 1)
92100
source = source.read
93101
end
94102
enter do
95-
script = try { V8::C::Script::New(source.to_s, filename.to_s) }
96-
if @timeout
97-
to_ruby try {script.RunWithTimeout(@timeout)}
98-
else
99-
to_ruby try {script.Run()}
100-
end
103+
src = V8::C::String::NewFromUtf8(@isolate.native, source.to_s)
104+
filename = V8::C::String::NewFromUtf8(@isolate.native, filename.to_s)
105+
origin = V8::C::ScriptOrigin.new(filename);
106+
script = V8::C::Script::Compile(@native, src, origin).FromJust()
107+
to_ruby script.Run(@native).FromJust()
101108
end
102109
end
103110

@@ -107,7 +114,7 @@ def eval(source, filename = '<eval>', line = 1)
107114
# @return [Object] value the value at `key`
108115
def [](key)
109116
enter do
110-
to_ruby(@native.Global().Get(to_v8(key)))
117+
to_ruby(@native.Global().Get(@cnative, to_v8(key)).FromJust())
111118
end
112119
end
113120

@@ -117,26 +124,11 @@ def [](key)
117124
# @param [Object] value the value to bind
118125
def []=(key, value)
119126
enter do
120-
@native.Global().Set(to_v8(key), to_v8(value))
127+
@native.Global().Set(@native, to_v8(key), to_v8(value))
121128
end
122129
return value
123130
end
124131

125-
# Destroy this context and release any internal references it may
126-
# contain to embedded Ruby objects.
127-
#
128-
# A disposed context may never again be used for anything, and all
129-
# objects created with it will become unusable.
130-
def dispose
131-
return unless @native
132-
@native.Dispose()
133-
@native = nil
134-
V8::C::V8::ContextDisposedNotification()
135-
def self.enter
136-
fail "cannot enter a context which has already been disposed"
137-
end
138-
end
139-
140132
# Returns this context's global object. This will be a `V8::Object`
141133
# if no scope was provided or just an `Object` if a Ruby object
142134
# is serving as the global scope.
@@ -165,7 +157,7 @@ def to_ruby(v8_object)
165157
# @return [V8::C::Object] to pass to V8
166158
# @see V8::Conversion for customizing and extending this mechanism
167159
def to_v8(ruby_object)
168-
@conversion.to_v8(ruby_object)
160+
@conversion.to_v8(self, ruby_object)
169161
end
170162

171163
# Marks a Ruby object and a v8 C++ Object as being the same. In other
@@ -241,14 +233,12 @@ def self.current=(context)
241233
def lock_scope_and_enter
242234
current = Context.current
243235
Context.current = self
244-
V8::C::Locker() do
245-
V8::C::HandleScope() do
246-
begin
247-
@native.Enter()
248-
yield if block_given?
249-
ensure
250-
@native.Exit()
251-
end
236+
V8::C::HandleScope(@isolate.native) do
237+
begin
238+
@native.Enter()
239+
yield if block_given?
240+
ensure
241+
@native.Exit()
252242
end
253243
end
254244
ensure

lib/v8/conversion.rb

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,62 @@
1-
21
class V8::Conversion
32
include Fundamental
4-
include Identity
3+
# include Identity
54

65
def to_ruby(v8_object)
76
super v8_object
87
end
98

10-
def to_v8(ruby_object)
11-
super ruby_object
9+
def to_v8(context, ruby_object)
10+
super context, ruby_object
1211
end
1312
end
1413

15-
for type in [TrueClass, FalseClass, NilClass, Float] do
16-
type.class_eval do
17-
include V8::Conversion::Primitive
14+
module V8::C
15+
class String
16+
alias_method :to_ruby, :Utf8Value
1817
end
19-
end
2018

21-
for type in [Class, Object, Array, Hash, String, Symbol, Time, Proc, Method, Fixnum] do
22-
type.class_eval do
23-
include V8::Conversion.const_get(type.name)
19+
class Number
20+
alias_method :to_ruby, :Value
2421
end
25-
end
2622

27-
class UnboundMethod
28-
include V8::Conversion::Method
23+
class Undefined
24+
def to_ruby
25+
nil
26+
end
27+
end
28+
29+
class Boolean
30+
def to_ruby
31+
IsTrue()
32+
end
33+
end
2934
end
3035

31-
for type in [:Object, :String, :Date] do
32-
V8::C::const_get(type).class_eval do
33-
include V8::Conversion::const_get("Native#{type}")
36+
class String
37+
def to_v8(context)
38+
V8::C::String::NewFromUtf8(context.isolate.native, self)
3439
end
3540
end
3641

42+
# for type in [TrueClass, FalseClass, NilClass, Float] do
43+
# type.class_eval do
44+
# include V8::Conversion::Primitive
45+
# end
46+
# end
47+
48+
# for type in [Class, Object, Array, Hash, String, Symbol, Time, Proc, Method, Fixnum] do
49+
# type.class_eval do
50+
# include V8::Conversion.const_get(type.name)
51+
# end
52+
# end
53+
54+
# class UnboundMethod
55+
# include V8::Conversion::Method
56+
# end
57+
58+
# for type in [:Object, :String, :Date] do
59+
# V8::C::const_get(type).class_eval do
60+
# include V8::Conversion::const_get("Native#{type}")
61+
# end
62+
# end

lib/v8/conversion/fundamental.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ def to_ruby(v8_object)
44
v8_object.to_ruby
55
end
66

7-
def to_v8(ruby_object)
8-
ruby_object.to_v8
7+
def to_v8(context, ruby_object)
8+
ruby_object.to_v8 context
99
end
1010
end
11-
end
11+
end

lib/v8/conversion/primitive.rb

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/v8/isolate.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module V8
2+
class Isolate
3+
attr_reader :native
4+
5+
def initialize()
6+
@native = V8::C::Isolate::New()
7+
end
8+
end
9+
end

0 commit comments

Comments
 (0)