Skip to content

Frozen Struct can be modified #3850

Closed
Closed
@nevans

Description

@nevans

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions