🐷

[Bug #21187] Hash リテラルで がある場合に意図せず frozen されてしまうバグ報告

に公開

[Bug #21187] Strings concatenated with \ getting frozen with literal hashes (PRISM only)

  • 次のように Hash リテラルの値で \ を使った文字列の結合がある場合に Prism を使用していると意図せず文字列が frozen されてしまっているというバグ報告
x = {
  a: 'one' \
     'two',
  b: 'three' \
     'four',
  c: 'five',
  d: 'six' \
     'seven'
}

y = {
  a: 'one',
  b: 'two' \
     'three'
}

# x の定義で a と b がなぜか frozen になっている
puts "x = #{x.map { |k,v| {k => v.frozen?} }}"
# => x = [{a: true}, {b: true}, {c: false}, {d: false}]

# y はどちらも frozen ではない
puts "y = #{y.map { |k,v| {k => v.frozen?} }}"
# => y = [{a: false}, {b: false}]
  • parse.y の場合はすべて frozen されていない文字列になっている
  • これは Prism の最適化による影響みたいですね
  • この不具合は開発版の Ruby 3.5-dev で修正済み
x = {
  a: 'one' \
     'two',
  b: 'three' \
     'four',
  c: 'five',
  d: 'six' \
     'seven'
}

y = {
  a: 'one',
  b: 'two' \
     'three'
}

puts "x = #{x.map { |k,v| {k => v.frozen?} }}"
# Ruby 3.4 => x = [{a: true}, {b: true}, {c: false}, {d: false}]
# Ruby 3.5 => x = [{a: false}, {b: false}, {c: false}, {d: false}]

puts "y = #{y.map { |k,v| {k => v.frozen?} }}"
# Ruby 3.4 => b = [{a: false}, {b: false}]
# Ruby 3.5 => b = [{a: false}, {b: false}]
GitHubで編集を提案

Discussion