summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
authorSatoshi Tagomori <s-tagomori@sakura.ad.jp>2025-12-30 14:46:19 +0900
committerSatoshi Tagomori <tagomoris@gmail.com>2025-12-30 17:06:34 +0900
commitd5af8d785888f3af5efb844be5948df71d777b22 (patch)
tree7d2a6486521dc002366be17e8f6d94b49353d16b /test/ruby
parent65634d8df57ea1636efffb5f040fa31c156d307f (diff)
Box: allocate classes as boxable when it happens in the root box
Without this change, classes (including iclass) are allocated as un-boxable classes after initializing user boxes (after starting script evaluation). Under this situation, iclasses are created as un-boxabled class when core modules are included by a class in the root box, then it causes problems because it's in the root box but it can't have multiple classexts. This change makes it possible to allocate boxable classes even after initializing user boxes. Classes create in the root box will be boxable, and those can have 2 or more classexts.
Diffstat (limited to 'test/ruby')
-rw-r--r--test/ruby/test_box.rb16
1 files changed, 16 insertions, 0 deletions
diff --git a/test/ruby/test_box.rb b/test/ruby/test_box.rb
index 28c9dd02b0..763f6148cb 100644
--- a/test/ruby/test_box.rb
+++ b/test/ruby/test_box.rb
@@ -855,4 +855,20 @@ class TestBox < Test::Unit::TestCase
assert_empty(Dir.children(tmpdir))
end
end
+
+ def test_root_box_iclasses_should_be_boxable
+ assert_separately([ENV_ENABLE_BOX], __FILE__, __LINE__, "#{<<~"begin;"}\n#{<<~'end;'}", ignore_stderr: true)
+ begin;
+ Ruby::Box.root.eval("class IMath; include Math; end") # (*)
+ module Math
+ def foo = :foo
+ end
+ # This test crashes here if iclasses (created at the line (*) is not boxable)
+ class IMath2; include Math; end
+ assert_equal :foo, IMath2.new.foo
+ assert_raise NoMethodError do
+ Ruby::Box.root.eval("IMath.new.foo")
+ end
+ end;
+ end
end