1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

keep proc on the stack so it does not move

This commit is contained in:
Aaron Patterson 2020-09-17 09:43:32 -07:00
parent 26e8db6b93
commit ff9dc10966
No known key found for this signature in database
GPG key ID: 953170BCB4FFAFC6
2 changed files with 6 additions and 5 deletions

View file

@ -42,14 +42,12 @@ set_gc_hook(VALUE module, VALUE proc, rb_event_flag_t event, const char *tp_str,
{
VALUE tpval;
ID tp_key = rb_intern(tp_str);
ID proc_key = rb_intern(proc_str);
/* disable previous keys */
if (rb_ivar_defined(module, tp_key) != 0 &&
RTEST(tpval = rb_ivar_get(module, tp_key))) {
rb_tracepoint_disable(tpval);
rb_ivar_set(module, tp_key, Qnil);
rb_ivar_set(module, proc_key, Qnil);
}
if (RTEST(proc)) {
@ -59,7 +57,6 @@ set_gc_hook(VALUE module, VALUE proc, rb_event_flag_t event, const char *tp_str,
tpval = rb_tracepoint_new(0, event, gc_start_end_i, (void *)proc);
rb_ivar_set(module, tp_key, tpval);
rb_ivar_set(module, proc_key, proc); /* GC guard */
rb_tracepoint_enable(tpval);
}

View file

@ -62,9 +62,11 @@ class TestTracepointObj < Test::Unit::TestCase
bug8492 = '[ruby-dev:47400] [Bug #8492]: infinite after_gc_start_hook reentrance'
assert_nothing_raised(Timeout::Error, bug8492) do
assert_in_out_err(%w[-r-test-/tracepoint], <<-'end;', /\A[1-9]/, timeout: 2)
stress, GC.stress = GC.stress, false
count = 0
Bug.after_gc_start_hook = proc {count += 1}
hook = proc {count += 1}
def run(hook)
stress, GC.stress = GC.stress, false
Bug.after_gc_start_hook = hook
begin
GC.stress = true
3.times {Object.new}
@ -72,6 +74,8 @@ class TestTracepointObj < Test::Unit::TestCase
GC.stress = stress
Bug.after_gc_start_hook = nil
end
end
run(hook)
puts count
end;
end