diff options
-rw-r--r-- | bootstraptest/test_ractor.rb | 50 | ||||
-rw-r--r-- | ractor.c | 10 |
2 files changed, 43 insertions, 17 deletions
diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index 4b6afc2c53..9cfd42c5f4 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -8,6 +8,37 @@ assert_equal 'Ractor', %q{ Ractor.new{}.class } +# A Ractor can have a name +assert_equal 'test-name', %q{ + r = Ractor.new name: 'test-name' do + end + r.name +} + +# If Ractor doesn't have a name, Ractor#name returns nil. +assert_equal 'nil', %q{ + r = Ractor.new do + end + r.name.inspect +} + +# Raises exceptions if initialize with invalid name +assert_equal 'no implicit conversion of Array into String', %q{ + begin + r = Ractor.new(name: [{}]) {} + rescue TypeError => e + e.message + end +} + +assert_equal 'ASCII incompatible encoding (UTF-16BE)', %q{ + begin + r = Ractor.new(name: String.new('Invalid encoding', encoding: 'UTF-16BE')) {} + rescue ArgumentError => e + e.message + end +} + # Ractor.new must call with a block assert_equal "must be called with a block", %q{ begin @@ -263,7 +294,7 @@ assert_equal 'false', %q{ r = Ractor.new obj do |msg| msg.object_id end - + obj.object_id == r.take } @@ -360,7 +391,7 @@ assert_equal 'hello', %q{ str = r.take begin - r.take + r.take rescue Ractor::RemoteError str #=> "hello" end @@ -528,20 +559,6 @@ assert_equal '[1000, 3]', %q{ Ractor.new{ [A.size, H.size] }.take } -# A Ractor can have a name -assert_equal 'test-name', %q{ - r = Ractor.new name: 'test-name' do - end - r.name -} - -# If Ractor doesn't have a name, Ractor#name returns nil. -assert_equal 'nil', %q{ - r = Ractor.new do - end - r.name.inspect -} - ### ### Synchronization tests ### @@ -559,4 +576,3 @@ assert_equal "#{N}#{N}", %Q{ } end # if !ENV['GITHUB_WORKFLOW'] - @@ -1310,6 +1310,16 @@ ractor_init(rb_ractor_t *r, VALUE name, VALUE loc) rb_ractor_living_threads_init(r); // naming + if (!NIL_P(name)) { + rb_encoding *enc; + StringValueCStr(name); + enc = rb_enc_get(name); + if (!rb_enc_asciicompat(enc)) { + rb_raise(rb_eArgError, "ASCII incompatible encoding (%s)", + rb_enc_name(enc)); + } + name = rb_str_new_frozen(name); + } r->name = name; r->loc = loc; } |