🤖

[Bug #20606] 文字列や Symbol 以外でスレッドの情報を参照するときのバグ報告

2024/07/06に公開

[Bug #20606] Thread#thread_variable_get, Thread#thread_variable? and Thread#[] methods handle non-String/Symbol parameter values differently

  • 次のようにスレッドが保持する情報に対してアクセスするメソッドがいくつかある
t = Thread.new {}.join

# こっちはスレッドローカル変数
t.thread_variable_set(:a, 42)
p t.thread_variable?(:a)      # => false
p t.thread_variable_get(:a)   # => 42

# こっちはスレッド固有の情報
t[:a] = "hoge"
p t[:a]   # => "hoge"
  • このときに文字列や Symbol 以外で値を参照しようとしたときの挙動が異なるというバグ報告
t = Thread.new {}.join

# こっちは例外にならずに値を返す
p t.thread_variable?(123)      # => false
p t.thread_variable_get(123)   # => nil

# こっちは例外になる
# error: `[]': 123 is not a symbol nor a string (TypeError)
t[123]
  • ただし、スレッドローカル変数が設定されている場合は #thread_variable? #thread_variable_getTypeError が発生します
t = Thread.new {}.join

t.thread_variable_set(:a, 42)

# 何かしら変数が設定されている場合は以下2つもエラーになる
# error: 123 is not a symbol (TypeError)
p t.thread_variable?(123)
p t.thread_variable_get(123)
  • これは Ruby 3.4 では #thread_variable? #thread_variable_getTypeError が発生するように修正されました
GitHubで編集を提案

Discussion