[Bug #22070] Fix segfault in Thread.each_caller_location

This commit is contained in:
Alexander Momchilov 2026-05-13 17:13:53 -04:00 committed by Jeremy Evans
parent 6a211f21e8
commit a3a2d461aa
Notes: git 2026-05-14 16:34:45 +00:00
2 changed files with 11 additions and 1 deletions

View File

@ -191,6 +191,16 @@ class TestBacktrace < Test::Unit::TestCase
assert_equal(cl.map(&:to_s), ary.map(&:to_s))
end
def test_each_caller_location_single_cfunc_frame
assert_normal_exit <<~'RUBY'
tap { Thread.each_caller_location(1, 1) { |loc| loc.label } }
RUBY
cl = nil; ary = []
tap { cl = caller_locations(1, 1); Thread.each_caller_location(1, 1) { |x| ary << x } }
assert_equal(cl.map(&:to_s), ary.map(&:to_s))
end
def test_caller_locations_first_label
def self.label
caller_locations.first.label

View File

@ -751,7 +751,7 @@ rb_ec_partial_backtrace_object(const rb_execution_context_t *ec, long start_fram
bt_backpatch_loc(backpatch_counter, loc, CFP_ISEQ(cfp), CFP_PC(cfp));
RB_OBJ_WRITTEN(btobj, Qundef, CFP_ISEQ(cfp));
if (do_yield) {
bt_yield_loc(loc - backpatch_counter, backpatch_counter, btobj);
bt_yield_loc(loc - backpatch_counter + 1, backpatch_counter, btobj);
}
break;
}