From 5bf7dad232861b6108baf09bea91229ce8b05202 Mon Sep 17 00:00:00 2001 From: Jose Luis Salas Date: Sat, 30 Oct 2021 18:12:37 +0200 Subject: [PATCH 1/3] [ractor] shareable_constant_value: literal makes constants shareable between ractors --- .../fixtures/shareable_constant_value_magic_comment.rb | 9 +++++++++ language/ractor_spec.rb | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 language/fixtures/shareable_constant_value_magic_comment.rb create mode 100644 language/ractor_spec.rb diff --git a/language/fixtures/shareable_constant_value_magic_comment.rb b/language/fixtures/shareable_constant_value_magic_comment.rb new file mode 100644 index 0000000000..134c5e85fc --- /dev/null +++ b/language/fixtures/shareable_constant_value_magic_comment.rb @@ -0,0 +1,9 @@ +# shareable_constant_value: literal + +A = [1, 2] +H = {a: "a"} + +Ractor.new do + A + H +end.take diff --git a/language/ractor_spec.rb b/language/ractor_spec.rb new file mode 100644 index 0000000000..06998a9a88 --- /dev/null +++ b/language/ractor_spec.rb @@ -0,0 +1,9 @@ +require_relative '../spec_helper' + +describe "Magic comments" do + ruby_version_is "3.0" do + it 'makes constants shareable between ractors' do + ->() { ruby_exe(fixture(__FILE__, 'shareable_constant_value_magic_comment.rb'), options: '-W0')}.should_not raise_error + end + end +end From f99463c120f39f0fc481b933b7d5fbaf966bb2a3 Mon Sep 17 00:00:00 2001 From: Jose Luis Salas Date: Sat, 30 Oct 2021 21:25:00 +0200 Subject: [PATCH 2/3] [ractor] shareable_constant_value: add more magic_comment values and inline --- .../shareable_constant_value_magic_comment.rb | 2 +- language/ractor_spec.rb | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/language/fixtures/shareable_constant_value_magic_comment.rb b/language/fixtures/shareable_constant_value_magic_comment.rb index 134c5e85fc..c4116f8ab2 100644 --- a/language/fixtures/shareable_constant_value_magic_comment.rb +++ b/language/fixtures/shareable_constant_value_magic_comment.rb @@ -6,4 +6,4 @@ Ractor.new do A H -end.take +en.take diff --git a/language/ractor_spec.rb b/language/ractor_spec.rb index 06998a9a88..fde6d5497f 100644 --- a/language/ractor_spec.rb +++ b/language/ractor_spec.rb @@ -3,7 +3,31 @@ describe "Magic comments" do ruby_version_is "3.0" do it 'makes constants shareable between ractors' do - ->() { ruby_exe(fixture(__FILE__, 'shareable_constant_value_magic_comment.rb'), options: '-W0')}.should_not raise_error + -> { ruby_exe(fixture(__FILE__, 'shareable_constant_value_magic_comment.rb'), options: '-W0')}.should_not raise_error + end + + it 'makes constants shareable between ractors' do + a, b, c = Class.new.class_eval("#{<<~"begin;"}\n#{<<~'end;'}") + begin; + # shareable_constant_value: experimental_everything + A = [[1]] + # shareable_constant_value: none + B = [[2]] + # shareable_constant_value: literal + C = [["shareable", "constant#{nil}"]] + [A, B, C] + end; + Ractor.shareable?(a).should == true + Ractor.shareable?(b).should == false + Ractor.shareable?(c).should == true + end + + it 'raises an error whenn shared constant is not a literal' do + -> { Class.new.class_eval("#{<<~"begin;"}\n#{<<~'end;'}", /unshareable expression/) }.should raise_error + begin; + # shareable_constant_value: literal + C = ["Not " + "shareable"] + end; end end end From 3f5e9fdd4228a9717db8548b6d0b94c9cb7d3155 Mon Sep 17 00:00:00 2001 From: Jose Luis Salas Date: Sun, 30 Oct 2022 11:29:36 +0100 Subject: [PATCH 3/3] [ractor] Implement feedback when testing ractors --- .../shareable_constant_value_magic_comment.rb | 10 ++--- language/ractor_spec.rb | 39 ++++++++++++------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/language/fixtures/shareable_constant_value_magic_comment.rb b/language/fixtures/shareable_constant_value_magic_comment.rb index c4116f8ab2..5360c5faac 100644 --- a/language/fixtures/shareable_constant_value_magic_comment.rb +++ b/language/fixtures/shareable_constant_value_magic_comment.rb @@ -1,9 +1,9 @@ # shareable_constant_value: literal -A = [1, 2] -H = {a: "a"} +A = "rac" +H = "tor" Ractor.new do - A - H -en.take + print A + print H +end.take diff --git a/language/ractor_spec.rb b/language/ractor_spec.rb index fde6d5497f..d66ba62058 100644 --- a/language/ractor_spec.rb +++ b/language/ractor_spec.rb @@ -1,33 +1,42 @@ -require_relative '../spec_helper' +require_relative "../spec_helper" -describe "Magic comments" do +describe "magic comments in ractors" do ruby_version_is "3.0" do - it 'makes constants shareable between ractors' do - -> { ruby_exe(fixture(__FILE__, 'shareable_constant_value_magic_comment.rb'), options: '-W0')}.should_not raise_error + it "makes constants shareable between ractors" do + out = ruby_exe(fixture(__FILE__, "shareable_constant_value_magic_comment.rb"), options: "-W0") + out.should == "ractor" end - it 'makes constants shareable between ractors' do - a, b, c = Class.new.class_eval("#{<<~"begin;"}\n#{<<~'end;'}") - begin; + it "makes constants shareable between ractors" do + a, b, c = Class.new.class_eval(<<~RUBY, __FILE__, __LINE__ + 1) # shareable_constant_value: experimental_everything A = [[1]] # shareable_constant_value: none B = [[2]] # shareable_constant_value: literal - C = [["shareable", "constant#{nil}"]] + C = [["shareable", "constant#{self.class.name}"]] [A, B, C] - end; + RUBY Ractor.shareable?(a).should == true Ractor.shareable?(b).should == false Ractor.shareable?(c).should == true end - it 'raises an error whenn shared constant is not a literal' do - -> { Class.new.class_eval("#{<<~"begin;"}\n#{<<~'end;'}", /unshareable expression/) }.should raise_error - begin; - # shareable_constant_value: literal - C = ["Not " + "shareable"] - end; + context "when a shared constant is not a literal" do + it "raises an error when is computed" do + -> { Class.new.class_eval(<<~RUBY, __FILE__, __LINE__ + 1) }.should raise_error(Ractor::IsolationError, "cannot assign unshareable object to C") + # shareable_constant_value: literal + C = ["Not " + "shareable"] + RUBY + end + + it "raises an error when referencing a non-frozen variable" do + -> { Class.new.class_eval(<<~RUBY, __FILE__, __LINE__ + 1) }.should raise_error(Ractor::IsolationError, "cannot assign unshareable object to C") + # shareable_constant_value: literal + value = "value" + C = value + RUBY + end end end end