summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2020-09-17 09:43:32 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2020-10-16 11:28:52 -0700
commitff9dc109665e515da8b544a55085bb793063adf1 (patch)
treecf8ce7dd132761aeb4e0c4ca178e4b3a24f431c8
parent26e8db6b93019369b7fbb66bdd3bcf0decbbb8eb (diff)
keep proc on the stack so it does not move
-rw-r--r--ext/-test-/tracepoint/gc_hook.c3
-rw-r--r--test/-ext-/tracepoint/test_tracepoint.rb8
2 files changed, 6 insertions, 5 deletions
diff --git a/ext/-test-/tracepoint/gc_hook.c b/ext/-test-/tracepoint/gc_hook.c
index 54b469d..5fd46fa 100644
--- a/ext/-test-/tracepoint/gc_hook.c
+++ b/ext/-test-/tracepoint/gc_hook.c
@@ -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);
}
diff --git a/test/-ext-/tracepoint/test_tracepoint.rb b/test/-ext-/tracepoint/test_tracepoint.rb
index 79ba090..9d16796 100644
--- a/test/-ext-/tracepoint/test_tracepoint.rb
+++ b/test/-ext-/tracepoint/test_tracepoint.rb
@@ -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