From 263d09990a568845d3b1a1d295703c865fcb6e5c Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Fri, 3 Jan 2025 10:26:48 -0500 Subject: [PATCH] Add C extension spec for rb_undefine_finalizer --- optional/capi/ext/finalizer_spec.c | 5 +++++ optional/capi/finalizer_spec.rb | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/optional/capi/ext/finalizer_spec.c b/optional/capi/ext/finalizer_spec.c index fd5fb017c..83347da91 100644 --- a/optional/capi/ext/finalizer_spec.c +++ b/optional/capi/ext/finalizer_spec.c @@ -9,10 +9,15 @@ static VALUE define_finalizer(VALUE self, VALUE obj, VALUE finalizer) { return rb_define_finalizer(obj, finalizer); } +static VALUE undefine_finalizer(VALUE self, VALUE obj) { + return rb_undefine_finalizer(obj); +} + void Init_finalizer_spec(void) { VALUE cls = rb_define_class("CApiFinalizerSpecs", rb_cObject); rb_define_method(cls, "rb_define_finalizer", define_finalizer, 2); + rb_define_method(cls, "rb_undefine_finalizer", undefine_finalizer, 1); } #ifdef __cplusplus diff --git a/optional/capi/finalizer_spec.rb b/optional/capi/finalizer_spec.rb index d57167adc..162e8ea69 100644 --- a/optional/capi/finalizer_spec.rb +++ b/optional/capi/finalizer_spec.rb @@ -20,4 +20,21 @@ ruby_exe(code).should == "finalizer run\n" end end + + describe "rb_undefine_finalizer" do + ruby_bug "#20981", "3.4.0"..."3.4.2" do + it "removes finalizers from the object" do + code = <<~RUBY + require #{extension_path.dump} + + obj = Object.new + finalizer = Proc.new { puts "finalizer run" } + ObjectSpace.define_finalizer(obj, finalizer) + CApiFinalizerSpecs.new.rb_undefine_finalizer(obj) + RUBY + + ruby_exe(code).should.empty? + end + end + end end