mini_racer 0.17.0.pre8 → 0.17.0.pre9

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: 6a4649daa0104376800784775a305593ff637dbde023f27ed6d9126b77c54548
4
- data.tar.gz: e46ffb00764e6113cef170508d8ed1ac4b68cab29ace1051fc7c5df4c7d97f07
3
+ metadata.gz: b3be215eb4d4e72b01480ffa28863ea7ff1947b3f8cf0b6dcd860ffde2e48799
4
+ data.tar.gz: adcae327e54c2c372871c255e4bfd19a07b28964cd4c7c51cbc1cc251d1f71db
5
5
  SHA512:
6
- metadata.gz: 38202ee576c23d016afd7b69ba9bada8ca47a82c3a460c028a42e25c23438f965e4ac2e8d6c4a24bea7211bed6436a9f2cc55bc4c9c0c42fd6b8e5054602c8f5
7
- data.tar.gz: e8da8f6787111b63e698db0964a9ad35ffe62c1acca83db7efa08cdb7db94d8d68ed39b989f81fd77b310fff510790d16454761f083bc5bd1154105f93c20f6f
6
+ metadata.gz: 98bdc234f17c0e16ae995c8fe3566f6ec80cbd92c569e4aa31ac1999d309ae2a197b0c7cb1c5de62f542f25b4f73287d0a34ab7967e1e24c32d02fc73ade33f2
7
+ data.tar.gz: 7ade32c683f240c3e19eaa58b6a044192f57b1e651966c042654d401f1f5dae1aff20d1c545dd7fd05afb2b0f70659080825b5a788ab82379b119c497ac31e47
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ - 0.17.0.pre9 - 13-01-2025
2
+ - For backwards compatibility convert v8 return values to UTF-8 (invalidly encoded string still get returned using V8 encoding)
3
+
1
4
  - 0.17.0.pre8 - 11-01-2025
2
5
  - Fix handling of UTF 32 LE and Ascii encoding strings - Ben Noordhuis
3
6
  - Handle rare edge case in V8 serialization - Ben Noordhuis
@@ -164,12 +164,6 @@ static VALUE js_function_class;
164
164
  static pthread_mutex_t flags_mtx = PTHREAD_MUTEX_INITIALIZER;
165
165
  static Buf flags; // protected by |flags_mtx|
166
166
 
167
- struct rendezvous_nogvl
168
- {
169
- Context *context;
170
- Buf *req, *res;
171
- };
172
-
173
167
  // arg == &(struct rendezvous_nogvl){...}
174
168
  static void *rendezvous_callback(void *arg);
175
169
 
@@ -184,16 +178,30 @@ typedef struct DesCtx
184
178
  {
185
179
  State *tos;
186
180
  VALUE refs; // array
181
+ uint8_t transcode_latin1:1;
187
182
  char err[64];
188
183
  State stack[512];
189
184
  } DesCtx;
190
185
 
186
+ struct rendezvous_nogvl
187
+ {
188
+ Context *context;
189
+ Buf *req, *res;
190
+ };
191
+
192
+ struct rendezvous_des
193
+ {
194
+ DesCtx *d;
195
+ Buf *res;
196
+ };
197
+
191
198
  static void DesCtx_init(DesCtx *c)
192
199
  {
193
200
  c->tos = c->stack;
194
201
  c->refs = rb_ary_new();
195
202
  *c->tos = (State){Qundef, Qundef};
196
203
  *c->err = '\0';
204
+ c->transcode_latin1 = 1; // convert to utf8
197
205
  }
198
206
 
199
207
  static void put(DesCtx *c, VALUE v)
@@ -321,9 +329,22 @@ static void des_string(void *arg, const char *s, size_t n)
321
329
  put(arg, rb_utf8_str_new(s, n));
322
330
  }
323
331
 
332
+ static VALUE str_encode_bang(VALUE v)
333
+ {
334
+ // TODO cache these? this function can get called often
335
+ return rb_funcall(v, rb_intern("encode!"), 1, rb_str_new_cstr("UTF-8"));
336
+ }
337
+
324
338
  static void des_string8(void *arg, const uint8_t *s, size_t n)
