mini_racer 0.2.10 → 0.2.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 +33 -0
- data/README.md +15 -0
- data/ext/mini_racer_extension/mini_racer_extension.cc +72 -13
- data/lib/mini_racer.rb +71 -14
- data/lib/mini_racer/version.rb +3 -1
- data/mini_racer.gemspec +2 -1
- metadata +26 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 359264fa5fcef999d505e7a76075d98d08310e88c4bdc983c9e3ce87122a990c
|
4
|
+
data.tar.gz: 46444c7126d86d41a78a8c44c97f31433eff7e4c7551ba46a7b19e7f2b64100c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c682ae187454565667c71132a39eed4b179b642d34cf9e48d9a9333973394dbf368000758b89dc721ee3e264708e44cc6812f5530afc3c0aad976697a7fe9a7
|
7
|
+
data.tar.gz: cc032e45e917c57ac329813344dd241dc12ba95b02b5088d0d945a0bf15ea0db8feb9bb147caf1efc8795d1abfec6e321cc16798ea1c554789d26ee9d44cd389
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,36 @@
|
|
1
|
+
- 29-06-2020
|
2
|
+
|
3
|
+
- 0.2.15
|
4
|
+
|
5
|
+
- FEATURE: basic wasm support via pump_message_loop
|
6
|
+
|
7
|
+
- 15-05-2020
|
8
|
+
|
9
|
+
- 0.2.14
|
10
|
+
|
11
|
+
- FIX: ensure_gc_after_idle should take in milliseconds like the rest of the APIs not seconds
|
12
|
+
- FEATURE: strict params on MiniRacer::Context.new
|
13
|
+
|
14
|
+
- 15-05-2020
|
15
|
+
|
16
|
+
- 0.2.13
|
17
|
+
|
18
|
+
- FIX: edge case around ensure_gc_after_idle possibly firing when context is not idle
|
19
|
+
|
20
|
+
- 15-05-2020
|
21
|
+
|
22
|
+
- 0.2.12
|
23
|
+
|
24
|
+
- FEATURE: isolate.low_memory_notification which can force a full GC
|
25
|
+
- FEATURE: MiniRacer::Context.new(ensure_gc_after_idle: 2) - to force full GC 2 seconds after context is idle, this allows you to conserve memory on isolates
|
26
|
+
|
27
|
+
- 14-05-2020
|
28
|
+
|
29
|
+
- 0.2.11
|
30
|
+
|
31
|
+
- FIX: dumping heap snapshots was not flushing the file leading to corrupt snapshots
|
32
|
+
- FIX: a use-after-free shutdown crash
|
33
|
+
|
1
34
|
- 0.2.10
|
2
35
|
|
3
36
|
- 22-04-2020
|
data/README.md
CHANGED
@@ -230,12 +230,17 @@ context = MiniRacer::Context.new(isolate: isolate)
|
|
230
230
|
# give up to 100ms for V8 garbage collection
|
231
231
|
isolate.idle_notification(100)
|
232
232
|
|
233
|
+
# force V8 to perform a full GC
|
234
|
+
isolate.low_memory_notification
|
235
|
+
|
233
236
|
```
|
234
237
|
|
235
238
|
This can come in handy to force V8 GC runs for example in between requests if you use MiniRacer on a web application.
|
236
239
|
|
237
240
|
Note that this method maps directly to [`v8::Isolate::IdleNotification`](http://bespin.cz/~ondras/html/classv8_1_1Isolate.html#aea16cbb2e351de9a3ae7be2b7cb48297), and that in particular its return value is the same (true if there is no further garbage to collect, false otherwise) and the same caveats apply, in particular that `there is no guarantee that the [call will return] within the time limit.`
|
238
241
|
|
242
|
+
Additionally you may automate this process on a context by defining it with `MiniRacer::Content.new(ensure_gc_after_idle: 1000)`. Using this will ensure V8 will run a full GC using `context.isolate.low_memory_notification` 1 second after the last eval on the context. Low memory notification is both slower and more aggressive than an idle_notification and will ensure long living isolates use minimal amounts of memory.
|
243
|
+
|
239
244
|
### V8 Runtime flags
|
240
245
|
|
241
246
|
It is possible to set V8 Runtime flags:
|
@@ -310,6 +315,16 @@ context.eval("a = 2")
|
|
310
315
|
# nothing works on the context from now on, its a shell waiting to be disposed
|
311
316
|
```
|
312
317
|
|
318
|
+
A MiniRacer context can also be dumped in a heapsnapshot file using `#write_heap_snapshot(file_or_io)`
|
319
|
+
|
320
|
+
```ruby
|
321
|
+
context = MiniRacer::Context.new(timeout: 5)
|
322
|
+
context.eval("let a='testing';")
|
323
|
+
context.write_heap_snapshot("test.heapsnapshot")
|
324
|
+
```
|
325
|
+
|
326
|
+
This file can then be loaded in the memory tab of the chrome dev console.
|
327
|
+
|
313
328
|
### Function call
|
314
329
|
|
315
330
|
This calls the function passed as first argument:
|
@@ -156,6 +156,10 @@ static VALUE rb_cDateTime = Qnil;
|
|
156
156
|
static std::unique_ptr<Platform> current_platform = NULL;
|
157
157
|
static std::mutex platform_lock;
|
158
158
|
|
159
|
+
static pthread_attr_t *thread_attr_p;
|
160
|
+
static pthread_rwlock_t exit_lock = PTHREAD_RWLOCK_INITIALIZER;
|
161
|
+
static bool ruby_exiting; // guarded by exit_lock
|
162
|
+
|
159
163
|
static VALUE rb_platform_set_flag_as_str(VALUE _klass, VALUE flag_as_str) {
|
160
164
|
bool platform_already_initialized = false;
|
161
165
|
|
@@ -765,6 +769,29 @@ static VALUE rb_isolate_idle_notification(VALUE self, VALUE idle_time_in_ms) {
|
|
765
769
|
return isolate_info->isolate->IdleNotificationDeadline(now + duration) ? Qtrue : Qfalse;
|
766
770
|
}
|
767
771
|
|
772
|
+
static VALUE rb_isolate_low_memory_notification(VALUE self) {
|
773
|
+
IsolateInfo* isolate_info;
|
774
|
+
Data_Get_Struct(self, IsolateInfo, isolate_info);
|
775
|
+
|
776
|
+
if (current_platform == NULL) return Qfalse;
|
777
|
+
|
778
|
+
isolate_info->isolate->LowMemoryNotification();
|
779
|
+
return Qnil;
|
780
|
+
}
|
781
|
+
|
782
|
+
static VALUE rb_isolate_pump_message_loop(VALUE self) {
|
783
|
+
IsolateInfo* isolate_info;
|
784
|
+
Data_Get_Struct(self, IsolateInfo, isolate_info);
|
785
|
+
|
786
|
+
if (current_platform == NULL) return Qfalse;
|
787
|
+
|
788
|
+
if (platform::PumpMessageLoop(current_platform.get(), isolate_info->isolate)){
|
789
|
+
return Qtrue;
|
790
|
+
} else {
|
791
|
+
return Qfalse;
|
792
|
+
}
|
793
|
+
}
|
794
|
+
|
768
795
|
static VALUE rb_context_init_unsafe(VALUE self, VALUE isolate, VALUE snap) {
|
769
796
|
ContextInfo* context_info;
|
770
797
|
Data_Get_Struct(self, ContextInfo, context_info);
|
@@ -1205,7 +1232,7 @@ void free_isolate(IsolateInfo* isolate_info) {
|
|
1205
1232
|
delete isolate_info->allocator;
|
1206
1233
|
}
|
1207
1234
|
|
1208
|
-
static void
|
1235
|
+
static void free_context_raw(void *arg) {
|
1209
1236
|
ContextInfo* context_info = (ContextInfo*)arg;
|
1210
1237
|
IsolateInfo* isolate_info = context_info->isolate_info;
|
1211
1238
|
Persistent<Context>* context = context_info->context;
|
@@ -1222,6 +1249,20 @@ static void *free_context_raw(void* arg) {
|
|
1222
1249
|
}
|
1223
1250
|
|
1224
1251
|
xfree(context_info);
|
1252
|
+
}
|
1253
|
+
|
1254
|
+
static void *free_context_thr(void* arg) {
|
1255
|
+
if (pthread_rwlock_tryrdlock(&exit_lock) != 0) {
|
1256
|
+
return NULL;
|
1257
|
+
}
|
1258
|
+
if (ruby_exiting) {
|
1259
|
+
return NULL;
|
1260
|
+
}
|
1261
|
+
|
1262
|
+
free_context_raw(arg);
|
1263
|
+
|
1264
|
+
pthread_rwlock_unlock(&exit_lock);
|
1265
|
+
|
1225
1266
|
return NULL;
|
1226
1267
|
}
|
1227
1268
|
|
@@ -1235,22 +1276,17 @@ static void free_context(ContextInfo* context_info) {
|
|
1235
1276
|
context_info_copy->context = context_info->context;
|
1236
1277
|
|
1237
1278
|
if (isolate_info && isolate_info->refs() > 1) {
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1279
|
+
pthread_t free_context_thread;
|
1280
|
+
if (pthread_create(&free_context_thread, thread_attr_p,
|
1281
|
+
free_context_thr, (void*)context_info_copy)) {
|
1282
|
+
fprintf(stderr, "WARNING failed to release memory in MiniRacer, thread to release could not be created, process will leak memory\n");
|
1283
|
+
}
|
1243
1284
|
} else {
|
1244
1285
|
free_context_raw(context_info_copy);
|
1245
1286
|
}
|
1246
1287
|
|
1247
|
-
|
1248
|
-
|
1249
|
-
}
|
1250
|
-
|
1251
|
-
if (isolate_info) {
|
1252
|
-
context_info->isolate_info = NULL;
|
1253
|
-
}
|
1288
|
+
context_info->context = NULL;
|
1289
|
+
context_info->isolate_info = NULL;
|
1254
1290
|
}
|
1255
1291
|
|
1256
1292
|
static void deallocate_isolate(void* data) {
|
@@ -1408,6 +1444,8 @@ rb_heap_snapshot(VALUE self, VALUE file) {
|
|
1408
1444
|
FileOutputStream stream(fp);
|
1409
1445
|
snap->Serialize(&stream, HeapSnapshot::kJSON);
|
1410
1446
|
|
1447
|
+
fflush(fp);
|
1448
|
+
|
1411
1449
|
const_cast<HeapSnapshot*>(snap)->Delete();
|
1412
1450
|
|
1413
1451
|
return Qtrue;
|
@@ -1582,6 +1620,16 @@ static VALUE rb_context_create_isolate_value(VALUE self) {
|
|
1582
1620
|
return Data_Wrap_Struct(rb_cIsolate, NULL, &deallocate_isolate, isolate_info);
|
1583
1621
|
}
|
1584
1622
|
|
1623
|
+
static void set_ruby_exiting(VALUE value) {
|
1624
|
+
(void)value;
|
1625
|
+
|
1626
|
+
int res = pthread_rwlock_wrlock(&exit_lock);
|
1627
|
+
ruby_exiting = true;
|
1628
|
+
if (res == 0) {
|
1629
|
+
pthread_rwlock_unlock(&exit_lock);
|
1630
|
+
}
|
1631
|
+
}
|
1632
|
+
|
1585
1633
|
extern "C" {
|
1586
1634
|
|
1587
1635
|
void Init_mini_racer_extension ( void )
|
@@ -1632,8 +1680,19 @@ extern "C" {
|
|
1632
1680
|
rb_define_private_method(rb_cSnapshot, "load", (VALUE(*)(...))&rb_snapshot_load, 1);
|
1633
1681
|
|
1634
1682
|
rb_define_method(rb_cIsolate, "idle_notification", (VALUE(*)(...))&rb_isolate_idle_notification, 1);
|
1683
|
+
rb_define_method(rb_cIsolate, "low_memory_notification", (VALUE(*)(...))&rb_isolate_low_memory_notification, 0);
|
1684
|
+
rb_define_method(rb_cIsolate, "pump_message_loop", (VALUE(*)(...))&rb_isolate_pump_message_loop, 0);
|
1635
1685
|
rb_define_private_method(rb_cIsolate, "init_with_snapshot",(VALUE(*)(...))&rb_isolate_init_with_snapshot, 1);
|
1636
1686
|
|
1637
1687
|
rb_define_singleton_method(rb_cPlatform, "set_flag_as_str!", (VALUE(*)(...))&rb_platform_set_flag_as_str, 1);
|
1688
|
+
|
1689
|
+
rb_set_end_proc(set_ruby_exiting, Qnil);
|
1690
|
+
|
1691
|
+
static pthread_attr_t attr;
|
1692
|
+
if (pthread_attr_init(&attr) == 0) {
|
1693
|
+
if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0) {
|
1694
|
+
thread_attr_p = &attr;
|
1695
|
+
}
|
1696
|
+
}
|
1638
1697
|
}
|
1639
1698
|
}
|
data/lib/mini_racer.rb
CHANGED
@@ -130,21 +130,29 @@ module MiniRacer
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
|
-
def initialize(
|
133
|
+
def initialize(max_memory: nil, timeout: nil, isolate: nil, ensure_gc_after_idle: nil, snapshot: nil)
|
134
134
|
options ||= {}
|
135
135
|
|
136
|
-
check_init_options!(
|
136
|
+
check_init_options!(isolate: isolate, snapshot: snapshot, max_memory: max_memory, ensure_gc_after_idle: ensure_gc_after_idle, timeout: timeout)
|
137
137
|
|
138
138
|
@functions = {}
|
139
139
|
@timeout = nil
|
140
140
|
@max_memory = nil
|
141
141
|
@current_exception = nil
|
142
|
-
@timeout =
|
143
|
-
|
144
|
-
|
145
|
-
end
|
142
|
+
@timeout = timeout
|
143
|
+
@max_memory = max_memory
|
144
|
+
|
146
145
|
# false signals it should be fetched if requested
|
147
|
-
@isolate =
|
146
|
+
@isolate = isolate || false
|
147
|
+
|
148
|
+
@ensure_gc_after_idle = ensure_gc_after_idle
|
149
|
+
|
150
|
+
if @ensure_gc_after_idle
|
151
|
+
@last_eval = nil
|
152
|
+
@ensure_gc_thread = nil
|
153
|
+
@ensure_gc_mutex = Mutex.new
|
154
|
+
end
|
155
|
+
|
148
156
|
@disposed = false
|
149
157
|
|
150
158
|
@callback_mutex = Mutex.new
|
@@ -153,7 +161,7 @@ module MiniRacer
|
|
153
161
|
@eval_thread = nil
|
154
162
|
|
155
163
|
# defined in the C class
|
156
|
-
init_unsafe(
|
164
|
+
init_unsafe(isolate, snapshot)
|
157
165
|
end
|
158
166
|
|
159
167
|
def isolate
|
@@ -203,6 +211,7 @@ module MiniRacer
|
|
203
211
|
end
|
204
212
|
ensure
|
205
213
|
@eval_thread = nil
|
214
|
+
ensure_gc_thread if @ensure_gc_after_idle
|
206
215
|
end
|
207
216
|
|
208
217
|
def call(function_name, *arguments)
|
@@ -216,15 +225,17 @@ module MiniRacer
|
|
216
225
|
end
|
217
226
|
ensure
|
218
227
|
@eval_thread = nil
|
228
|
+
ensure_gc_thread if @ensure_gc_after_idle
|
219
229
|
end
|
220
230
|
|
221
231
|
def dispose
|
222
232
|
return if @disposed
|
223
233
|
isolate_mutex.synchronize do
|
234
|
+
return if @disposed
|
224
235
|
dispose_unsafe
|
236
|
+
@disposed = true
|
237
|
+
@isolate = nil # allow it to be garbage collected, if set
|
225
238
|
end
|
226
|
-
@disposed = true
|
227
|
-
@isolate = nil # allow it to be garbage collected, if set
|
228
239
|
end
|
229
240
|
|
230
241
|
|
@@ -273,6 +284,38 @@ module MiniRacer
|
|
273
284
|
|
274
285
|
private
|
275
286
|
|
287
|
+
def ensure_gc_thread
|
288
|
+
@last_eval = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
289
|
+
@ensure_gc_mutex.synchronize do
|
290
|
+
@ensure_gc_thread = nil if !@ensure_gc_thread&.alive?
|
291
|
+
@ensure_gc_thread ||= Thread.new do
|
292
|
+
ensure_gc_after_idle_seconds = @ensure_gc_after_idle / 1000.0
|
293
|
+
done = false
|
294
|
+
while !done
|
295
|
+
now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
296
|
+
|
297
|
+
if @disposed
|
298
|
+
@ensure_gc_thread = nil
|
299
|
+
break
|
300
|
+
end
|
301
|
+
|
302
|
+
if !@eval_thread && ensure_gc_after_idle_seconds < now - @last_eval
|
303
|
+
@ensure_gc_mutex.synchronize do
|
304
|
+
isolate_mutex.synchronize do
|
305
|
+
if !@eval_thread
|
306
|
+
isolate.low_memory_notification if !@disposed
|
307
|
+
@ensure_gc_thread = nil
|
308
|
+
done = true
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
sleep ensure_gc_after_idle_seconds if !done
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
276
319
|
def stop_attached
|
277
320
|
@callback_mutex.synchronize{
|
278
321
|
if @callback_running
|
@@ -326,15 +369,29 @@ module MiniRacer
|
|
326
369
|
rp.close if rp
|
327
370
|
end
|
328
371
|
|
329
|
-
def check_init_options!(
|
330
|
-
assert_option_is_nil_or_a('isolate',
|
331
|
-
assert_option_is_nil_or_a('snapshot',
|
372
|
+
def check_init_options!(isolate:, snapshot:, max_memory:, ensure_gc_after_idle:, timeout:)
|
373
|
+
assert_option_is_nil_or_a('isolate', isolate, Isolate)
|
374
|
+
assert_option_is_nil_or_a('snapshot', snapshot, Snapshot)
|
375
|
+
|
376
|
+
assert_numeric_or_nil('max_memory', max_memory, min_value: 10_000)
|
377
|
+
assert_numeric_or_nil('ensure_gc_after_idle', ensure_gc_after_idle, min_value: 1)
|
378
|
+
assert_numeric_or_nil('timeout', timeout, min_value: 1)
|
332
379
|
|
333
|
-
if
|
380
|
+
if isolate && snapshot
|
334
381
|
raise ArgumentError, 'can only pass one of isolate and snapshot options'
|
335
382
|
end
|
336
383
|
end
|
337
384
|
|
385
|
+
def assert_numeric_or_nil(option_name, object, min_value:)
|
386
|
+
if object.is_a?(Numeric) && object < min_value
|
387
|
+
raise ArgumentError, "#{option_name} must be larger than #{min_value}"
|
388
|
+
end
|
389
|
+
|
390
|
+
if !object.nil? && !object.is_a?(Numeric)
|
391
|
+
raise ArgumentError, "#{option_name} must be a number, passed a #{object.inspect}"
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
338
395
|
def assert_option_is_nil_or_a(option_name, object, klass)
|
339
396
|
unless object.nil? || object.is_a?(klass)
|
340
397
|
raise ArgumentError, "#{option_name} must be a #{klass} object, passed a #{object.inspect}"
|
data/lib/mini_racer/version.rb
CHANGED
data/mini_racer.gemspec
CHANGED
@@ -27,9 +27,10 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
|
29
29
|
spec.add_development_dependency "bundler"
|
30
|
-
spec.add_development_dependency "rake", "
|
30
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
31
31
|
spec.add_development_dependency "minitest", "~> 5.0"
|
32
32
|
spec.add_development_dependency "rake-compiler"
|
33
|
+
spec.add_development_dependency "m"
|
33
34
|
|
34
35
|
spec.add_dependency 'libv8', '> 7.3'
|
35
36
|
spec.require_paths = ["lib", "ext"]
|
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.2.
|
4
|
+
version: 0.2.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 12.3.3
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 12.3.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: m
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: libv8
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,10 +122,10 @@ licenses:
|
|
108
122
|
- MIT
|
109
123
|
metadata:
|
110
124
|
bug_tracker_uri: https://github.com/discourse/mini_racer/issues
|
111
|
-
changelog_uri: https://github.com/discourse/mini_racer/blob/v0.2.
|
112
|
-
documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.2.
|
113
|
-
source_code_uri: https://github.com/discourse/mini_racer/tree/v0.2.
|
114
|
-
post_install_message:
|
125
|
+
changelog_uri: https://github.com/discourse/mini_racer/blob/v0.2.15/CHANGELOG
|
126
|
+
documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.2.15
|
127
|
+
source_code_uri: https://github.com/discourse/mini_racer/tree/v0.2.15
|
128
|
+
post_install_message:
|
115
129
|
rdoc_options: []
|
116
130
|
require_paths:
|
117
131
|
- lib
|
@@ -128,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
142
|
version: '0'
|
129
143
|
requirements: []
|
130
144
|
rubygems_version: 3.0.3
|
131
|
-
signing_key:
|
145
|
+
signing_key:
|
132
146
|
specification_version: 4
|
133
147
|
summary: Minimal embedded v8 for Ruby
|
134
148
|
test_files: []
|