mini_racer 0.6.0 → 0.6.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
  SHA256:
3
- metadata.gz: 179c0a63082cf1ec6bc7f8ead94fbcba3c41255ee91b1639482570d1ec3f7646
4
- data.tar.gz: cdef6f06a6ab72060aa43b21518c6f0103bf80c034bee09b7cf1d6f215620c31
3
+ metadata.gz: e832863760637f983976194ebef263d8815c149d48ff26c7200367ab33640dda
4
+ data.tar.gz: 7c1c393ae6403a75d2a413395d56e7d5f3affe706b81c121273b4c6b5d471bf4
5
5
  SHA512:
6
- metadata.gz: 0efd1873f139141ac489ed24ebcad3e289092ea67ea7823d0b94fe07a3acfcd602ed64c287b39b556d370db5c17b094d38a9c5ff06f31f546dddda7694d01c81
7
- data.tar.gz: 1ccc24b53320211be2b3cd887ac1193ee0654e0b54c0d2b3da636a382ce00c95d4af3ba5acd23a931436d08e0707dc0b4d348b6bbd0863cb56df9fb2fbd2678e
6
+ metadata.gz: 4504cb3a564e5b311b65de74bac321b058995af17df47f9f3dc01fcb589a87eebfda55497e0ddb135a2ab15ef1818760652561d434d3f497c0dbd036451934c6
7
+ data.tar.gz: b83df123a61092ab4041212bb6e4f15b276d5e32e8be8d2b5cbc014988b8cf20ed0e0b3b30595de53ca4c0d599a86112d695009cda13891fe177742aff7d911e
data/CHANGELOG CHANGED
@@ -1,5 +1,20 @@
1
+ - 17-01-2021
2
+
3
+ - 0.6.2
4
+
5
+ - Fix support for compilation on 2.6, llvm compiles
6
+ - Stability patches to handle rare memory leaks
7
+ - Corrected re-raising of exceptions to support strings
8
+ - During early termination of context under certain conditions MiniRacer could crash
9
+
10
+
1
11
  - 31-12-2021
2
12
 
13
+ - 0.6.1
14
+
15
+ - Added support for single threaded platform: `MiniRacer::Platform.set_flags! :single_threaded`
16
+ must be called prior to booting ANY MiniRacer::Context
17
+
3
18
  - 0.6.0
4
19
 
5
20
  - Ruby 3.1 support
@@ -13,7 +28,6 @@
13
28
  - Fixes issues on aarch (Apple M1)
