diff --git a/gc.c b/gc.c index caaf00c..321192b 100644 --- a/gc.c +++ b/gc.c @@ -4453,7 +4453,11 @@ rb_gc_disable(void) int old = dont_gc; dont_gc = TRUE; - return old ? Qtrue : Qfalse; + + if (rb_block_given_p()) + return rb_ensure(rb_yield, Qnil, rb_gc_enable, Qnil); + else + return old ? Qtrue : Qfalse; } void diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index b1e52fc..f371c09 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -48,6 +48,16 @@ class TestGc < Test::Unit::TestCase GC.enable end + def test_disable_with_block + GC.enable + GC.disable do + assert_equal(true, GC.disable) + end + assert_equal(false, GC.enable) + ensure + GC.enable + end + def test_count c = GC.count GC.start