mini_racer 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99d9eecfd656415e7b78e2dc350e74fa48efff6ba59c0753435acbcb354a6f1f
4
- data.tar.gz: 5569cf7c40958530af9326e0a73240bbe564eeca8242b4e254fbb72088134de1
3
+ metadata.gz: 33363eb77714da62e0920f19b096785488a5f425866918e1942a8062cb5fe233
4
+ data.tar.gz: 1aba90413863460047822b072d92c261f6bc5927918409cf19f8f36ecf97d5e6
5
5
  SHA512:
6
- metadata.gz: 2460052cf2bff6b6b6e7ad0971830d409daf71e7e2f6e7c6c15270378ac83758f38d31b24a48ff7eeb4108be6eff012bd8f762f85a2aa2b8f31e96e8f7207719
7
- data.tar.gz: e94abed7909184fa5c2d982cdffbc751731fe9f1618a543842631660380c8fcba77cc5fba3b6b6337d94531f1738f19c6b66c00753e62aa0314179317f8a798a
6
+ metadata.gz: 1d9acc921de43092d13c1edfc37a2fd753b0d572b2979d38185b0ea76b4527092d9569329479df8a21561589fe57acbcc6db8087948914bed2dde7178c9cfa2a
7
+ data.tar.gz: 537161ead4afdb14675b4593eea7f0e714d424c8a31bb2fc32960d3c8500a495b3d98f76280018df7a2d6072cdc8d038d791908b63ccd571e0c5757bb3ebc698
data/CHANGELOG CHANGED
@@ -1,3 +1,12 @@
1
+ - 25-04-2019
2
+
3
+ - 0.2.5
4
+
5
+ - FIX: Compatiblity fixes for V8 7 and above @ignisf
6
+ - FIX: Memory leak in gc_callback @messense
7
+ - IMPROVEMENT: Added example of sourcemap support @ianks
8
+ - URGENT: you will need this release for latest version of libv8 to work
9
+
1
10
  - 02-11-2018
2
11
 
3
12
  - 0.2.4
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016 TODO: Write your name
3
+ Copyright (c) 2016-2019, the mini_racer project authors.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -346,6 +346,10 @@ Note how the global interpreter lock release leads to 2 threads doing the same w
346
346
 
347
347
  As a rule MiniRacer strives to always support and depend on the latest stable version of libv8.
348
348
 
349
+ ## Source Maps
350
+
351
+ MiniRacer can fully support source maps but must be configured correctly to do so. [Check out this example](./examples/source-map-support/) for a working implementation.
352
+
349
353
  ## Installation
350
354
 
351
355
  Add this line to your application's Gemfile:
@@ -71,7 +71,7 @@ public:
71
71
  }
72
72
 
73
73
  int refs() {
74
- return refs_count;
74
+ return refs_count;
75
75
  }
76
76
 
