mini_racer 0.6.1 → 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: 5d56d838af805799a79c79077af28cd6f141a236407b974d74fb2a9b9ccc012a
4
- data.tar.gz: 930da203d2f0a9370a586f838cde68306fa3de03bb1114d887426457277c4682
3
+ metadata.gz: e832863760637f983976194ebef263d8815c149d48ff26c7200367ab33640dda
4
+ data.tar.gz: 7c1c393ae6403a75d2a413395d56e7d5f3affe706b81c121273b4c6b5d471bf4
5
5
  SHA512:
6
- metadata.gz: caa253f750407e8bb4500105dcbe4318eafc8bf8bdf3dd4727efe5540fd273bd8e97d4f4f235b3d4c58e318687a255e88881c0dfe2b47ab67c91bfe801c8741a
7
- data.tar.gz: 6dd05e37d3fc792f8f0b3e417023a0fd8e5dc3322a03528ac0b474b603a5d0a3551f791b57b83332ca24ea6596795ee9aaafa9e0d40e5f80e833a02e22ee3038
6
+ metadata.gz: 4504cb3a564e5b311b65de74bac321b058995af17df47f9f3dc01fcb589a87eebfda55497e0ddb135a2ab15ef1818760652561d434d3f497c0dbd036451934c6
7
+ data.tar.gz: b83df123a61092ab4041212bb6e4f15b276d5e32e8be8d2b5cbc014988b8cf20ed0e0b3b30595de53ca4c0d599a86112d695009cda13891fe177742aff7d911e
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
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
 
3
13
  - 0.6.1
@@ -18,7 +28,6 @@
18
28
  - Fixes issues on aarch (Apple M1)
