summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2023-06-06 10:21:29 -0400
committerGitHub <noreply@github.com>2023-06-06 10:21:29 -0400
commit2b54c135ff3ae2fb362a5efaa542ec9236116add (patch)
tree70b9cd6a1c282754da5a3cf82dd6a30d08eb76e8 /test
parent7577c101ed6452de3e72fadb43db595946acc701 (diff)
YJIT: Avoid identity-based known-class guards for IO objects (#7911)
`IO#reopen` is very special in that it is able to change the class and singleton class of IO instances. In its presence, it is not correct to assume that IO instances has a stable class/singleton class and guard by comparing identity.
Notes
Notes: Merged-By: maximecb <maximecb@ruby-lang.org>
Diffstat (limited to 'test')
-rw-r--r--test/ruby/test_yjit.rb12
1 files changed, 12 insertions, 0 deletions
diff --git a/test/ruby/test_yjit.rb b/test/ruby/test_yjit.rb
index 6700e58176..115c1902f0 100644
--- a/test/ruby/test_yjit.rb
+++ b/test/ruby/test_yjit.rb
@@ -1277,6 +1277,18 @@ class TestYJIT < Test::Unit::TestCase
RUBY
end
+ def test_io_reopen_clobbering_singleton_class
+ assert_compiles(<<~RUBY, result: [:ok, :ok])
+ def $stderr.to_i = :i
+
+ def test = $stderr.to_i
+
+ [test, test]
+ $stderr.reopen($stderr.dup)
+ [test, test].map { :ok unless _1 == :i }
+ RUBY
+ end
+
private
def code_gc_helpers