h8 0.1.1 → 0.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d6df45a0dbe1bfe8a588edcdc1e89a1fe46d1f2
4
- data.tar.gz: 5462860d000512adda74a47ae151765f3ac67fe5
3
+ metadata.gz: 3f57dd0c74b95006a890c9cf0369c125cef269f5
4
+ data.tar.gz: f3d4718d58ff97858d8b6eba3d24153b1cda7c92
5
5
  SHA512:
6
- metadata.gz: ba6bf36d6e8c17edc4ab93c38f773afdad6ce33f4210ef81aa7e60a9644f46e6ec2c981867d78e31bce7a0e8d2472ef14b048220d5ef61e1544482cc540bc1c5
7
- data.tar.gz: 90ca1c17c7d87fca3ccd06255cc71f175f68864067bfbd8a078bac375ac376bead0190343be66703f6f3463994106ec9dfceceb92a156f06bc411eb900364acb
6
+ metadata.gz: c27679efadcb3972abbfee520b177455387b21263e7541e32d6e16ecf98bff1d701c2670f5590843936a1afed0f131bc4d8210ed9eb7bf65321a0d941726df7a
7
+ data.tar.gz: 0a4f4b5733f65efd133b7e5323c4c172685879cd44b84690c1ec80ff1978bd4d86d66c91df59a76ecbe4b16248f385472fde76adb5655beb128c605c11411edc
data/ext/h8/extconf.rb CHANGED
@@ -37,7 +37,7 @@ begin
37
37
  v8_path = ENV['V8_3_31_ROOT'] or raise "Please give me export V8_3_31_ROOT=..."
38
38
  # dir_config('v8', '/Users/sergeych/dev/v8', '/Users/sergeych/dev/v8/out/native')
39
39
  dir_config('v8', v8_path, v8_path+'/out/native')
40
- CONFIG['CXXFLAGS'] += ' --std=c++11'
40
+ CONFIG['CXXFLAGS'] += ' --std=c++11 -O6'
41
41
  else
42
42
  # example linux package https://github.com/porzione/v8-git-debian
43
43
  dir_config('v8', '/usr/include/libv8-3.31', '/usr/lib/libv8-3.31')
data/ext/h8/h8.cpp CHANGED
@@ -27,7 +27,8 @@ void h8::JsError::raise() {
27
27
  ruby_exception = ruby_exception = rb_exc_new2(js_exception,
28
28
  *res ? *res : "unknown javascript exception");
29
29
  rb_iv_set(ruby_exception, "@message", h8->to_ruby(s));
30
- rb_iv_set(ruby_exception, "@javascript_error", h8->to_ruby(jsx));
30
+ rb_iv_set(ruby_exception, "@javascript_error",
31
+ h8->to_ruby(jsx));
31
32
  }
32
33
  }
33
34
  rb_exc_raise(ruby_exception);
@@ -60,7 +61,7 @@ void h8::H8::ruby_mark_gc() const {
60
61
  ((AllocatedResource*) x)->rb_mark_gc();
61
62
  }
62
63
 