325
339
  {
326
- put(arg, rb_enc_str_new((char *)s, n, rb_ascii8bit_encoding()));
340
+ DesCtx *c;
341
+ VALUE v;
342
+
343
+ c = arg;
344
+ v = rb_enc_str_new((char *)s, n, rb_ascii8bit_encoding());
345
+ if (c->transcode_latin1)
346
+ v = str_encode_bang(v); // cannot fail
347
+ put(c, v);
327
348
  }
328
349
 
329
350
  // des_string16: |s| is not word aligned
@@ -331,7 +352,9 @@ static void des_string8(void *arg, const uint8_t *s, size_t n)
331
352
  static void des_string16(void *arg, const void *s, size_t n)
332
353
  {
333
354
  rb_encoding *e;
355
+ VALUE v, r;
334
356
  DesCtx *c;
357
+ int exc;
335
358
 
336
359
  c = arg;
337
360
  if (*c->err)
@@ -344,7 +367,15 @@ static void des_string16(void *arg, const void *s, size_t n)
344
367
  snprintf(c->err, sizeof(c->err), "no UTF16-LE encoding");
345
368
  return;
346
369
  }
347
- put(c, rb_enc_str_new((char *)s, n, e));
370
+ v = rb_enc_str_new((char *)s, n, e);
371
+ // JS strings can contain unmatched or illegal surrogate pairs
372
+ // that Ruby won't decode; return the string as-is in that case
373
+ r = rb_protect(str_encode_bang, v, &exc);
374
+ if (exc) {
375
+ rb_set_errinfo(Qnil);
376
+ r = v;
377
+ }
378
+ put(c, r);
348
379
  }
349
380
 
350
381
  // ruby doesn't really have a concept of a byte array so store it as
@@ -740,25 +771,25 @@ static void *v8_thread_start(void *arg)
740
771
  return NULL;
741
772
  }
742
773
 
743
- static VALUE deserialize1(const uint8_t *p, size_t n)
774
+ static VALUE deserialize1(DesCtx *d, const uint8_t *p, size_t n)
744
775
  {
745
776
  char err[64];
746
- DesCtx d;
747
777
 
748
- DesCtx_init(&d);
749
- if (des(&err, p, n, &d))
778
+ if (des(&err, p, n, d))
750
779
  rb_raise(runtime_error, "%s", err);
751
- if (d.tos != d.stack) // should not happen
780
+ if (d->tos != d->stack) // should not happen
752
781
  rb_raise(runtime_error, "parse stack not empty");
753
- return d.tos->a;
782
+ return d->tos->a;
754
783
  }
755
784
 
756
785
  static VALUE deserialize(VALUE arg)
757
786
  {
787
+ struct rendezvous_des *a;
758
788
  Buf *b;
759
789
 
760
- b = (void *)arg;
761
- return deserialize1(b->buf, b->len);
790
+ a = (void *)arg;
791
+ b = a->res;
792
+ return deserialize1(a->d, b->buf, b->len);
762
793
  }
763
794
 
764
795
  // called with |rr_mtx| and GVL held; can raise exception
@@ -767,6 +798,7 @@ static VALUE rendezvous_callback_do(VALUE arg)
767
798
  struct rendezvous_nogvl *a;
768
799
  VALUE func, args;
769
800
  Context *c;
801
+ DesCtx d;
770
802
  Buf *b;
771
803
 
772
804
  a = (void *)arg;
@@ -774,7 +806,8 @@ static VALUE rendezvous_callback_do(VALUE arg)
774
806
  c = a->context;
775
807
  assert(b->len > 0);
776
808
  assert(*b->buf == 'c');
777
- args = deserialize1(b->buf+1, b->len-1); // skip 'c' marker
809
+ DesCtx_init(&d);
810
+ args = deserialize1(&d, b->buf+1, b->len-1); // skip 'c' marker
778
811
  func = rb_ary_pop(args); // callback id
779
812
  func = rb_ary_entry(c->procs, FIX2LONG(func));
780
813
  return rb_funcall2(func, rb_intern("call"), RARRAY_LENINT(args), RARRAY_PTR(args));
@@ -866,14 +899,14 @@ static void rendezvous_no_des(Context *c, Buf *req, Buf *res)
866
899
 
867
900
  // send request to & receive reply from v8 thread; takes ownership of |req|
868
901
  // can raise exceptions and longjmp away but won't leak |req|
