From df317151a5b4e0c5a30fcc321a9dc6abad63f7ed Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Wed, 24 Jul 2019 05:32:09 +0900 Subject: should not free local hook_list here. exec_hooks_postcheck() clean executed hook_list if it is needed. list_exec is freed if there are no events and this list is local event (connected to specific iseq). However, iseq keeps to point this local hook_list, freed list. To prevent this situation, do not free hook_list here even if it has no events. This issue is reported by @joker1007. https://twitter.com/joker1007/status/1153649170797830144 --- test/ruby/test_settracefunc.rb | 17 +++++++++++++++++ vm_trace.c | 3 --- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index cfc90f50b7..1f99d3ee88 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -2166,4 +2166,21 @@ class TestSetTraceFunc < Test::Unit::TestCase tp.enable {obj.example} assert ok, "return event should be emitted" end + + def test_disable_local_tracepoint_in_trace + assert_normal_exit <<-EOS + def foo + trace = TracePoint.new(:b_return){|tp| + tp.disable + } + trace.enable(target: method(:bar)) + end + def bar + 100.times{|i| + foo; foo + } + end + bar + EOS + end end diff --git a/vm_trace.c b/vm_trace.c index da68a0a8de..ac7550d7e9 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -198,9 +198,6 @@ clean_hooks(const rb_execution_context_t *ec, rb_hook_list_t *list) } else { /* local events */ - if (list->events == 0) { - ruby_xfree(list); - } } } -- cgit v1.2.3