Closed
Description
It looks like TruffleRuby isn't fully freezing struct objects. Here's a script to demonstrate expected and actual behavior:
#!/usr/bin/env ruby
puts ?=*72
puts "Ruby Engine: #{RUBY_ENGINE} #{RUBY_ENGINE_VERSION}"
MyStruct = Struct.new(:a, :b)
struct = MyStruct.new(1, 2)
puts "Before freeze: %p" % [struct]
struct.freeze
puts "After freeze: %p" % [struct]
begin
struct.a = :wat?
struct.b = :how!
rescue FrozenError => err
puts "Modify error: %s" % [err]
end
puts "After attempt: %p" % [struct]
puts "Truly frozen?: %p" % [struct.frozen?]
__END__
$ ruby test.rb && RBENV_VERSION=truffleruby-24.2.0 ruby test.rb
========================================================================
Ruby Engine: ruby 3.4.2
Before freeze: #<struct MyStruct a=1, b=2>
After freeze: #<struct MyStruct a=1, b=2>
Modify error: can't modify frozen MyStruct: #<struct MyStruct a=1, b=2>
After attempt: #<struct MyStruct a=1, b=2>
Truly frozen?: true
========================================================================
Ruby Engine: truffleruby 24.2.0
Before freeze: #<struct MyStruct a=1, b=2>
After freeze: #<struct MyStruct a=1, b=2>
After attempt: #<struct MyStruct a=:wat?, b=:how!>
Truly frozen?: true