14
29
  - Update to use libv8-node 16.x (#210) [Loic Nageleisen]
15
30
  - FEATURE: Configurable max marshal stack depth (#202) [seanmakesgames]
16
- - FEATURE: Configurable max marshal stack depth (#202) [seanmakesgames]
17
31
  - Ruby 2.3 and 2.4 are EOL, we no longer support them
18
32
 
19
33
  - 0.4.0
@@ -75,4 +75,9 @@ if enable_config('asan')
75
75
  $LDFLAGS.insert(0, " -fsanitize=address ")
76
76
  end
77
77
 
78
+ # there doesn't seem to be a CPP macro for this in Ruby 2.6:
79
+ if RUBY_ENGINE == 'ruby'
80
+ $CPPFLAGS += ' -DENGINE_IS_CRUBY '
81
+ end
82
+
78
83
  create_makefile 'mini_racer_extension'
@@ -2,6 +2,7 @@
2
2
  #include <ruby.h>
3
3
  #include <ruby/thread.h>
4
4
  #include <ruby/io.h>
5
+ #include <ruby/version.h>
5
6
  #include <v8.h>
6
7
  #include <v8-profiler.h>
7
8
  #include <libplatform/libplatform.h>
@@ -13,6 +14,14 @@
13
14
  #include <math.h>
14
15
  #include <errno.h>
15
16
 
17
+ /* workaround C Ruby <= 2.x problems w/ clang in C++ mode */
18
+ #if defined(ENGINE_IS_CRUBY) && \
19
+ RUBY_API_VERSION_MAJOR == 2 && RUBY_API_VERSION_MINOR <= 6
20
+ # define MR_METHOD_FUNC(fn) RUBY_METHOD_FUNC(fn)
21
+ #else
22
+ # define MR_METHOD_FUNC(fn) fn
23
+ #endif
24
+
16
25
  using namespace v8;
17
26
 
18
27
  typedef struct {
@@ -337,7 +346,7 @@ static VALUE rb_platform_set_flag_as_str(VALUE _klass, VALUE flag_as_str) {
337
346
  if (!strcmp(RSTRING_PTR(flag_as_str), "--single_threaded")) {
338
347
  single_threaded = true;
339
348
  }
340
- V8::SetFlagsFromString(RSTRING_PTR(flag_as_str), (int)RSTRING_LEN(flag_as_str));
349
+ V8::SetFlagsFromString(RSTRING_PTR(flag_as_str), RSTRING_LENINT(flag_as_str));
341
350
  } else {
342
351
  platform_already_initialized = true;
343
352
  }
@@ -360,7 +369,11 @@ static void init_v8() {
360
369
 
361
370
  if (current_platform == NULL) {
362
371
  V8::InitializeICU();
363
- current_platform = platform::NewDefaultPlatform();
372
+ if (single_threaded) {
373
+ current_platform = platform::NewSingleThreadedDefaultPlatform();
374
+ } else {
375
+ current_platform = platform::NewDefaultPlatform();
376
+ }
364
377
  V8::InitializePlatform(current_platform.get());
365
378
  V8::Initialize();
366
379
  }
@@ -405,28 +418,32 @@ static void prepare_result(MaybeLocal<Value> v8res,
405
418
  Local<Value> local_value = v8res.ToLocalChecked();
406
419
  if ((local_value->IsObject() || local_value->IsArray()) &&
407
420
  !local_value->IsDate() && !local_value->IsFunction()) {
408
- Local<Object> JSON = context->Global()->Get(
409
- context, String::NewFromUtf8Literal(isolate, "JSON"))
410
- .ToLocalChecked().As<Object>();
411
-
412
- Local<Function> stringify = JSON->Get(
413
- context, v8::String::NewFromUtf8Literal(isolate, "stringify"))
414
- .ToLocalChecked().As<Function>();
421
+ MaybeLocal<v8::Value> ml = context->Global()->Get(
422
+ context, String::NewFromUtf8Literal(isolate, "JSON"));
415
423
 
416
- Local<Object> object = local_value->ToObject(context).ToLocalChecked();
417
- const unsigned argc = 1;
418
- Local<Value> argv[argc] = { object };
419
- MaybeLocal<Value> json = stringify->Call(context, JSON, argc, argv);
420
-
421
- if (json.IsEmpty()) {
424
+ if (ml.IsEmpty()) { // exception
422
425
  evalRes.executed = false;
423
426
  } else {
424
- evalRes.json = true;
425
- Persistent<Value>* persistent = new Persistent<Value>();
426
- persistent->Reset(isolate, json.ToLocalChecked());
427
- evalRes.value = persistent;
427
+ Local<Object> JSON = ml.ToLocalChecked().As<Object>();
428
+
429
+ Local<Function> stringify = JSON->Get(
430
+ context, v8::String::NewFromUtf8Literal(isolate, "stringify"))
431
+ .ToLocalChecked().As<Function>();
432
+
433
+ Local<Object> object = local_value->ToObject(context).ToLocalChecked();
434
+ const unsigned argc = 1;
435
+ Local<Value> argv[argc] = { object };
436
+ MaybeLocal<Value> json = stringify->Call(context, JSON, argc, argv);
437
+
438
+ if (json.IsEmpty()) {
439
+ evalRes.executed = false;
440
+ } else {
441
+ evalRes.json = true;
442
+ Persistent<Value>* persistent = new Persistent<Value>();
443
+ persistent->Reset(isolate, json.ToLocalChecked());
444
+ evalRes.value = persistent;
445
+ }
428
446
  }
429
-
430
447
  } else {
431
448
  Persistent<Value>* persistent = new Persistent<Value>();
432
449
  persistent->Reset(isolate, local_value);
@@ -707,7 +724,7 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, Local<Context> context,
707
724
  case T_FLOAT:
708
725
  return scope.Escape(Number::New(isolate, NUM2DBL(value)));
709
726
  case T_STRING:
710
- return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, (int)RSTRING_LEN(value)).ToLocalChecked());
727
+ return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, RSTRING_LENINT(value)).ToLocalChecked());
711
728
  case T_NIL:
712
729
  return scope.Escape(Null(isolate));
713
730
  case T_TRUE:
@@ -735,7 +752,7 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, Local<Context> context,
735
752
  return scope.Escape(object);
736
753
  case T_SYMBOL:
737
754
  value = rb_funcall(value, rb_intern("to_s"), 0);
738
- return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, (int)RSTRING_LEN(value)).ToLocalChecked());
755
+ return scope.Escape(String::NewFromUtf8(isolate, RSTRING_PTR(value), NewStringType::kNormal, RSTRING_LENINT(value)).ToLocalChecked());
739
756
  case T_DATA:
740
757
  klass = rb_funcall(value, rb_intern("class"), 0);
741
758
  if (klass == rb_cTime || klass == rb_cDateTime)
@@ -1053,7 +1070,7 @@ static VALUE convert_result_to_ruby(VALUE self /* context */,
1053
1070
  // a v8 scope, if we do the scope is never cleaned up properly and we leak
1054
1071
  if (!result.parsed) {
1055
1072
  if(TYPE(message) == T_STRING) {
1056
- rb_raise(rb_eParseError, "%s", RSTRING_PTR(message));
1073
+ rb_raise(rb_eParseError, "%" PRIsVALUE, message);
1057
1074
  } else {
1058
1075
  rb_raise(rb_eParseError, "Unknown JavaScript Error during parse");
1059
1076
  }
@@ -1077,15 +1094,17 @@ static VALUE convert_result_to_ruby(VALUE self /* context */,
1077
1094
 
1078
1095
  // exception report about what happened
1079
1096
  if (TYPE(backtrace) == T_STRING) {
1080
- rb_raise(ruby_exception, "%s", RSTRING_PTR(backtrace));
1097
+ rb_raise(ruby_exception, "%" PRIsVALUE, backtrace);
1081
1098
  } else if(TYPE(message) == T_STRING) {
1082
- rb_raise(ruby_exception, "%s", RSTRING_PTR(message));
1099
+ rb_raise(ruby_exception, "%" PRIsVALUE, message);
1083
1100
  } else {
1084
1101
  rb_raise(ruby_exception, "Unknown JavaScript Error during execution");
1085
1102
  }
1103
+ } else if (rb_obj_is_kind_of(ruby_exception, rb_eException)) {
1104
+ rb_exc_raise(ruby_exception);
1086
1105
  } else {
1087
1106
  VALUE rb_str = rb_funcall(ruby_exception, rb_intern("to_s"), 0);
1088
- rb_raise(CLASS_OF(ruby_exception), "%s", RSTRING_PTR(rb_str));
1107
+ rb_raise(CLASS_OF(ruby_exception), "%" PRIsVALUE, rb_str);
1089
1108
  }
1090
1109
  }
1091
1110
 
@@ -1145,13 +1164,13 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) {
1145
1164
  HandleScope handle_scope(isolate);
1146
1165
 
1147
1166
  Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(str),
1148
- NewStringType::kNormal, (int)RSTRING_LEN(str)).ToLocalChecked();
1167
+ NewStringType::kNormal, RSTRING_LENINT(str)).ToLocalChecked();
1149
1168
 
1150
1169
  Local<String> local_filename;
1151
1170
 
1152
1171
  if (filename != Qnil) {
1153
1172
  local_filename = String::NewFromUtf8(isolate, RSTRING_PTR(filename),
1154
- NewStringType::kNormal, (int)RSTRING_LEN(filename)).ToLocalChecked();
1173
+ NewStringType::kNormal, RSTRING_LENINT(filename)).ToLocalChecked();
1155
1174
  eval_params.filename = &local_filename;
1156
1175
  } else {
1157
1176
  eval_params.filename = NULL;
@@ -1275,8 +1294,8 @@ gvl_ruby_callback(void* data) {
1275
1294
  VALUE callback_data_value = (VALUE)&callback_data;
1276
1295
 
1277
1296
  // TODO: use rb_vrescue2 in Ruby 2.7 and above
1278
- result = rb_rescue2(protected_callback, callback_data_value,
1279
- rescue_callback, callback_data_value, rb_eException, (VALUE)0);
1297
+ result = rb_rescue2(MR_METHOD_FUNC(protected_callback), callback_data_value,
1298
+ MR_METHOD_FUNC(rescue_callback), callback_data_value, rb_eException, (VALUE)0);
1280
1299
 
1281
1300
  if(callback_data.failed) {
1282
1301
  rb_iv_set(parent, "@current_exception", result);
@@ -1337,7 +1356,7 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
1337
1356
 
1338
1357
  Local<String> v8_str =
1339
1358
  String::NewFromUtf8(isolate, RSTRING_PTR(name),
1340
- NewStringType::kNormal, (int)RSTRING_LEN(name))
1359
+ NewStringType::kNormal, RSTRING_LENINT(name))
1341
1360
  .ToLocalChecked();
1342
1361
 
1343
1362
  // Note that self (rb_cExternalFunction) is a pure Ruby T_OBJECT,
@@ -1357,7 +1376,7 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
1357
1376
  Local<String> eval =
1358
1377
  String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval),
1359
1378
  NewStringType::kNormal,
1360
- (int)RSTRING_LEN(parent_object_eval))
1379
+ RSTRING_LENINT(parent_object_eval))
1361
1380
  .ToLocalChecked();
