From a74df67244199d1fd1f7a20b49dd5a096d2a13a2 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 3 Apr 2020 15:28:06 +0200 Subject: [PATCH] Fix ObjectSpace.trace_object_allocations_stop to not raise if the tracepoint were not initialized --- ext/objspace/object_tracing.c | 8 ++++++-- test/objspace/test_objspace.rb | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ext/objspace/object_tracing.c b/ext/objspace/object_tracing.c index b6ffca8bd3..4973a7535b 100644 --- a/ext/objspace/object_tracing.c +++ b/ext/objspace/object_tracing.c @@ -290,8 +290,12 @@ trace_object_allocations_stop(VALUE self) } if (arg->running == 0) { - rb_tracepoint_disable(arg->newobj_trace); - rb_tracepoint_disable(arg->freeobj_trace); + if (arg->newobj_trace != 0) { + rb_tracepoint_disable(arg->newobj_trace); + } + if (arg->freeobj_trace != 0) { + rb_tracepoint_disable(arg->freeobj_trace); + } } return Qnil; diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index e47917030a..40f1c73a51 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -164,6 +164,15 @@ class TestObjSpace < Test::Unit::TestCase end; end + def test_trace_object_allocations_stop_first + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + require "objspace" + # Make sure stoping before the tracepoints are initialized doesn't raise. See [Bug #17020] + ObjectSpace.trace_object_allocations_stop + end; + end + def test_trace_object_allocations ObjectSpace.trace_object_allocations_clear # clear object_table to get rid of erroneous detection for c0 Class.name