77
77
  static void* operator new(size_t size) {
@@ -200,9 +200,9 @@ static void gc_callback(Isolate *isolate, GCType type, GCCallbackFlags flags) {
200
200
 
201
201
  size_t softlimit = *(size_t*) isolate->GetData(MEM_SOFTLIMIT_VALUE);
202
202
 
203
- HeapStatistics* stats = new HeapStatistics();
204
- isolate->GetHeapStatistics(stats);
205
- size_t used = stats->used_heap_size();
203
+ HeapStatistics stats;
204
+ isolate->GetHeapStatistics(&stats);
205
+ size_t used = stats.used_heap_size();
206
206
 
207
207
  if(used > softlimit) {
208
208
  isolate->SetData(MEM_SOFTLIMIT_REACHED, (void*)true);
@@ -230,13 +230,13 @@ static void prepare_result(MaybeLocal<Value> v8res,
230
230
  Local<Value> local_value = v8res.ToLocalChecked();
231
231
  if ((local_value->IsObject() || local_value->IsArray()) &&
232
232
  !local_value->IsDate() && !local_value->IsFunction()) {
233
- Local<Object> JSON = context->Global()->Get(
234
- String::NewFromUtf8(isolate, "JSON"))->ToObject();
233
+ Local<Object> JSON = context->Global()->Get(String::NewFromUtf8(isolate, "JSON"))
234
+ ->ToObject(context).ToLocalChecked();
235
235
 
236
236
  Local<Function> stringify = JSON->Get(v8::String::NewFromUtf8(isolate, "stringify"))
237
237
  .As<Function>();
238
238
 
239
- Local<Object> object = local_value->ToObject();
239
+ Local<Object> object = local_value->ToObject(context).ToLocalChecked();
240
240
  const unsigned argc = 1;
241
241
  Local<Value> argv[argc] = { object };
242
242
  MaybeLocal<Value> json = stringify->Call(JSON, argc, argv);
@@ -263,11 +263,21 @@ static void prepare_result(MaybeLocal<Value> v8res,
263
263
  evalRes.message = new Persistent<Value>();
264
264
  Local<Message> message = trycatch.Message();
265
265
  char buf[1000];
266
- int len;
267
- len = snprintf(buf, sizeof(buf), "%s at %s:%i:%i", *String::Utf8Value(message->Get()),
268
- *String::Utf8Value(message->GetScriptResourceName()->ToString()),
269
- message->GetLineNumber(),
270
- message->GetStartColumn());
266
+ int len, line, column;
267
+
268
+ if (!message->GetLineNumber(context).To(&line)) {
269
+ line = 0;
270
+ }
271
+
272
+ if (!message->GetStartColumn(context).To(&column)) {
273
+ column = 0;
274
+ }
275
+
276
+ len = snprintf(buf, sizeof(buf), "%s at %s:%i:%i", *String::Utf8Value(isolate, message->Get()),
277
+ *String::Utf8Value(isolate, message->GetScriptResourceName()->ToString(context).ToLocalChecked()),
278
+ line,
279
+ column);
280
+
271
281
  if ((size_t) len >= sizeof(buf)) {
272
282
  len = sizeof(buf) - 1;
273
283
  buf[len] = '\0';
@@ -281,9 +291,10 @@ static void prepare_result(MaybeLocal<Value> v8res,
281
291
  Local<String> tmp = String::NewFromUtf8(isolate, "JavaScript was terminated (either by timeout or explicitly)");
282
292
  evalRes.message->Reset(isolate, tmp);
283
293
  }
284
- if (!trycatch.StackTrace().IsEmpty()) {
294
+ if (!trycatch.StackTrace(context).IsEmpty()) {
285
295
  evalRes.backtrace = new Persistent<Value>();
286
- evalRes.backtrace->Reset(isolate, trycatch.StackTrace()->ToString());
296
+ evalRes.backtrace->Reset(isolate,
297
+ trycatch.StackTrace(context).ToLocalChecked()->ToString(context).ToLocalChecked());
287
298
  }
288
299
  }
289
300
  }
@@ -315,13 +326,13 @@ nogvl_context_eval(void* arg) {
315
326
  MaybeLocal<Script> parsed_script;
316
327
 
317
328
  if (eval_params->filename) {
318
- origin = new v8::ScriptOrigin(*eval_params->filename);
329
+ origin = new v8::ScriptOrigin(*eval_params->filename);
319
330
  }
320
331
 
321
332
  parsed_script = Script::Compile(context, *eval_params->eval, origin);
322
333
 
323
334
  if (origin) {
324
- delete origin;
335
+ delete origin;
325
336
  }
326
337
 
327
338
  result->parsed = !parsed_script.IsEmpty();
@@ -332,8 +343,8 @@ nogvl_context_eval(void* arg) {
332
343
 
333
344
  MaybeLocal<Value> maybe_value;
334
345
  if (!result->parsed) {
335
- result->message = new Persistent<Value>();
336
- result->message->Reset(isolate, trycatch.Exception());
346
+ result->message = new Persistent<Value>();
347
+ result->message->Reset(isolate, trycatch.Exception());
337
348
  } else {
338
349
  // parsing successful
339
350
  if (eval_params->max_memory > 0) {
@@ -359,41 +370,41 @@ static VALUE convert_v8_to_ruby(Isolate* isolate, Local<Context> context,
359
370
  HandleScope scope(isolate);
360
371
 
361
372
  if (value->IsNull() || value->IsUndefined()){
362
- return Qnil;
373
+ return Qnil;
363
374
  }
364
375
 
365
376
  if (value->IsInt32()) {
366
- return INT2FIX(value->Int32Value());
377
+ return INT2FIX(value->Int32Value(context).ToChecked());
367
378
  }
368
379
 
369
380
  if (value->IsNumber()) {
370
- return rb_float_new(value->NumberValue());
381
+ return rb_float_new(value->NumberValue(context).ToChecked());
371
382
  }
372
383
 
373
384
  if (value->IsTrue()) {
374
- return Qtrue;
385
+ return Qtrue;
375
386
  }
376
387
 
377
388
  if (value->IsFalse()) {
378
- return Qfalse;
389
+ return Qfalse;
379
390
  }
380
391
 
381
392
  if (value->IsArray()) {
382
393
  VALUE rb_array = rb_ary_new();
383
394
  Local<Array> arr = Local<Array>::Cast(value);
384
395
  for(uint32_t i=0; i < arr->Length(); i++) {
385
- Local<Value> element = arr->Get(i);
386
- VALUE rb_elem = convert_v8_to_ruby(isolate, context, element);
387
- if (rb_funcall(rb_elem, rb_intern("class"), 0) == rb_cFailedV8Conversion) {
388
- return rb_elem;
389
- }
396
+ Local<Value> element = arr->Get(i);
397
+ VALUE rb_elem = convert_v8_to_ruby(isolate, context, element);
398
+ if (rb_funcall(rb_elem, rb_intern("class"), 0) == rb_cFailedV8Conversion) {
399
+ return rb_elem;
400
+ }
390
401
  rb_ary_push(rb_array, rb_elem);
391
402
  }
392
403
  return rb_array;
393
404
  }
394
405
 
395
406
  if (value->IsFunction()){
396
- return rb_funcall(rb_cJavaScriptFunction, rb_intern("new"), 0);
407
+ return rb_funcall(rb_cJavaScriptFunction, rb_intern("new"), 0);
397
408
  }
398
409
 
399
410
  if (value->IsDate()){
@@ -405,34 +416,34 @@ static VALUE convert_v8_to_ruby(Isolate* isolate, Local<Context> context,
405
416
  }
406
417
 
407
418
  if (value->IsObject()) {
408
- VALUE rb_hash = rb_hash_new();
409
- TryCatch trycatch(isolate);
410
-
411
- Local<Object> object = value->ToObject();
412
- auto maybe_props = object->GetOwnPropertyNames(context);
413
- if (!maybe_props.IsEmpty()) {
414
- Local<Array> props = maybe_props.ToLocalChecked();
415
- for(uint32_t i=0; i < props->Length(); i++) {
416
- Local<Value> key = props->Get(i);
417
- VALUE rb_key = convert_v8_to_ruby(isolate, context, key);
418
- Local<Value> prop_value = object->Get(key);
419
- // this may have failed due to Get raising
420
-
421
- if (trycatch.HasCaught()) {
422
- // TODO isolate code that translates execption to ruby
423
- // exception so we can properly return it
424
- return rb_funcall(rb_cFailedV8Conversion, rb_intern("new"), 1, rb_str_new2(""));
425
- }
426
-
427
- VALUE rb_value = convert_v8_to_ruby(isolate, context, prop_value);
428
- rb_hash_aset(rb_hash, rb_key, rb_value);
429
- }
430
- }
431
- return rb_hash;
419
+ VALUE rb_hash = rb_hash_new();
420
+ TryCatch trycatch(isolate);
421
+
422
+ Local<Object> object = value->ToObject(context).ToLocalChecked();
423
+ auto maybe_props = object->GetOwnPropertyNames(context);
424
+ if (!maybe_props.IsEmpty()) {
425
+ Local<Array> props = maybe_props.ToLocalChecked();
426
+ for(uint32_t i=0; i < props->Length(); i++) {
427
+ Local<Value> key = props->Get(i);
428
+ VALUE rb_key = convert_v8_to_ruby(isolate, context, key);
429
+ Local<Value> prop_value = object->Get(key);
430
+ // this may have failed due to Get raising
431
+
432
+ if (trycatch.HasCaught()) {
433
+ // TODO isolate code that translates execption to ruby
434
+ // exception so we can properly return it
435
+ return rb_funcall(rb_cFailedV8Conversion, rb_intern("new"), 1, rb_str_new2(""));
436
+ }
437
+
438
+ VALUE rb_value = convert_v8_to_ruby(isolate, context, prop_value);
439
+ rb_hash_aset(rb_hash, rb_key, rb_value);
440
+ }
441
+ }
442
+ return rb_hash;
432
443
  }
433
444
 
434
- Local<String> rstr = value->ToString();
435
- return rb_enc_str_new(*String::Utf8Value(rstr), rstr->Utf8Length(), rb_enc_find("utf-8"));
445
+ Local<String> rstr = value->ToString(context).ToLocalChecked();
446
+ return rb_enc_str_new(*String::Utf8Value(isolate, rstr), rstr->Utf8Length(isolate), rb_enc_find("utf-8"));
436
447
  }
437
448
 
438
449
  static VALUE convert_v8_to_ruby(Isolate* isolate,
@@ -453,7 +464,7 @@ static VALUE convert_v8_to_ruby(Isolate* isolate,
453
464
  Local<Value>::New(isolate, value));
454
465
  }
455
466
 
456
- static Local<Value> convert_ruby_to_v8(Isolate* isolate, VALUE value) {
467
+ static Local<Value> convert_ruby_to_v8(Isolate* isolate, Local<Context> context, VALUE value) {
457
468
  EscapableHandleScope scope(isolate);
458
469
 
459
470
  Local<Array> array;
@@ -487,7 +498,7 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, VALUE value) {
487
498
  length = RARRAY_LEN(value);
488
499
  array = Array::New(isolate, (int)length);
489
500
  for(i=0; i<length; i++) {
490
- array->Set(i, convert_ruby_to_v8(isolate, rb_ary_entry(value, i)));
501
+ array->Set(i, convert_ruby_to_v8(isolate, context, rb_ary_entry(value, i)));
491
502
  }
492
503
  return scope.Escape(array);
493
504
  case T_HASH:
@@ -496,8 +507,8 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, VALUE value) {
496
507
  length = RARRAY_LEN(hash_as_array);
497
508
  for(i=0; i<length; i++) {
498
509
  pair = rb_ary_entry(hash_as_array, i);
499
- object->Set(convert_ruby_to_v8(isolate, rb_ary_entry(pair, 0)),
500
- convert_ruby_to_v8(isolate, rb_ary_entry(pair, 1)));
510
+ object->Set(convert_ruby_to_v8(isolate, context, rb_ary_entry(pair, 0)),
511
+ convert_ruby_to_v8(isolate, context, rb_ary_entry(pair, 1)));
501
512
  }
502
513
  return scope.Escape(object);
503
514
  case T_SYMBOL:
@@ -512,7 +523,7 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, VALUE value) {
512
523
  value = rb_funcall(value, rb_intern("to_time"), 0);
513
524
  }
514
525
  value = rb_funcall(value, rb_intern("to_f"), 0);
515
- return scope.Escape(Date::New(isolate, NUM2DBL(value) * 1000));
526
+ return scope.Escape(Date::New(context, NUM2DBL(value) * 1000).ToLocalChecked());
516
527
  }
517
528
  case T_OBJECT:
518
529
  case T_CLASS:
@@ -528,7 +539,6 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, VALUE value) {
528
539
  default:
529
540
  return scope.Escape(String::NewFromUtf8(isolate, "Undefined Conversion"));
530
541
  }
531
-
532
542
  }
533
543
 
534
544
  static void unblock_eval(void *ptr) {
@@ -536,6 +546,91 @@ static void unblock_eval(void *ptr) {
536
546
  eval->context_info->isolate_info->interrupted = true;
537
547
  }
538
548
 
549
+ /*
550
+ * The implementations of the run_extra_code(), create_snapshot_data_blob() and
551
+ * warm_up_snapshot_data_blob() functions have been derived from V8's test suite.
552
+ */
553
+ bool run_extra_code(Isolate *isolate, Local<v8::Context> context,
554
+ const char *utf8_source, const char *name) {
555
+ Context::Scope context_scope(context);
556
+ TryCatch try_catch(isolate);
557
+ Local<String> source_string;
558
+ if (!String::NewFromUtf8(isolate, utf8_source,
559
+ NewStringType::kNormal)
560
+ .ToLocal(&source_string)) {
561
+ return false;
562
+ }
563
+ Local<v8::String> resource_name =
564
+ String::NewFromUtf8(isolate, name, NewStringType::kNormal)
565
+ .ToLocalChecked();
566
+ ScriptOrigin origin(resource_name);
567
+ ScriptCompiler::Source source(source_string, origin);
568
+ Local<Script> script;
569
+ if (!ScriptCompiler::Compile(context, &source).ToLocal(&script))
570
+ return false;
571
+ if (script->Run(context).IsEmpty())
572
+ return false;
573
+ // CHECK(!try_catch.HasCaught());
574
+ return true;
575
+ }
576
+
577
+ StartupData
578
+ create_snapshot_data_blob(const char *embedded_source = nullptr) {
579
+ // Create a new isolate and a new context from scratch, optionally run
580
+ // a script to embed, and serialize to create a snapshot blob.
581
+ StartupData result = {nullptr, 0};
582
+ {
583
+ SnapshotCreator snapshot_creator;
584
+ Isolate *isolate = snapshot_creator.GetIsolate();
585
+ {
586
+ HandleScope scope(isolate);
587
+ Local<Context> context = Context::New(isolate);
588
+ if (embedded_source != nullptr &&
589
+ !run_extra_code(isolate, context, embedded_source,
590
+ "<embedded>")) {
591
+ return result;
592
+ }
593
+ snapshot_creator.SetDefaultContext(context);
594
+ }
595
+ result = snapshot_creator.CreateBlob(
596
+ SnapshotCreator::FunctionCodeHandling::kClear);
597
+ }
598
+ return result;
599
+ }
600
+
601
+ StartupData warm_up_snapshot_data_blob(StartupData cold_snapshot_blob,
602
+ const char *warmup_source) {
603
+ // Use following steps to create a warmed up snapshot blob from a cold one:
604
+ // - Create a new isolate from the cold snapshot.
605
+ // - Create a new context to run the warmup script. This will trigger
606
+ // compilation of executed functions.
607
+ // - Create a new context. This context will be unpolluted.
608
+ // - Serialize the isolate and the second context into a new snapshot blob.
609
+ StartupData result = {nullptr, 0};
610
+
611
+ if (cold_snapshot_blob.raw_size > 0 && cold_snapshot_blob.data != nullptr &&
612
+ warmup_source != NULL) {
613
+ SnapshotCreator snapshot_creator(nullptr, &cold_snapshot_blob);
614
+ Isolate *isolate = snapshot_creator.GetIsolate();
615
+ {
616
+ HandleScope scope(isolate);
617
+ Local<Context> context = Context::New(isolate);
618
+ if (!run_extra_code(isolate, context, warmup_source, "<warm-up>")) {
619
+ return result;
620
+ }
621
+ }
622
+ {
623
+ HandleScope handle_scope(isolate);
624
+ isolate->ContextDisposedNotification(false);
625
+ Local<Context> context = Context::New(isolate);
626
+ snapshot_creator.SetDefaultContext(context);
627
+ }
628
+ result = snapshot_creator.CreateBlob(
629
+ SnapshotCreator::FunctionCodeHandling::kKeep);
630
+ }
631
+ return result;
632
+ }
633
+
539
634
  static VALUE rb_snapshot_size(VALUE self, VALUE str) {
540
635
  SnapshotInfo* snapshot_info;
541
636
  Data_Get_Struct(self, SnapshotInfo, snapshot_info);
@@ -554,7 +649,7 @@ static VALUE rb_snapshot_load(VALUE self, VALUE str) {
554
649
 
555
650
  init_v8();
556
651
 
557
- StartupData startup_data = V8::CreateSnapshotDataBlob(RSTRING_PTR(str));
652
+ StartupData startup_data = create_snapshot_data_blob(RSTRING_PTR(str));
558
653
 
559
654
  if (startup_data.data == NULL && startup_data.raw_size == 0) {
560
655
  rb_raise(rb_eSnapshotError, "Could not create snapshot, most likely the source is incorrect");
@@ -585,7 +680,7 @@ static VALUE rb_snapshot_warmup_unsafe(VALUE self, VALUE str) {
585
680
  init_v8();
586
681
 
587
682
  StartupData cold_startup_data = {snapshot_info->data, snapshot_info->raw_size};
588
- StartupData warm_startup_data = V8::WarmUpSnapshotDataBlob(cold_startup_data, RSTRING_PTR(str));
683
+ StartupData warm_startup_data = warm_up_snapshot_data_blob(cold_startup_data, RSTRING_PTR(str));
589
684
 
590
685
  if (warm_startup_data.data == NULL && warm_startup_data.raw_size == 0) {
591
686
  rb_raise(rb_eSnapshotError, "Could not warm up snapshot, most likely the source is incorrect");
@@ -675,13 +770,13 @@ static VALUE rb_context_init_unsafe(VALUE self, VALUE isolate, VALUE snap) {
675
770
  // the ruby lock is needed if this isn't a new isolate
676
771
  IsolateInfo::Lock ruby_lock(isolate_info->mutex);
677
772
  Locker lock(isolate_info->isolate);
678
- Isolate::Scope isolate_scope(isolate_info->isolate);
679
- HandleScope handle_scope(isolate_info->isolate);
773
+ Isolate::Scope isolate_scope(isolate_info->isolate);
774
+ HandleScope handle_scope(isolate_info->isolate);
680
775
 
681
- Local<Context> context = Context::New(isolate_info->isolate);
776
+ Local<Context> context = Context::New(isolate_info->isolate);
682
777
 
683
- context_info->context = new Persistent<Context>();
684
- context_info->context->Reset(isolate_info->isolate, context);
778
+ context_info->context = new Persistent<Context>();
779
+ context_info->context->Reset(isolate_info->isolate, context);
685
780
  }
686
781
 
687
782
  if (Qnil == rb_cDateTime && rb_funcall(rb_cObject, rb_intern("const_defined?"), 1, rb_str_new2("DateTime")) == Qtrue)
@@ -764,8 +859,8 @@ static VALUE convert_result_to_ruby(VALUE self /* context */,
764
859
  Local<Value> tmp = Local<Value>::New(isolate, *result.value);
765
860
 
766
861
  if (result.json) {
767
- Local<String> rstr = tmp->ToString();
768
- VALUE json_string = rb_enc_str_new(*String::Utf8Value(rstr), rstr->Utf8Length(), rb_enc_find("utf-8"));
862
+ Local<String> rstr = tmp->ToString(p_ctx->Get(isolate)).ToLocalChecked();
863
+ VALUE json_string = rb_enc_str_new(*String::Utf8Value(isolate, rstr), rstr->Utf8Length(isolate), rb_enc_find("utf-8"));
769
864
  ret = rb_funcall(rb_mJSON, rb_intern("parse"), 1, json_string);
770
865
  } else {
771
866
  ret = convert_v8_to_ruby(isolate, *p_ctx, tmp);
@@ -803,42 +898,42 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) {
803
898
  }
804
899
 
805
900
  {
806
- Locker lock(isolate);
807
- Isolate::Scope isolate_scope(isolate);
808
- HandleScope handle_scope(isolate);
901
+ Locker lock(isolate);
902
+ Isolate::Scope isolate_scope(isolate);
903
+ HandleScope handle_scope(isolate);
809
904
 
810
- Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(str),
811
- NewStringType::kNormal, (int)RSTRING_LEN(str)).ToLocalChecked();
905
+ Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(str),
906
+ NewStringType::kNormal, (int)RSTRING_LEN(str)).ToLocalChecked();
812
907
 
813
- Local<String> local_filename;
908
+ Local<String> local_filename;
814
909
 
815
- if (filename != Qnil) {
816
- local_filename = String::NewFromUtf8(isolate, RSTRING_PTR(filename),
817
- NewStringType::kNormal, (int)RSTRING_LEN(filename)).ToLocalChecked();
818
- eval_params.filename = &local_filename;
819
- } else {
820
- eval_params.filename = NULL;
821
- }
910
+ if (filename != Qnil) {
911
+ local_filename = String::NewFromUtf8(isolate, RSTRING_PTR(filename),
912
+ NewStringType::kNormal, (int)RSTRING_LEN(filename)).ToLocalChecked();
913
+ eval_params.filename = &local_filename;
914
+ } else {
915
+ eval_params.filename = NULL;
916
+ }
822
917
 
823
- eval_params.context_info = context_info;
824
- eval_params.eval = &eval;
825
- eval_params.result = &eval_result;
826
- eval_params.timeout = 0;
827
- eval_params.max_memory = 0;
828
- VALUE timeout = rb_iv_get(self, "@timeout");
829
- if (timeout != Qnil) {
830
- eval_params.timeout = (useconds_t)NUM2LONG(timeout);
831
- }
918
+ eval_params.context_info = context_info;
919
+ eval_params.eval = &eval;
920
+ eval_params.result = &eval_result;
921
+ eval_params.timeout = 0;
922
+ eval_params.max_memory = 0;
923
+ VALUE timeout = rb_iv_get(self, "@timeout");
924
+ if (timeout != Qnil) {
925
+ eval_params.timeout = (useconds_t)NUM2LONG(timeout);
926
+ }
832
927
 
833
- VALUE mem_softlimit = rb_iv_get(self, "@max_memory");
834
- if (mem_softlimit != Qnil) {
835
- eval_params.max_memory = (size_t)NUM2ULONG(mem_softlimit);
836
- }
928
+ VALUE mem_softlimit = rb_iv_get(self, "@max_memory");
929
+ if (mem_softlimit != Qnil) {
930
+ eval_params.max_memory = (size_t)NUM2ULONG(mem_softlimit);
931
+ }
837
932
 
838
- eval_result.message = NULL;
839
- eval_result.backtrace = NULL;
933
+ eval_result.message = NULL;
934
+ eval_result.backtrace = NULL;
840
935
 
841
- rb_thread_call_without_gvl(nogvl_context_eval, &eval_params, unblock_eval, &eval_params);
936
+ rb_thread_call_without_gvl(nogvl_context_eval, &eval_params, unblock_eval, &eval_params);
842
937
  }
843
938
 
844
939
  return convert_result_to_ruby(self, eval_result);
@@ -851,17 +946,16 @@ typedef struct {
851
946
  bool failed;
852
947
  } protected_callback_data;
853
948
 
854
- static
855
- VALUE protected_callback(VALUE rdata) {
949
+ static VALUE protected_callback(VALUE rdata) {
856
950
  protected_callback_data* data = (protected_callback_data*)rdata;
857
951
  VALUE result;
858
952
 
859
953
  if (data->length > 0) {
860
- result = rb_funcall2(data->callback, rb_intern("call"), data->length,
861
- RARRAY_PTR(data->ruby_args));
862
- RB_GC_GUARD(data->ruby_args);
954
+ result = rb_funcall2(data->callback, rb_intern("call"), data->length,
955
+ RARRAY_PTR(data->ruby_args));
956
+ RB_GC_GUARD(data->ruby_args);
863
957
  } else {
864
- result = rb_funcall(data->callback, rb_intern("call"), 0);
958
+ result = rb_funcall(data->callback, rb_intern("call"), 0);
865
959
  }
866
960
  return result;
867
961
  }
@@ -883,6 +977,8 @@ gvl_ruby_callback(void* data) {
883
977
  VALUE result;
884
978
  VALUE self;
885
979
  VALUE parent;
980
+ ContextInfo* context_info;
981
+
886
982
  {
887
983
  HandleScope scope(args->GetIsolate());
888
984
  Local<External> external = Local<External>::Cast(args->Data());
@@ -895,19 +991,18 @@ gvl_ruby_callback(void* data) {
895
991
  return NULL;
896
992
  }
897
993
 
898
- ContextInfo* context_info;
899
994
  Data_Get_Struct(parent, ContextInfo, context_info);
900
995
 
901
- if (length > 0) {
902
- ruby_args = rb_ary_tmp_new(length);
903
- }
996
+ if (length > 0) {
997
+ ruby_args = rb_ary_tmp_new(length);
998
+ }
904
999
 
905
- for (int i = 0; i < length; i++) {
906
- Local<Value> value = ((*args)[i]).As<Value>();
907
- VALUE tmp = convert_v8_to_ruby(args->GetIsolate(),
908
- *context_info->context, value);
909
- rb_ary_push(ruby_args, tmp);
910
- }
1000
+ for (int i = 0; i < length; i++) {
1001
+ Local<Value> value = ((*args)[i]).As<Value>();
1002
+ VALUE tmp = convert_v8_to_ruby(args->GetIsolate(),
1003
+ *context_info->context, value);
1004
+ rb_ary_push(ruby_args, tmp);
1005
+ }
911
1006
  }
912
1007
 
913
1008
  // may raise exception stay clear of handle scope
@@ -918,31 +1013,31 @@ gvl_ruby_callback(void* data) {
918
1013
  callback_data.failed = false;
919
1014
 
920
1015
  if ((bool)args->GetIsolate()->GetData(DO_TERMINATE) == true) {
921
- args->GetIsolate()->ThrowException(String::NewFromUtf8(args->GetIsolate(), "Terminated execution during transition from Ruby to JS"));
922
- args->GetIsolate()->TerminateExecution();
923
- if (length > 0) {
924
- rb_ary_clear(ruby_args);
925
- rb_gc_force_recycle(ruby_args);
926
- }
927
- return NULL;
1016
+ args->GetIsolate()->ThrowException(String::NewFromUtf8(args->GetIsolate(), "Terminated execution during transition from Ruby to JS"));
1017
+ args->GetIsolate()->TerminateExecution();
1018
+ if (length > 0) {
1019
+ rb_ary_clear(ruby_args);
1020
+ rb_gc_force_recycle(ruby_args);
1021
+ }
1022
+ return NULL;
928
1023
  }
929
1024
 
930
1025
  result = rb_rescue2((VALUE(*)(...))&protected_callback, (VALUE)(&callback_data),
931
- (VALUE(*)(...))&rescue_callback, (VALUE)(&callback_data), rb_eException, (VALUE)0);
1026
+ (VALUE(*)(...))&rescue_callback, (VALUE)(&callback_data), rb_eException, (VALUE)0);
932
1027
 
933
1028
  if(callback_data.failed) {
934
- rb_iv_set(parent, "@current_exception", result);
935
- args->GetIsolate()->ThrowException(String::NewFromUtf8(args->GetIsolate(), "Ruby exception"));
1029
+ rb_iv_set(parent, "@current_exception", result);
1030
+ args->GetIsolate()->ThrowException(String::NewFromUtf8(args->GetIsolate(), "Ruby exception"));
936
1031
  }
937
1032
  else {
938
- HandleScope scope(args->GetIsolate());
939
- Handle<Value> v8_result = convert_ruby_to_v8(args->GetIsolate(), result);
940
- args->GetReturnValue().Set(v8_result);
1033
+ HandleScope scope(args->GetIsolate());
1034
+ Handle<Value> v8_result = convert_ruby_to_v8(args->GetIsolate(), context_info->context->Get(args->GetIsolate()), result);
1035
+ args->GetReturnValue().Set(v8_result);
941
1036
  }
942
1037
 
943
1038
  if (length > 0) {
944
- rb_ary_clear(ruby_args);
945
- rb_gc_force_recycle(ruby_args);
1039
+ rb_ary_clear(ruby_args);
1040
+ rb_gc_force_recycle(ruby_args);
946
1041
  }
947
1042
 
948
1043
  if ((bool)args->GetIsolate()->GetData(DO_TERMINATE) == true) {
@@ -957,11 +1052,11 @@ static void ruby_callback(const FunctionCallbackInfo<Value>& args) {
957
1052
  bool has_gvl = (bool)args.GetIsolate()->GetData(IN_GVL);
958
1053
 
959
1054
  if(has_gvl) {
960
- gvl_ruby_callback((void*)&args);
1055
+ gvl_ruby_callback((void*)&args);
961
1056
  } else {
962
- args.GetIsolate()->SetData(IN_GVL, (void*)true);
963
- rb_thread_call_with_gvl(gvl_ruby_callback, (void*)(&args));
964
- args.GetIsolate()->SetData(IN_GVL, (void*)false);
1057
+ args.GetIsolate()->SetData(IN_GVL, (void*)true);
1058
+ rb_thread_call_with_gvl(gvl_ruby_callback, (void*)(&args));
1059
+ args.GetIsolate()->SetData(IN_GVL, (void*)false);
965
1060
  }
966
1061
  }
967
1062
 
@@ -982,55 +1077,55 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
982
1077
  Isolate* isolate = context_info->isolate_info->isolate;
983
1078
 
984
1079
  {
985
- Locker lock(isolate);
986
- Isolate::Scope isolate_scope(isolate);
987
- HandleScope handle_scope(isolate);
988
-
989
- Local<Context> context = context_info->context->Get(isolate);
990
- Context::Scope context_scope(context);
991
-
992
- Local<String> v8_str = String::NewFromUtf8(isolate, RSTRING_PTR(name),
993
- NewStringType::kNormal, (int)RSTRING_LEN(name)).ToLocalChecked();
994
-
995
- // copy self so we can access from v8 external
996
- VALUE* self_copy;
997
- Data_Get_Struct(self, VALUE, self_copy);
998
- *self_copy = self;
999
-
1000
- Local<Value> external = External::New(isolate, self_copy);
1001
-
1002
- if (parent_object == Qnil) {
1003
- context->Global()->Set(v8_str, FunctionTemplate::New(isolate, ruby_callback, external)->GetFunction());
1004
- } else {
1005
-
1006
- Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval),
1007
- NewStringType::kNormal, (int)RSTRING_LEN(parent_object_eval)).ToLocalChecked();
1008
-
1009
- MaybeLocal<Script> parsed_script = Script::Compile(context, eval);
1010
- if (parsed_script.IsEmpty()) {
1011
- parse_error = true;
1012
- } else {
1013
- MaybeLocal<Value> maybe_value = parsed_script.ToLocalChecked()->Run(context);
1014
- attach_error = true;
1015
-
1016
- if (!maybe_value.IsEmpty()) {
1017
- Local<Value> value = maybe_value.ToLocalChecked();
1018
- if (value->IsObject()){
1019
- value.As<Object>()->Set(v8_str, FunctionTemplate::New(isolate, ruby_callback, external)->GetFunction());
1020
- attach_error = false;
1021
- }
1022
- }
1023
- }
1024
- }
1080
+ Locker lock(isolate);
1081
+ Isolate::Scope isolate_scope(isolate);
1082
+ HandleScope handle_scope(isolate);
1083
+
1084
+ Local<Context> context = context_info->context->Get(isolate);
1085
+ Context::Scope context_scope(context);
1086
+
1087
+ Local<String> v8_str = String::NewFromUtf8(isolate, RSTRING_PTR(name),
1088
+ NewStringType::kNormal, (int)RSTRING_LEN(name)).ToLocalChecked();
1089
+
1090
+ // copy self so we can access from v8 external
1091
+ VALUE* self_copy;
1092
+ Data_Get_Struct(self, VALUE, self_copy);
1093
+ *self_copy = self;
1094
+
1095
+ Local<Value> external = External::New(isolate, self_copy);
1096
+
1097
+ if (parent_object == Qnil) {
1098
+ context->Global()->Set(v8_str, FunctionTemplate::New(isolate, ruby_callback, external)->GetFunction());
1099
+ } else {
1100
+
1101
+ Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval),
1102
+ NewStringType::kNormal, (int)RSTRING_LEN(parent_object_eval)).ToLocalChecked();
1103
+
1104
+ MaybeLocal<Script> parsed_script = Script::Compile(context, eval);
1105
+ if (parsed_script.IsEmpty()) {
1106
+ parse_error = true;
1107
+ } else {
1108
+ MaybeLocal<Value> maybe_value = parsed_script.ToLocalChecked()->Run(context);
1109
+ attach_error = true;
1110
+
1111
+ if (!maybe_value.IsEmpty()) {
1112
+ Local<Value> value = maybe_value.ToLocalChecked();
1113
+ if (value->IsObject()){
1114
+ value.As<Object>()->Set(v8_str, FunctionTemplate::New(isolate, ruby_callback, external)->GetFunction());
1115
+ attach_error = false;
1116
+ }
1117
+ }
1118
+ }
1119
+ }
1025
1120
  }
1026
1121
 
1027
1122
  // always raise out of V8 context
1028
1123
  if (parse_error) {
1029
- rb_raise(rb_eParseError, "Invalid object %" PRIsVALUE, parent_object);
1124
+ rb_raise(rb_eParseError, "Invalid object %" PRIsVALUE, parent_object);
1030
1125
  }
1031
1126
 
1032
1127
  if (attach_error) {
1033
- rb_raise(rb_eParseError, "Was expecting %" PRIsVALUE" to be an object", parent_object);
1128
+ rb_raise(rb_eParseError, "Was expecting %" PRIsVALUE" to be an object", parent_object);
1034
1129
  }
1035
1130
 
1036
1131
  return Qnil;
@@ -1050,19 +1145,19 @@ static VALUE rb_context_isolate_mutex(VALUE self) {
1050
1145
  void free_isolate(IsolateInfo* isolate_info) {
1051
1146
 
1052
1147
  if (isolate_info->isolate) {
1053
- Locker lock(isolate_info->isolate);
1148
+ Locker lock(isolate_info->isolate);
1054
1149
  }
1055
1150
 
1056
1151
  if (isolate_info->isolate) {
1057
1152
  if (isolate_info->interrupted) {
1058
1153
  fprintf(stderr, "WARNING: V8 isolate was interrupted by Ruby, it can not be disposed and memory will not be reclaimed till the Ruby process exits.\n");
1059
1154
  } else {
1060
-
1061
- if (isolate_info->pid != getpid()) {
1062
- fprintf(stderr, "WARNING: V8 isolate was forked, it can not be disposed and memory will not be reclaimed till the Ruby process exits.\n");
1063
- } else {
1064
- isolate_info->isolate->Dispose();
1065
- }
1155
+
1156
+ if (isolate_info->pid != getpid()) {
1157
+ fprintf(stderr, "WARNING: V8 isolate was forked, it can not be disposed and memory will not be reclaimed till the Ruby process exits.\n");
1158
+ } else {
1159
+ isolate_info->isolate->Dispose();
1160
+ }
1066
1161
  }
1067
1162
  isolate_info->isolate = NULL;
1068
1163
  }
@@ -1105,17 +1200,17 @@ static void free_context(ContextInfo* context_info) {
1105
1200
  context_info_copy->context = context_info->context;
1106
1201
 
1107
1202
  if (isolate_info && isolate_info->refs() > 1) {
1108
- pthread_t free_context_thread;
1109
- if (pthread_create(&free_context_thread, NULL, free_context_raw, (void*)context_info_copy)) {
1110
- fprintf(stderr, "WARNING failed to release memory in MiniRacer, thread to release could not be created, process will leak memory\n");
1111
- }
1203
+ pthread_t free_context_thread;
1204
+ if (pthread_create(&free_context_thread, NULL, free_context_raw, (void*)context_info_copy)) {
1205
+ fprintf(stderr, "WARNING failed to release memory in MiniRacer, thread to release could not be created, process will leak memory\n");
1206
+ }
1112
1207
 
1113
1208
  } else {
1114
- free_context_raw(context_info_copy);
1209
+ free_context_raw(context_info_copy);
1115
1210
  }
1116
1211
 
1117
1212
  if (context_info->context && isolate_info && isolate_info->isolate) {
1118
- context_info->context = NULL;
1213
+ context_info->context = NULL;
1119
1214
  }
1120
1215
 
1121
1216
  if (isolate_info) {
@@ -1201,20 +1296,20 @@ rb_heap_stats(VALUE self) {
1201
1296
 
1202
1297
  if (!isolate) {
1203
1298
 
1204
- rb_hash_aset(rval, ID2SYM(rb_intern("total_physical_size")), ULONG2NUM(0));
1205
- rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size_executable")), ULONG2NUM(0));
1206
- rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size")), ULONG2NUM(0));
1207
- rb_hash_aset(rval, ID2SYM(rb_intern("used_heap_size")), ULONG2NUM(0));
1208
- rb_hash_aset(rval, ID2SYM(rb_intern("heap_size_limit")), ULONG2NUM(0));
1299
+ rb_hash_aset(rval, ID2SYM(rb_intern("total_physical_size")), ULONG2NUM(0));
1300
+ rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size_executable")), ULONG2NUM(0));
1301
+ rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size")), ULONG2NUM(0));
1302
+ rb_hash_aset(rval, ID2SYM(rb_intern("used_heap_size")), ULONG2NUM(0));
1303
+ rb_hash_aset(rval, ID2SYM(rb_intern("heap_size_limit")), ULONG2NUM(0));
1209
1304
 
1210
1305
  } else {
1211
- isolate->GetHeapStatistics(&stats);
1306
+ isolate->GetHeapStatistics(&stats);
1212
1307
 
1213
- rb_hash_aset(rval, ID2SYM(rb_intern("total_physical_size")), ULONG2NUM(stats.total_physical_size()));
1214
- rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size_executable")), ULONG2NUM(stats.total_heap_size_executable()));
1215
- rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size")), ULONG2NUM(stats.total_heap_size()));
1216
- rb_hash_aset(rval, ID2SYM(rb_intern("used_heap_size")), ULONG2NUM(stats.used_heap_size()));
1217
- rb_hash_aset(rval, ID2SYM(rb_intern("heap_size_limit")), ULONG2NUM(stats.heap_size_limit()));
1308
+ rb_hash_aset(rval, ID2SYM(rb_intern("total_physical_size")), ULONG2NUM(stats.total_physical_size()));
1309
+ rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size_executable")), ULONG2NUM(stats.total_heap_size_executable()));
1310
+ rb_hash_aset(rval, ID2SYM(rb_intern("total_heap_size")), ULONG2NUM(stats.total_heap_size()));
1311
+ rb_hash_aset(rval, ID2SYM(rb_intern("used_heap_size")), ULONG2NUM(stats.used_heap_size()));
1312
+ rb_hash_aset(rval, ID2SYM(rb_intern("heap_size_limit")), ULONG2NUM(stats.heap_size_limit()));
1218
1313
  }
1219
1314
 
1220
1315
  return rval;
@@ -1287,8 +1382,7 @@ static void unblock_function(void *args) {
1287
1382
  call->context_info->isolate_info->interrupted = true;
1288
1383
  }
1289
1384
 
1290
- static VALUE
1291
- rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1385
+ static VALUE rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1292
1386
  ContextInfo* context_info;
1293
1387
  FunctionCall call;
1294
1388
  VALUE *call_argv = NULL;
@@ -1321,7 +1415,6 @@ rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1321
1415
  }
1322
1416
 
1323
1417
  bool missingFunction = false;
1324
-
1325
1418
  {
1326
1419
  Locker lock(isolate);
1327
1420
  Isolate::Scope isolate_scope(isolate);
@@ -1332,35 +1425,34 @@ rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1332
1425
 
1333
1426
  // examples of such usage can be found in
1334
1427
  // https://github.com/v8/v8/blob/36b32aa28db5e993312f4588d60aad5c8330c8a5/test/cctest/test-api.cc#L15711
1335
- Local<String> fname = String::NewFromUtf8(isolate, call.function_name);
1336
- MaybeLocal<v8::Value> val = context->Global()->Get(fname);
1337
-
1338
- if (val.IsEmpty() || !val.ToLocalChecked()->IsFunction()) {
1339
- missingFunction = true;
1340
- } else {
1341
-
1342
- Local<v8::Function> fun = Local<v8::Function>::Cast(val.ToLocalChecked());
1343
- call.fun = fun;
1344
- int fun_argc = call.argc;
1345
-
1346
- if (fun_argc > 0) {
1347
- call.argv = (v8::Local<Value> *) malloc(sizeof(void *) * fun_argc);
1348
- if (!call.argv) {
1349
- return Qnil;
1350
- }
1351
- for(int i=0; i < fun_argc; i++) {
1352
- call.argv[i] = convert_ruby_to_v8(isolate, call_argv[i]);
1353
- }
1354
- }
1355
-
1356
- rb_thread_call_without_gvl(nogvl_context_call, &call, unblock_function, &call);
1357
- free(call.argv);
1428
+ Local<String> fname = String::NewFromUtf8(isolate, call.function_name);
1429
+ MaybeLocal<v8::Value> val = context->Global()->Get(fname);
1358
1430
 
1359
- }
1431
+ if (val.IsEmpty() || !val.ToLocalChecked()->IsFunction()) {
1432
+ missingFunction = true;
1433
+ } else {
1434
+
1435
+ Local<v8::Function> fun = Local<v8::Function>::Cast(val.ToLocalChecked());
1436
+ call.fun = fun;
1437
+ int fun_argc = call.argc;
1438
+
1439
+ if (fun_argc > 0) {
1440
+ call.argv = (v8::Local<Value> *) malloc(sizeof(void *) * fun_argc);
1441
+ if (!call.argv) {
1442
+ return Qnil;
1443
+ }
1444
+ for(int i=0; i < fun_argc; i++) {
1445
+ call.argv[i] = convert_ruby_to_v8(isolate, context, call_argv[i]);
1446
+ }
1447
+ }
1448
+ rb_thread_call_without_gvl(nogvl_context_call, &call, unblock_function, &call);
1449
+ free(call.argv);
1450
+
1451
+ }
1360
1452
  }
1361
1453
 
1362
1454
  if (missingFunction) {
1363
- rb_raise(rb_eScriptRuntimeError, "Unknown JavaScript method invoked");
1455
+ rb_raise(rb_eScriptRuntimeError, "Unknown JavaScript method invoked");
1364
1456
  }
1365
1457
 
1366
1458
  return convert_result_to_ruby(self, call.result);
@@ -1383,53 +1475,52 @@ extern "C" {
1383
1475
 
1384
1476
  void Init_mini_racer_extension ( void )
1385
1477
  {
1386
- VALUE rb_mMiniRacer = rb_define_module("MiniRacer");
1387
- rb_cContext = rb_define_class_under(rb_mMiniRacer, "Context", rb_cObject);
1388
- rb_cSnapshot = rb_define_class_under(rb_mMiniRacer, "Snapshot", rb_cObject);
1389
- rb_cIsolate = rb_define_class_under(rb_mMiniRacer, "Isolate", rb_cObject);
1390
- VALUE rb_cPlatform = rb_define_class_under(rb_mMiniRacer, "Platform", rb_cObject);
1391
-
1392
- VALUE rb_eError = rb_define_class_under(rb_mMiniRacer, "Error", rb_eStandardError);
1393
-
1394
- VALUE rb_eEvalError = rb_define_class_under(rb_mMiniRacer, "EvalError", rb_eError);
1395
- rb_eScriptTerminatedError = rb_define_class_under(rb_mMiniRacer, "ScriptTerminatedError", rb_eEvalError);
1396
- rb_eV8OutOfMemoryError = rb_define_class_under(rb_mMiniRacer, "V8OutOfMemoryError", rb_eEvalError);
1397
- rb_eParseError = rb_define_class_under(rb_mMiniRacer, "ParseError", rb_eEvalError);
1398
- rb_eScriptRuntimeError = rb_define_class_under(rb_mMiniRacer, "RuntimeError", rb_eEvalError);
1399
-
1400
- rb_cJavaScriptFunction = rb_define_class_under(rb_mMiniRacer, "JavaScriptFunction", rb_cObject);
1401
- rb_eSnapshotError = rb_define_class_under(rb_mMiniRacer, "SnapshotError", rb_eError);
1402
- rb_ePlatformAlreadyInitializedError = rb_define_class_under(rb_mMiniRacer, "PlatformAlreadyInitialized", rb_eError);
1403
- rb_cFailedV8Conversion = rb_define_class_under(rb_mMiniRacer, "FailedV8Conversion", rb_cObject);
1404
- rb_mJSON = rb_define_module("JSON");
1405
-
1406
- VALUE rb_cExternalFunction = rb_define_class_under(rb_cContext, "ExternalFunction", rb_cObject);
1407
-
1408
- rb_define_method(rb_cContext, "stop", (VALUE(*)(...))&rb_context_stop, 0);
1409
- rb_define_method(rb_cContext, "dispose_unsafe", (VALUE(*)(...))&rb_context_dispose, 0);
1410
- rb_define_method(rb_cContext, "heap_stats", (VALUE(*)(...))&rb_heap_stats, 0);
1411
- rb_define_private_method(rb_cContext, "create_isolate_value",(VALUE(*)(...))&rb_context_create_isolate_value, 0);
1412
- rb_define_private_method(rb_cContext, "eval_unsafe",(VALUE(*)(...))&rb_context_eval_unsafe, 2);
1413
- rb_define_private_method(rb_cContext, "call_unsafe", (VALUE(*)(...))&rb_context_call_unsafe, -1);
1414
- rb_define_private_method(rb_cContext, "isolate_mutex", (VALUE(*)(...))&rb_context_isolate_mutex, 0);
1415
- rb_define_private_method(rb_cContext, "init_unsafe",(VALUE(*)(...))&rb_context_init_unsafe, 2);
1416
-
1417
- rb_define_alloc_func(rb_cContext, allocate);
1418
- rb_define_alloc_func(rb_cSnapshot, allocate_snapshot);
1419
- rb_define_alloc_func(rb_cIsolate, allocate_isolate);
1420
-
1421
- rb_define_private_method(rb_cExternalFunction, "notify_v8", (VALUE(*)(...))&rb_external_function_notify_v8, 0);
1422
- rb_define_alloc_func(rb_cExternalFunction, allocate_external_function);
1423
-
1424
- rb_define_method(rb_cSnapshot, "size", (VALUE(*)(...))&rb_snapshot_size, 0);
1425
- rb_define_method(rb_cSnapshot, "dump", (VALUE(*)(...))&rb_snapshot_dump, 0);
1426
- rb_define_method(rb_cSnapshot, "warmup_unsafe!", (VALUE(*)(...))&rb_snapshot_warmup_unsafe, 1);
1427
- rb_define_private_method(rb_cSnapshot, "load", (VALUE(*)(...))&rb_snapshot_load, 1);
1428
-
1429
- rb_define_method(rb_cIsolate, "idle_notification", (VALUE(*)(...))&rb_isolate_idle_notification, 1);
1430
- rb_define_private_method(rb_cIsolate, "init_with_snapshot",(VALUE(*)(...))&rb_isolate_init_with_snapshot, 1);
1431
-
1432
- rb_define_singleton_method(rb_cPlatform, "set_flag_as_str!", (VALUE(*)(...))&rb_platform_set_flag_as_str, 1);
1478
+ VALUE rb_mMiniRacer = rb_define_module("MiniRacer");
1479
+ rb_cContext = rb_define_class_under(rb_mMiniRacer, "Context", rb_cObject);
1480
+ rb_cSnapshot = rb_define_class_under(rb_mMiniRacer, "Snapshot", rb_cObject);
1481
+ rb_cIsolate = rb_define_class_under(rb_mMiniRacer, "Isolate", rb_cObject);
1482
+ VALUE rb_cPlatform = rb_define_class_under(rb_mMiniRacer, "Platform", rb_cObject);
1483
+
1484
+ VALUE rb_eError = rb_define_class_under(rb_mMiniRacer, "Error", rb_eStandardError);
1485
+
1486
+ VALUE rb_eEvalError = rb_define_class_under(rb_mMiniRacer, "EvalError", rb_eError);
1487
+ rb_eScriptTerminatedError = rb_define_class_under(rb_mMiniRacer, "ScriptTerminatedError", rb_eEvalError);
1488
+ rb_eV8OutOfMemoryError = rb_define_class_under(rb_mMiniRacer, "V8OutOfMemoryError", rb_eEvalError);
1489
+ rb_eParseError = rb_define_class_under(rb_mMiniRacer, "ParseError", rb_eEvalError);
1490
+ rb_eScriptRuntimeError = rb_define_class_under(rb_mMiniRacer, "RuntimeError", rb_eEvalError);
1491
+
1492
+ rb_cJavaScriptFunction = rb_define_class_under(rb_mMiniRacer, "JavaScriptFunction", rb_cObject);
1493
+ rb_eSnapshotError = rb_define_class_under(rb_mMiniRacer, "SnapshotError", rb_eError);
1494
+ rb_ePlatformAlreadyInitializedError = rb_define_class_under(rb_mMiniRacer, "PlatformAlreadyInitialized", rb_eError);
1495
+ rb_cFailedV8Conversion = rb_define_class_under(rb_mMiniRacer, "FailedV8Conversion", rb_cObject);
1496
+ rb_mJSON = rb_define_module("JSON");
1497
+
1498
+ VALUE rb_cExternalFunction = rb_define_class_under(rb_cContext, "ExternalFunction", rb_cObject);
1499
+
1500
+ rb_define_method(rb_cContext, "stop", (VALUE(*)(...))&rb_context_stop, 0);
1501
+ rb_define_method(rb_cContext, "dispose_unsafe", (VALUE(*)(...))&rb_context_dispose, 0);
1502
+ rb_define_method(rb_cContext, "heap_stats", (VALUE(*)(...))&rb_heap_stats, 0);
1503
+ rb_define_private_method(rb_cContext, "create_isolate_value",(VALUE(*)(...))&rb_context_create_isolate_value, 0);
1504
+ rb_define_private_method(rb_cContext, "eval_unsafe",(VALUE(*)(...))&rb_context_eval_unsafe, 2);
1505
+ rb_define_private_method(rb_cContext, "call_unsafe", (VALUE(*)(...))&rb_context_call_unsafe, -1);
1506
+ rb_define_private_method(rb_cContext, "isolate_mutex", (VALUE(*)(...))&rb_context_isolate_mutex, 0);
1507
+ rb_define_private_method(rb_cContext, "init_unsafe",(VALUE(*)(...))&rb_context_init_unsafe, 2);
1508
+
1509
+ rb_define_alloc_func(rb_cContext, allocate);
1510
+ rb_define_alloc_func(rb_cSnapshot, allocate_snapshot);
1511
+ rb_define_alloc_func(rb_cIsolate, allocate_isolate);
1512
+
1513
+ rb_define_private_method(rb_cExternalFunction, "notify_v8", (VALUE(*)(...))&rb_external_function_notify_v8, 0);
1514
+ rb_define_alloc_func(rb_cExternalFunction, allocate_external_function);
1515
+
1516
+ rb_define_method(rb_cSnapshot, "size", (VALUE(*)(...))&rb_snapshot_size, 0);
1517
+ rb_define_method(rb_cSnapshot, "dump", (VALUE(*)(...))&rb_snapshot_dump, 0);
1518
+ rb_define_method(rb_cSnapshot, "warmup_unsafe!", (VALUE(*)(...))&rb_snapshot_warmup_unsafe, 1);
1519
+ rb_define_private_method(rb_cSnapshot, "load", (VALUE(*)(...))&rb_snapshot_load, 1);
1520
+
1521
+ rb_define_method(rb_cIsolate, "idle_notification", (VALUE(*)(...))&rb_isolate_idle_notification, 1);
1522
+ rb_define_private_method(rb_cIsolate, "init_with_snapshot",(VALUE(*)(...))&rb_isolate_init_with_snapshot, 1);
1523
+
1524
+ rb_define_singleton_method(rb_cPlatform, "set_flag_as_str!", (VALUE(*)(...))&rb_platform_set_flag_as_str, 1);
1433
1525
  }
1434
-
1435
1526
  }
@@ -1,3 +1,3 @@
1
1
  module MiniRacer
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.license = "MIT"
16
16
 
17
17
 
18
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(benchmark|test|spec|features)/}) }
18
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(benchmark|test|spec|features|examples)/}) }
19
19
  spec.bindir = "exe"
20
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
21
  spec.require_paths = ["lib"]
@@ -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', '>= 6.3'
28
+ spec.add_dependency 'libv8', '>= 6.9.411'
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.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-02 00:00:00.000000000 Z
11
+ date: 2019-04-25 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: '6.3'
75
+ version: 6.9.411
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: '6.3'
82
+ version: 6.9.411
83
83
  description: Minimal embedded v8 engine for Ruby
84
84
  email:
85
85
  - sam.saffron@gmail.com
@@ -123,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.7.6
126
+ rubygems_version: 3.0.3
128
127
  signing_key:
129
128
  specification_version: 4
130
129
  summary: Minimal embedded v8 for Ruby