63
- v8::Handle<v8::Value> h8::H8::eval(const char* script_utf,unsigned max_ms) {
64
+ v8::Handle<v8::Value> h8::H8::eval(const char* script_utf, unsigned max_ms) {
64
65
  v8::EscapableHandleScope escape(isolate);
65
66
  Local<Value> result;
66
67
 
@@ -76,20 +77,20 @@ v8::Handle<v8::Value> h8::H8::eval(const char* script_utf,unsigned max_ms) {
76
77
  result = Undefined(isolate);
77
78
  } else {
78
79
  result = Undefined(isolate);
79
- if( max_ms > 0 ) {
80
+ if (max_ms > 0) {
80
81
  std::mutex m;
81
82
  std::condition_variable cv;
82
- std::thread thr( [&] {
83
- std::unique_lock<std::mutex> lock(m);
84
- if( std::cv_status::timeout == cv.wait_for(lock, std::chrono::milliseconds(max_ms) ) ) {
85
- isolate->TerminateExecution();
86
- }
87
- });
83
+ std::thread thr(
84
+ [&] {
85
+ std::unique_lock<std::mutex> lock(m);
86
+ if( std::cv_status::timeout == cv.wait_for(lock, std::chrono::milliseconds(max_ms) ) ) {
87
+ isolate->TerminateExecution();
88
+ }
89
+ });
88
90
  script->Run();
89
91
  cv.notify_all();
90
92
  thr.join();
91
- }
92
- else {
93
+ } else {
93
94
  result = script->Run();
94
95
  }
95
96
  try_catch.throwIfCaught();
@@ -98,9 +99,12 @@ v8::Handle<v8::Value> h8::H8::eval(const char* script_utf,unsigned max_ms) {
98
99
  }
99
100
 
100
101
  h8::H8::~H8() {
101
- while (!resources.is_empty()) {
102
- // this should also remove it from the list:
103
- resources.peek_first<AllocatedResource>()->free();
102
+ {
103
+ Scope s(this);
104
+ while (!resources.is_empty()) {
105
+ // this should also remove it from the list:
106
+ resources.peek_first<AllocatedResource>()->free();
107
+ }
104
108
  }
105
109
 
106
110
  persistent_context.Reset();
data/ext/h8/h8.h CHANGED
@@ -81,16 +81,22 @@ public:
81
81
  class H8 {
82
82
  public:
83
83
 
84
- class Scope: public HandleScope {
85
- v8::Isolate::Scope isolate_scope;
86
- v8::Context::Scope context_scope;
84
+ class Scope {
85
+ Locker locker;
86
+ Isolate::Scope isolate_scope;
87
+ HandleScope handle_scope;
88
+ Context::Scope context_scope;
89
+
87
90
  H8* rcontext;
88
91
 
89
92
  public:
90
93
  Scope(H8* cxt) :
91
- HandleScope(cxt->getIsolate()), isolate_scope(
92
- cxt->getIsolate()), context_scope(cxt->getContext()), rcontext(
93
- cxt) {
94
+ locker(cxt->getIsolate()),
95
+ handle_scope(cxt->getIsolate()),
96
+ isolate_scope(cxt->getIsolate()),
97
+ context_scope(cxt->getContext()),
98
+ rcontext(cxt)
99
+ {
94
100
  }
95
101
  };
96
102
 
@@ -99,6 +105,7 @@ public:
99
105
  H8() :
100
106
  self(Qnil) {
101
107
  isolate = Isolate::New();
108
+ Locker l(isolate);
102
109
  Isolate::Scope isolate_scope(isolate);
103
110
  HandleScope handle_scope(isolate);
104
111
  isolate->SetCaptureStackTraceForUncaughtExceptions(true);
@@ -217,11 +224,9 @@ inline VALUE h8::H8::to_ruby(Handle<Value> value) {
217
224
 
218
225
  inline h8::JsError::JsError(H8* h8, Local<Message> message,
219
226
  Local<Value> exception) :
220
- h8(h8),
221
- _message(h8->getIsolate(), message),
222
- _exception(h8->getIsolate(), exception),
223
- has_js_exception(true),
224
- reason(NULL) {
227
+ h8(h8), _message(h8->getIsolate(), message), _exception(
228
+ h8->getIsolate(), exception), has_js_exception(true), reason(
229
+ NULL) {
225
230
  }
226
231
 
227
232
  inline Local<Message> h8::JsError::message() const {
data/ext/h8/js_gate.h CHANGED
@@ -162,12 +162,12 @@ public:
162
162
  * Call this as function over global context
163
163
  */
164
164
  VALUE call(VALUE args) const {
165
- v8::HandleScope scope(h8->getIsolate());
165
+ H8::Scope scope(h8);
166
166
  return apply(h8->getContext()->Global(), args);
167
167
  }
168
168
 
169
169
  VALUE apply(VALUE self, VALUE args) const {
170
- v8::HandleScope scope(h8->getIsolate());
170
+ H8::Scope scope(h8);
171
171
  return apply(h8->gateObject(self), args);
172
172
  }
173
173
 
data/lib/h8/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module H8
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/spec/context_spec.rb CHANGED
@@ -74,4 +74,30 @@ describe 'context' do
74
74
  cxt.eval('(last-start)/1000').should < 250
75
75
  end
76
76
 
77
+ it 'should work in many threads' do
78
+ sum = 0
79
+ valid = 0
80
+ n = 10
81
+ contexts = []
82
+ tt = n.times.map { |n|
83
+ valid += (n+1)*100 + 10
84
+ Thread.start {
85
+ cxt = H8::Context.new
86
+ contexts << cxt
87
+ cxt[:array] = 100024.times.map { |x| x*(n+1) }
88
+ cxt[:n] = n+1
89
+ sum += cxt.eval('result = array[100] + 10')
90
+ }
91
+ }
92
+ tt.each &:join
93
+ sum.should == valid
94
+ GC.start
95
+ # Cross-thread access
96
+ contexts.each { |cxt|
97
+ s, n = cxt.eval('data = [result,n]')
98
+ s.should == 100*n + 10
99
+ }
100
+ end
101
+
102
+
77
103
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: h8
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - sergeych
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-28 00:00:00.000000000 Z
11
+ date: 2014-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -134,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  version: '0'
135
135
  requirements: []
136
136
  rubyforge_project:
137
- rubygems_version: 2.2.2
137
+ rubygems_version: 2.4.5
138
138
  signing_key:
139
139
  specification_version: 4
140
140
  summary: Minimalistic and fast Ruby <--> V8 integration