mini_racer 0.1.14 → 0.1.15
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 +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
|