mini_racer 0.1.14 → 0.1.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +7 -0
- data/ext/mini_racer_extension/mini_racer_extension.cc +26 -17
- data/lib/mini_racer.rb +3 -1
- data/lib/mini_racer/version.rb +1 -1
- data/mini_racer.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d6c94af48c76bdd1d4ce6744e81cf812192498d8
|
4
|
+
data.tar.gz: dd14708bbca74f0845ce37310fb4a7679326e7cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8982f3a4a7aa6c9f89a581099c48a2e694930f9e4f48beaf88cfaf38f9a21004b32fd5093937ffa0096ac4ebb725c7f99402928a0ab4b54153114fa81267d21b
|
7
|
+
data.tar.gz: f9219565baccdea2ce89be3e50012b204e4482296f83084517db0e996a4a6147050230f6afcebc4ba79e1b127aa3dcbe845962c3087c5dd3ec3b2e16970537f0
|
data/CHANGELOG
CHANGED
@@ -53,9 +53,16 @@ typedef struct {
|
|
53
53
|
Local<String>* filename;
|
54
54
|
useconds_t timeout;
|
55
55
|
EvalResult* result;
|
56
|
-
|
56
|
+
size_t max_memory;
|
57
57
|
} EvalParams;
|
58
58
|
|
59
|
+
enum IsolateFlags {
|
60
|
+
IN_GVL,
|
61
|
+
DO_TERMINATE,
|
62
|
+
MEM_SOFTLIMIT_VALUE,
|
63
|
+
MEM_SOFTLIMIT_REACHED,
|
64
|
+
};
|
65
|
+
|
59
66
|
static VALUE rb_eScriptTerminatedError;
|
60
67
|
static VALUE rb_eV8OutOfMemoryError;
|
61
68
|
static VALUE rb_eParseError;
|
@@ -109,16 +116,16 @@ static void init_v8() {
|
|
109
116
|
}
|
110
117
|
|
111
118
|
static void gc_callback(Isolate *isolate, GCType type, GCCallbackFlags flags) {
|
112
|
-
if((bool)isolate->GetData(
|
119
|
+
if((bool)isolate->GetData(MEM_SOFTLIMIT_REACHED)) return;
|
113
120
|
|
114
|
-
|
121
|
+
size_t softlimit = *(size_t*) isolate->GetData(MEM_SOFTLIMIT_VALUE);
|
115
122
|
|
116
123
|
HeapStatistics* stats = new HeapStatistics();
|
117
124
|
isolate->GetHeapStatistics(stats);
|
118
|
-
|
125
|
+
size_t used = stats->used_heap_size();
|
119
126
|
|
120
127
|
if(used > softlimit) {
|
121
|
-
isolate->SetData(
|
128
|
+
isolate->SetData(MEM_SOFTLIMIT_REACHED, (void*)true);
|
122
129
|
V8::TerminateExecution(isolate);
|
123
130
|
}
|
124
131
|
}
|
@@ -138,13 +145,13 @@ nogvl_context_eval(void* arg) {
|
|
138
145
|
v8::ScriptOrigin *origin = NULL;
|
139
146
|
|
140
147
|
// in gvl flag
|
141
|
-
isolate->SetData(
|
148
|
+
isolate->SetData(IN_GVL, (void*)false);
|
142
149
|
// terminate ASAP
|
143
|
-
isolate->SetData(
|
150
|
+
isolate->SetData(DO_TERMINATE, (void*)false);
|
144
151
|
// Memory softlimit
|
145
|
-
isolate->SetData(
|
152
|
+
isolate->SetData(MEM_SOFTLIMIT_VALUE, (void*)false);
|
146
153
|
// Memory softlimit hit flag
|
147
|
-
isolate->SetData(
|
154
|
+
isolate->SetData(MEM_SOFTLIMIT_REACHED, (void*)false);
|
148
155
|
|
149
156
|
MaybeLocal<Script> parsed_script;
|
150
157
|
|
@@ -170,7 +177,7 @@ nogvl_context_eval(void* arg) {
|
|
170
177
|
} else {
|
171
178
|
|
172
179
|
if(eval_params->max_memory > 0) {
|
173
|
-
isolate->SetData(
|
180
|
+
isolate->SetData(MEM_SOFTLIMIT_VALUE, &eval_params->max_memory);
|
174
181
|
isolate->AddGCEpilogueCallback(gc_callback);
|
175
182
|
}
|
176
183
|
|
@@ -241,7 +248,7 @@ nogvl_context_eval(void* arg) {
|
|
241
248
|
}
|
242
249
|
}
|
243
250
|
|
244
|
-
isolate->SetData(
|
251
|
+
isolate->SetData(IN_GVL, (void*)true);
|
245
252
|
|
246
253
|
|
247
254
|
return NULL;
|
@@ -575,7 +582,7 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) {
|
|
575
582
|
|
576
583
|
VALUE mem_softlimit = rb_iv_get(self, "@max_memory");
|
577
584
|
if (mem_softlimit != Qnil) {
|
578
|
-
|
585
|
+
eval_params.max_memory = (size_t)NUM2ULONG(mem_softlimit);
|
579
586
|
}
|
580
587
|
|
581
588
|
eval_result.message = NULL;
|
@@ -611,7 +618,7 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) {
|
|
611
618
|
if (!eval_result.executed) {
|
612
619
|
VALUE ruby_exception = rb_iv_get(self, "@current_exception");
|
613
620
|
if (ruby_exception == Qnil) {
|
614
|
-
bool mem_softlimit_reached = (bool)isolate->GetData(
|
621
|
+
bool mem_softlimit_reached = (bool)isolate->GetData(MEM_SOFTLIMIT_REACHED);
|
615
622
|
// If we were terminated or have the memory softlimit flag set
|
616
623
|
if(eval_result.terminated || mem_softlimit_reached) {
|
617
624
|
ruby_exception = mem_softlimit_reached ? rb_eV8OutOfMemoryError : rb_eScriptTerminatedError;
|
@@ -725,7 +732,7 @@ gvl_ruby_callback(void* data) {
|
|
725
732
|
callback_data.args = ruby_args;
|
726
733
|
callback_data.failed = false;
|
727
734
|
|
728
|
-
if ((bool)args->GetIsolate()->GetData(
|
735
|
+
if ((bool)args->GetIsolate()->GetData(DO_TERMINATE) == true) {
|
729
736
|
args->GetIsolate()->ThrowException(String::NewFromUtf8(args->GetIsolate(), "Terminated execution during transition from Ruby to JS"));
|
730
737
|
V8::TerminateExecution(args->GetIsolate());
|
731
738
|
return NULL;
|
@@ -749,7 +756,7 @@ gvl_ruby_callback(void* data) {
|
|
749
756
|
xfree(ruby_args);
|
750
757
|
}
|
751
758
|
|
752
|
-
if ((bool)args->GetIsolate()->GetData(
|
759
|
+
if ((bool)args->GetIsolate()->GetData(DO_TERMINATE) == true) {
|
753
760
|
Isolate* isolate = args->GetIsolate();
|
754
761
|
V8::TerminateExecution(isolate);
|
755
762
|
}
|
@@ -759,12 +766,14 @@ gvl_ruby_callback(void* data) {
|
|
759
766
|
|
760
767
|
static void ruby_callback(const FunctionCallbackInfo<Value>& args) {
|
761
768
|
|
762
|
-
bool has_gvl = (bool)args.GetIsolate()->GetData(
|
769
|
+
bool has_gvl = (bool)args.GetIsolate()->GetData(IN_GVL);
|
763
770
|
|
764
771
|
if(has_gvl) {
|
765
772
|
gvl_ruby_callback((void*)&args);
|
766
773
|
} else {
|
774
|
+
args.GetIsolate()->SetData(IN_GVL, (void*)true);
|
767
775
|
rb_thread_call_with_gvl(gvl_ruby_callback, (void*)(&args));
|
776
|
+
args.GetIsolate()->SetData(IN_GVL, (void*)false);
|
768
777
|
}
|
769
778
|
}
|
770
779
|
|
@@ -1022,7 +1031,7 @@ rb_context_stop(VALUE self) {
|
|
1022
1031
|
Isolate* isolate = context_info->isolate_info->isolate;
|
1023
1032
|
|
1024
1033
|
// flag for termination
|
1025
|
-
isolate->SetData(
|
1034
|
+
isolate->SetData(DO_TERMINATE, (void*)true);
|
1026
1035
|
|
1027
1036
|
V8::TerminateExecution(isolate);
|
1028
1037
|
rb_funcall(self, rb_intern("stop_attached"), 0);
|
data/lib/mini_racer.rb
CHANGED
@@ -148,7 +148,9 @@ module MiniRacer
|
|
148
148
|
@max_memory = nil
|
149
149
|
@current_exception = nil
|
150
150
|
@timeout = options[:timeout]
|
151
|
-
|
151
|
+
if options[:max_memory].is_a?(Numeric) && options[:max_memory] > 0
|
152
|
+
@max_memory = options[:max_memory]
|
153
|
+
end
|
152
154
|
@isolate = options[:isolate] || Isolate.new(options[:snapshot])
|
153
155
|
@disposed = false
|
154
156
|
|
data/lib/mini_racer/version.rb
CHANGED
data/mini_racer.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "minitest", "~> 5.0"
|
26
26
|
spec.add_development_dependency "rake-compiler"
|
27
27
|
|
28
|
-
spec.add_dependency 'libv8', '~>
|
28
|
+
spec.add_dependency 'libv8', '~> 6.3'
|
29
29
|
spec.require_paths = ["lib", "ext"]
|
30
30
|
|
31
31
|
spec.extensions = ["ext/mini_racer_extension/extconf.rb"]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_racer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '6.3'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '6.3'
|
83
83
|
description: Minimal embedded v8 engine for Ruby
|
84
84
|
email:
|
85
85
|
- sam.saffron@gmail.com
|
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
124
|
version: '0'
|
125
125
|
requirements: []
|
126
126
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
127
|
+
rubygems_version: 2.6.13
|
128
128
|
signing_key:
|
129
129
|
specification_version: 4
|
130
130
|
summary: Minimal embedded v8 for Ruby
|