aboutsummaryrefslogtreecommitdiffstats
path: root/spec/bundler/quality_spec.rb
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2019-08-19 00:42:29 -0400
committerAaron Patterson <tenderlove@github.com>2019-08-19 12:44:38 -0700
commitdc0e45e39b37556af8abf6cdb0180e2973041931 (patch)
tree62f0cd241244b1f80042f1ca328fcf17aca9bbfa /spec/bundler/quality_spec.rb
parent19b0161b851ba32d5bc6c367db5b520d35905d6b (diff)
downloadruby-dc0e45e39b37556af8abf6cdb0180e2973041931.tar.gz
Update moved objects in original_iseq
Without doing this, enabling a TracePoint on a method could lead to use of moved objects. This was found by running `env RUBY_ISEQ_DUMP_DEBUG=to_binary make test-all`, which sets orignal_iseq then runs the compaction tests and the tracepoint tests. Please excuse the lack of tests. I was not able to figure out how to reliably trigger a move on a specific iseq imemo to make a good regression test. To manually confirm the problem and this fix, you can run: ``` env RUBY_ISEQ_DUMP_DEBUG=to_binary make test-all \ TESTOPTS="test/ruby/test_gc_compact.rb \ test/gdbm/test_gdbm.rb \ test/ruby/test_settracefunc.rb" ``` Or the following script: ```ruby tp = TracePoint.new(:line) {} 1.times do # put it in a block to not keep these objects alive objects = 10_000.times.map { Object.new } objects.hash end 1.times do # this allocation pattern can realistically happen in an app # at load time beek = 10_000.times.map do eval(<<-RUBY) def foo a + b 1.times { 4 + 234234 } nil + 234 end RUBY Object.new Object.new end beek.hash end tp.enable(target: self.:foo) { 234 } # allocate original iseq GC.verify_compaction_references(toward: :empty) GC.compact tp.enable(target: self.:foo) { 234234 } # crash ``` [Bug #16098]
Diffstat (limited to 'spec/bundler/quality_spec.rb')
0 files changed, 0 insertions, 0 deletions