869
- static VALUE rendezvous(Context *c, Buf *req)
902
+ static VALUE rendezvous1(Context *c, Buf *req, DesCtx *d)
870
903
  {
871
904
  VALUE r;
872
905
  Buf res;
873
906
  int exc;
874
907
 
875
908
  rendezvous_no_des(c, req, &res); // takes ownership of |req|
876
- r = rb_protect(deserialize, (VALUE)&res, &exc);
909
+ r = rb_protect(deserialize, (VALUE)&(struct rendezvous_des){d, &res}, &exc);
877
910
  buf_reset(&res);
878
911
  if (exc) {
879
912
  r = rb_errinfo();
@@ -888,6 +921,14 @@ static VALUE rendezvous(Context *c, Buf *req)
888
921
  return r;
889
922
  }
890
923
 
924
+ static VALUE rendezvous(Context *c, Buf *req)
925
+ {
926
+ DesCtx d;
927
+
928
+ DesCtx_init(&d);
929
+ return rendezvous1(c, req, &d);
930
+ }
931
+
891
932
  static void handle_exception(VALUE e)
892
933
  {
893
934
  const char *s;
@@ -1469,6 +1510,7 @@ static VALUE snapshot_initialize(int argc, VALUE *argv, VALUE self)
1469
1510
  VALUE a, e, code, cv;
1470
1511
  Snapshot *ss;
1471
1512
  Context *c;
1513
+ DesCtx d;
1472
1514
  Ser s;
1473
1515
 
1474
1516
  TypedData_Get_Struct(self, Snapshot, &snapshot_type, ss);
@@ -1483,7 +1525,9 @@ static VALUE snapshot_initialize(int argc, VALUE *argv, VALUE self)
1483
1525
  ser_init1(&s, 'T');
1484
1526
  add_string(&s, code);
1485
1527
  // response is [arraybuffer, error]
1486
- a = rendezvous(c, &s.b);
1528
+ DesCtx_init(&d);
1529
+ d.transcode_latin1 = 0; // don't mangle snapshot binary data
1530
+ a = rendezvous1(c, &s.b, &d);
1487
1531
  e = rb_ary_pop(a);
1488
1532
  context_dispose(cv);
1489
1533
  if (*RSTRING_PTR(e))
@@ -1497,6 +1541,7 @@ static VALUE snapshot_warmup(VALUE self, VALUE arg)
1497
1541
  VALUE a, e, cv;
1498
1542
  Snapshot *ss;
1499
1543
  Context *c;
1544
+ DesCtx d;
1500
1545
  Ser s;
1501
1546
 
1502
1547
  TypedData_Get_Struct(self, Snapshot, &snapshot_type, ss);
@@ -1511,7 +1556,9 @@ static VALUE snapshot_warmup(VALUE self, VALUE arg)
1511
1556
  add_string(&s, arg);
1512
1557
  ser_array_end(&s, 2);
1513
1558
  // response is [arraybuffer, error]
1514
- a = rendezvous(c, &s.b);
1559
+ DesCtx_init(&d);
1560
+ d.transcode_latin1 = 0; // don't mangle snapshot binary data
1561
+ a = rendezvous1(c, &s.b, &d);
1515
1562
  e = rb_ary_pop(a);
1516
1563
  context_dispose(cv);
1517
1564
  if (*RSTRING_PTR(e))
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniRacer
4
- VERSION = "0.17.0.pre8"
4
+ VERSION = "0.17.0.pre9"
5
5
  LIBV8_NODE_VERSION = "~> 22.7.0.4"
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.17.0.pre8
4
+ version: 0.17.0.pre9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-11 00:00:00.000000000 Z
11
+ date: 2025-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -123,9 +123,9 @@ licenses:
123
123
  - MIT
124
124
  metadata:
125
125
  bug_tracker_uri: https://github.com/discourse/mini_racer/issues
126
- changelog_uri: https://github.com/discourse/mini_racer/blob/v0.17.0.pre8/CHANGELOG
127
- documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.17.0.pre8
128
- source_code_uri: https://github.com/discourse/mini_racer/tree/v0.17.0.pre8
126
+ changelog_uri: https://github.com/discourse/mini_racer/blob/v0.17.0.pre9/CHANGELOG
127
+ documentation_uri: https://www.rubydoc.info/gems/mini_racer/0.17.0.pre9
128
+ source_code_uri: https://github.com/discourse/mini_racer/tree/v0.17.0.pre9
129
129
  post_install_message:
130
130
  rdoc_options: []
131
131
  require_paths: