mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
![ko1](/assets/img/avatar_default.png)
* vm_backtrace.c (rb_debug_inspector_open): escape all env using `rb_vm_stack_to_heap()` before making bindings. [Bug #15105] There is a complicated story of this issue: Without this patch, IFUNC frame does not escaped. A IFUNC frame points to CFUNC ep as previous ep. However, CFUNC ep can be escaped because of making bindings of Ruby level frames. IFUNC's ep can points to invalidated ep and `rb_iter_break()` will fail. This is why `any?` fails. * test/-ext-/debug/test_debug.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64800 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
75 lines
1.7 KiB
Ruby
75 lines
1.7 KiB
Ruby
# frozen_string_literal: false
|
|
require 'test/unit'
|
|
require '-test-/debug'
|
|
|
|
class TestDebug < Test::Unit::TestCase
|
|
|
|
def binds_check(binds, msg = nil)
|
|
count = Hash.new(0)
|
|
assert_instance_of(Array, binds, msg)
|
|
binds.each{|(_self, bind, klass, iseq, loc)|
|
|
if _self == self
|
|
count[:self] += 1
|
|
end
|
|
|
|
if bind
|
|
assert_instance_of(Binding, bind, msg)
|
|
count[:bind] += 1
|
|
end
|
|
|
|
if klass
|
|
assert(klass.instance_of?(Module) || klass.instance_of?(Class), msg)
|
|
count[:class] += 1
|
|
end
|
|
|
|
if iseq
|
|
count[:iseq] += 1
|
|
assert_instance_of(RubyVM::InstructionSequence, iseq, msg)
|
|
|
|
# check same location
|
|
assert_equal(loc.path, iseq.path, msg)
|
|
assert_equal(loc.absolute_path, iseq.absolute_path, msg)
|
|
assert_equal(loc.label, iseq.label, msg)
|
|
assert_operator(loc.lineno, :>=, iseq.first_lineno, msg)
|
|
end
|
|
|
|
assert_instance_of(Thread::Backtrace::Location, loc, msg)
|
|
|
|
}
|
|
assert_operator(0, :<, count[:self], msg)
|
|
assert_operator(0, :<, count[:bind], msg)
|
|
assert_operator(0, :<, count[:iseq], msg)
|
|
assert_operator(0, :<, count[:class], msg)
|
|
end
|
|
|
|
def test_inspector_open
|
|
binds = Bug::Debug.inspector
|
|
binds_check binds
|
|
end
|
|
|
|
def inspector_in_eval
|
|
eval("Bug::Debug.inspector")
|
|
end
|
|
|
|
def test_inspector_open_in_eval
|
|
bug7635 = '[ruby-core:51640]'
|
|
binds = inspector_in_eval
|
|
binds_check binds, bug7635
|
|
end
|
|
|
|
class MyRelation
|
|
include Enumerable
|
|
|
|
def each
|
|
yield :each_entry
|
|
end
|
|
end
|
|
|
|
def test_lazy_block
|
|
x = MyRelation.new.any? do
|
|
Bug::Debug.inspector
|
|
true
|
|
end
|
|
assert_equal true, x, '[Bug #15105]'
|
|
end
|
|
end
|