1362
1381
 
1363
1382
  MaybeLocal<Script> parsed_script = Script::Compile(context, eval);
@@ -1816,23 +1835,15 @@ static VALUE rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1816
1835
  if (val.IsEmpty() || !val.ToLocalChecked()->IsFunction()) {
1817
1836
  missingFunction = true;
1818
1837
  } else {
1819
-
1820
1838
  Local<v8::Function> fun = Local<v8::Function>::Cast(val.ToLocalChecked());
1839
+ VALUE tmp;
1821
1840
  call.fun = fun;
1822
- int fun_argc = call.argc;
1823
-
1824
- if (fun_argc > 0) {
1825
- call.argv = (v8::Local<Value> *) malloc(sizeof(void *) * fun_argc);
1826
- if (!call.argv) {
1827
- return Qnil;
1828
- }
1829
- for(int i=0; i < fun_argc; i++) {
1830
- call.argv[i] = convert_ruby_to_v8(isolate, context, call_argv[i]);
1831
- }
1841
+ call.argv = (v8::Local<Value> *)RB_ALLOCV_N(void *, tmp, call.argc);
1842
+ for(int i=0; i < call.argc; i++) {
1843
+ call.argv[i] = convert_ruby_to_v8(isolate, context, call_argv[i]);
1832
1844
  }
1833
1845
  rb_thread_call_without_gvl(nogvl_context_call, &call, unblock_function, &call);
1834
- free(call.argv);
1835
-
1846
+ RB_ALLOCV_END(tmp);
1836
1847
  }
1837
1848
  }
1838
1849
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniRacer
4
- VERSION = "0.6.0"
4
+ VERSION = "0.6.2"
5
5
  LIBV8_NODE_VERSION = "~> 16.10.0.0"
6
6
  end
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.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-31 00:00:00.000000000 Z
11
+ date: 2022-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -128,9 +128,9 @@ licenses:
128
128
  - MIT
129
129
  metadata:
130
130
  bug_tracker_uri: https://github.com/discourse/mini_racer/issues
131
- changelog_uri: https://github.com/discourse/mini_racer/blob/v0.6.0/CHANGELOG
132
- documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.6.0
133
- source_code_uri: https://github.com/discourse/mini_racer/tree/v0.6.0
131
+ changelog_uri: https://github.com/discourse/mini_racer/blob/v0.6.2/CHANGELOG
132
+ documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.6.2
133
+ source_code_uri: https://github.com/discourse/mini_racer/tree/v0.6.2
134
134
  post_install_message:
135
135
  rdoc_options: []
136
136
  require_paths: