ruby-changes:63364
From: Aaron <ko1@a...>
Date: Sat, 17 Oct 2020 03:29:28 +0900 (JST)
Subject: [ruby-changes:63364] ff9dc10966 (master): keep proc on the stack so it does not move
https://git.ruby-lang.org/ruby.git/commit/?id=ff9dc10966 From ff9dc109665e515da8b544a55085bb793063adf1 Mon Sep 17 00:00:00 2001 From: Aaron Patterson <tenderlove@r...> Date: Thu, 17 Sep 2020 09:43:32 -0700 Subject: keep proc on the stack so it does not move 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, https://github.com/ruby/ruby/blob/trunk/ext/-test-/tracepoint/gc_hook.c#L42 { 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, https://github.com/ruby/ruby/blob/trunk/ext/-test-/tracepoint/gc_hook.c#L57 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 https://github.com/ruby/ruby/blob/trunk/test/-ext-/tracepoint/test_tracepoint.rb#L62 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 https://github.com/ruby/ruby/blob/trunk/test/-ext-/tracepoint/test_tracepoint.rb#L74 GC.stress = stress Bug.after_gc_start_hook = nil end + end + run(hook) puts count end; end -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/