19
29
  - Update to use libv8-node 16.x (#210) [Loic Nageleisen]
20
30
  - FEATURE: Configurable max marshal stack depth (#202) [seanmakesgames]
21
- - FEATURE: Configurable max marshal stack depth (#202) [seanmakesgames]
22
31
  - Ruby 2.3 and 2.4 are EOL, we no longer support them
23
32
 
24
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
  }
@@ -409,28 +418,32 @@ static void prepare_result(MaybeLocal<Value> v8res,
409
418
  Local<Value> local_value = v8res.ToLocalChecked();
410
419
  if ((local_value->IsObject() || local_value->IsArray()) &&
411
420
  !local_value->IsDate() && !local_value->IsFunction()) {
412
- Local<Object> JSON = context->Global()->Get(
413
- context, String::NewFromUtf8Literal(isolate, "JSON"))
414
- .ToLocalChecked().As<Object>();
415
-
416
- Local<Function> stringify = JSON->Get(
417
- context, v8::String::NewFromUtf8Literal(isolate, "stringify"))
418
- .ToLocalChecked().As<Function>();
419
-
420
- Local<Object> object = local_value->ToObject(context).ToLocalChecked();
421
- const unsigned argc = 1;
422
- Local<Value> argv[argc] = { object };
423
- MaybeLocal<Value> json = stringify->Call(context, JSON, argc, argv);
421
+ MaybeLocal<v8::Value> ml = context->Global()->Get(
422
+ context, String::NewFromUtf8Literal(isolate, "JSON"));
424
423
 
425
- if (json.IsEmpty()) {
424
+ if (ml.IsEmpty()) { // exception
426
425
  evalRes.executed = false;
427
426
  } else {
428
- evalRes.json = true;
429
- Persistent<Value>* persistent = new Persistent<Value>();
430
- persistent->Reset(isolate, json.ToLocalChecked());
431
- 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
+ }
432
446
  }
433
-
434
447
  } else {
435
448
  Persistent<Value>* persistent = new Persistent<Value>();
436
449
  persistent->Reset(isolate, local_value);
@@ -711,7 +724,7 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, Local<Context> context,
711
724
  case T_FLOAT:
712
725
  return scope.Escape(Number::New(isolate, NUM2DBL(value)));
713
726
  case T_STRING:
714
- 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());
715
728
  case T_NIL:
716
729
  return scope.Escape(Null(isolate));
717
730
  case T_TRUE:
@@ -739,7 +752,7 @@ static Local<Value> convert_ruby_to_v8(Isolate* isolate, Local<Context> context,
739
752
  return scope.Escape(object);
740
753
  case T_SYMBOL:
741
754
  value = rb_funcall(value, rb_intern("to_s"), 0);
742
- 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());
743
756
  case T_DATA:
744
757
  klass = rb_funcall(value, rb_intern("class"), 0);
745
758
  if (klass == rb_cTime || klass == rb_cDateTime)
@@ -1057,7 +1070,7 @@ static VALUE convert_result_to_ruby(VALUE self /* context */,
1057
1070
  // a v8 scope, if we do the scope is never cleaned up properly and we leak
1058
1071
  if (!result.parsed) {
1059
1072
  if(TYPE(message) == T_STRING) {
1060
- rb_raise(rb_eParseError, "%s", RSTRING_PTR(message));
1073
+ rb_raise(rb_eParseError, "%" PRIsVALUE, message);
1061
1074
  } else {
1062
1075
  rb_raise(rb_eParseError, "Unknown JavaScript Error during parse");
1063
1076
  }
@@ -1081,15 +1094,17 @@ static VALUE convert_result_to_ruby(VALUE self /* context */,
1081
1094
 
1082
1095
  // exception report about what happened
1083
1096
  if (TYPE(backtrace) == T_STRING) {
1084
- rb_raise(ruby_exception, "%s", RSTRING_PTR(backtrace));
1097
+ rb_raise(ruby_exception, "%" PRIsVALUE, backtrace);
1085
1098
  } else if(TYPE(message) == T_STRING) {
1086
- rb_raise(ruby_exception, "%s", RSTRING_PTR(message));
1099
+ rb_raise(ruby_exception, "%" PRIsVALUE, message);
1087
1100
  } else {
1088
1101
  rb_raise(ruby_exception, "Unknown JavaScript Error during execution");
1089
1102
  }
1103
+ } else if (rb_obj_is_kind_of(ruby_exception, rb_eException)) {
1104
+ rb_exc_raise(ruby_exception);
1090
1105
  } else {
1091
1106
  VALUE rb_str = rb_funcall(ruby_exception, rb_intern("to_s"), 0);
1092
- rb_raise(CLASS_OF(ruby_exception), "%s", RSTRING_PTR(rb_str));
1107
+ rb_raise(CLASS_OF(ruby_exception), "%" PRIsVALUE, rb_str);
1093
1108
  }
1094
1109
  }
1095
1110
 
@@ -1149,13 +1164,13 @@ static VALUE rb_context_eval_unsafe(VALUE self, VALUE str, VALUE filename) {
1149
1164
  HandleScope handle_scope(isolate);
1150
1165
 
1151
1166
  Local<String> eval = String::NewFromUtf8(isolate, RSTRING_PTR(str),
1152
- NewStringType::kNormal, (int)RSTRING_LEN(str)).ToLocalChecked();
1167
+ NewStringType::kNormal, RSTRING_LENINT(str)).ToLocalChecked();
1153
1168
 
1154
1169
  Local<String> local_filename;
1155
1170
 
1156
1171
  if (filename != Qnil) {
1157
1172
  local_filename = String::NewFromUtf8(isolate, RSTRING_PTR(filename),
1158
- NewStringType::kNormal, (int)RSTRING_LEN(filename)).ToLocalChecked();
1173
+ NewStringType::kNormal, RSTRING_LENINT(filename)).ToLocalChecked();
1159
1174
  eval_params.filename = &local_filename;
1160
1175
  } else {
1161
1176
  eval_params.filename = NULL;
@@ -1279,8 +1294,8 @@ gvl_ruby_callback(void* data) {
1279
1294
  VALUE callback_data_value = (VALUE)&callback_data;
1280
1295
 
1281
1296
  // TODO: use rb_vrescue2 in Ruby 2.7 and above
1282
- result = rb_rescue2(protected_callback, callback_data_value,
1283
- 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);
1284
1299
 
1285
1300
  if(callback_data.failed) {
1286
1301
  rb_iv_set(parent, "@current_exception", result);
@@ -1341,7 +1356,7 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
1341
1356
 
1342
1357
  Local<String> v8_str =
1343
1358
  String::NewFromUtf8(isolate, RSTRING_PTR(name),
1344
- NewStringType::kNormal, (int)RSTRING_LEN(name))
1359
+ NewStringType::kNormal, RSTRING_LENINT(name))
1345
1360
  .ToLocalChecked();
1346
1361
 
1347
1362
  // Note that self (rb_cExternalFunction) is a pure Ruby T_OBJECT,
@@ -1361,7 +1376,7 @@ static VALUE rb_external_function_notify_v8(VALUE self) {
1361
1376
  Local<String> eval =
1362
1377
  String::NewFromUtf8(isolate, RSTRING_PTR(parent_object_eval),
1363
1378
  NewStringType::kNormal,
1364
- (int)RSTRING_LEN(parent_object_eval))
1379
+ RSTRING_LENINT(parent_object_eval))
1365
1380
  .ToLocalChecked();
1366
1381
 
1367
1382
  MaybeLocal<Script> parsed_script = Script::Compile(context, eval);
@@ -1820,23 +1835,15 @@ static VALUE rb_context_call_unsafe(int argc, VALUE *argv, VALUE self) {
1820
1835
  if (val.IsEmpty() || !val.ToLocalChecked()->IsFunction()) {
1821
1836
  missingFunction = true;
1822
1837
  } else {
1823
-
1824
1838
  Local<v8::Function> fun = Local<v8::Function>::Cast(val.ToLocalChecked());
1839
+ VALUE tmp;
1825
1840
  call.fun = fun;
1826
- int fun_argc = call.argc;
1827
-
1828
- if (fun_argc > 0) {
1829
- call.argv = (v8::Local<Value> *) malloc(sizeof(void *) * fun_argc);
1830
- if (!call.argv) {
1831
- return Qnil;
1832
- }
1833
- for(int i=0; i < fun_argc; i++) {
1834
- call.argv[i] = convert_ruby_to_v8(isolate, context, call_argv[i]);
1835
- }
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]);
1836
1844
  }
1837
1845
  rb_thread_call_without_gvl(nogvl_context_call, &call, unblock_function, &call);
1838
- free(call.argv);
1839
-
1846
+ RB_ALLOCV_END(tmp);
1840
1847
  }
1841
1848
  }
1842
1849
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniRacer
4
- VERSION = "0.6.1"
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.1
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: 2022-01-10 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.1/CHANGELOG
132
- documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.6.1
133
- source_code_uri: https://github.com/discourse/mini_racer/tree/v0.6.1
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: