[前][次][番号順一覧][スレッド一覧]

ruby-changes:64414

From: Kenta <ko1@a...>
Date: Mon, 21 Dec 2020 22:11:25 +0900 (JST)
Subject: [ruby-changes:64414] 14d7d1df25 (master): [json] Make json Ractor safe

https://git.ruby-lang.org/ruby.git/commit/?id=14d7d1df25

From 14d7d1df25bbefadfc385042d541b4afc31e4c1b Mon Sep 17 00:00:00 2001
From: Kenta Murata <mrkn@m...>
Date: Mon, 21 Dec 2020 15:57:42 +0900
Subject: [json] Make json Ractor safe


diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index 2e802c8..407c1af 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -619,13 +619,18 @@ static size_t State_memsize(const void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/json/generator/generator.c#L619
     return size;
 }
 
+#ifndef HAVE_RB_EXT_RACTOR_SAFE
+#   undef RUBY_TYPED_FROZEN_SHAREABLE
+#   define RUBY_TYPED_FROZEN_SHAREABLE 0
+#endif
+
 #ifdef NEW_TYPEDDATA_WRAPPER
 static const rb_data_type_t JSON_Generator_State_type = {
     "JSON/Generator/State",
     {NULL, State_free, State_memsize,},
 #ifdef RUBY_TYPED_FREE_IMMEDIATELY
     0, 0,
-    RUBY_TYPED_FREE_IMMEDIATELY,
+    RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
 #endif
 };
 #endif
@@ -1497,6 +1502,10 @@ static VALUE cState_buffer_initial_length_set(VALUE self, VALUE buffer_initial_l https://github.com/ruby/ruby/blob/trunk/ext/json/generator/generator.c#L1502
  */
 void Init_generator(void)
 {
+#ifdef HAVE_RB_EXT_RACTOR_SAFE
+    rb_ext_ractor_safe(true);
+#endif
+
 #undef rb_intern
     rb_require("json/common");
 
diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index f997295..29b5674 100644
--- a/ext/json/parser/parser.c
+++ b/ext/json/parser/parser.c
@@ -2119,6 +2119,10 @@ static VALUE cParser_source(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/json/parser/parser.c#L2119
 
 void Init_parser(void)
 {
+#ifdef HAVE_RB_EXT_RACTOR_SAFE
+    rb_ext_ractor_safe(true);
+#endif
+
 #undef rb_intern
     rb_require("json/common");
     mJSON = rb_define_module("JSON");
diff --git a/ext/json/parser/parser.rl b/ext/json/parser/parser.rl
index 24aed60..1da70c5 100644
--- a/ext/json/parser/parser.rl
+++ b/ext/json/parser/parser.rl
@@ -879,6 +879,10 @@ static VALUE cParser_source(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/json/parser/parser.rl#L879
 
 void Init_parser(void)
 {
+#ifdef HAVE_RB_EXT_RACTOR_SAFE
+    rb_ext_ractor_safe(true);
+#endif
+
 #undef rb_intern
     rb_require("json/common");
     mJSON = rb_define_module("JSON");
diff --git a/test/json/ractor_test.rb b/test/json/ractor_test.rb
new file mode 100644
index 0000000..96d1528
--- /dev/null
+++ b/test/json/ractor_test.rb
@@ -0,0 +1,34 @@ https://github.com/ruby/ruby/blob/trunk/test/json/ractor_test.rb#L1
+# encoding: utf-8
+# frozen_string_literal: false
+
+require 'test_helper'
+
+class JSONInRactorTest < Test::Unit::TestCase
+  def setup
+    skip unless defined? Ractor
+  end
+
+  def test_generate
+    assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
+    begin;
+      $VERBOSE = nil
+      require "json"
+      r = Ractor.new do
+        json = JSON.generate({
+          'a' => 2,
+          'b' => 3.141,
+          'c' => 'c',
+          'd' => [ 1, "b", 3.14 ],
+          'e' => { 'foo' => 'bar' },
+          'g' => "\"\0\037",
+          'h' => 1000.0,
+          'i' => 0.001
+        })
+        JSON.parse(json)
+      end
+      expected_json = '{"a":2,"b":3.141,"c":"c","d":[1,"b",3.14],"e":{"foo":"bar"},' +
+                      '"g":"\\"\\u0000\\u001f","h":1000.0,"i":0.001}'
+      assert_equal(JSON.parse(expected_json), r.take)
+    end;
+  end
+end
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]