diff options
-rw-r--r-- | test/ruby/test_variable.rb | 15 | ||||
-rw-r--r-- | variable.c | 1 |
2 files changed, 16 insertions, 0 deletions
diff --git a/test/ruby/test_variable.rb b/test/ruby/test_variable.rb index 9acba39f40..1e51ce060a 100644 --- a/test/ruby/test_variable.rb +++ b/test/ruby/test_variable.rb @@ -155,6 +155,21 @@ class TestVariable < Test::Unit::TestCase end end + def test_set_class_variable_on_frozen_object + set_cvar = EnvUtil.labeled_class("SetCVar") + set_cvar.class_eval "#{<<~"begin;"}\n#{<<~'end;'}" + begin; + def self.set(val) + @@a = val # inline cache + end + end; + set_cvar.set(1) # fill write cache + set_cvar.freeze + assert_raise(FrozenError) do + set_cvar.set(2) # hit write cache, but should check frozen status + end + end + def test_variable assert_instance_of(Integer, $$) diff --git a/variable.c b/variable.c index f297900cf0..f1d89ab615 100644 --- a/variable.c +++ b/variable.c @@ -3939,6 +3939,7 @@ rb_class_ivar_set(VALUE obj, ID key, VALUE value) { RUBY_ASSERT(RB_TYPE_P(obj, T_CLASS) || RB_TYPE_P(obj, T_MODULE)); int found; + rb_check_frozen(obj); RB_VM_LOCK_ENTER(); { |