diff --git a/parse.y b/parse.y index ced7a8c86d..150fe795f8 100644 --- a/parse.y +++ b/parse.y @@ -5155,6 +5155,7 @@ lambda : tLAMBDA[lpar] nd_set_line(RNODE_LAMBDA($$)->nd_body, @body.end_pos.lineno); nd_set_line($$, @args.end_pos.lineno); nd_set_first_loc($$, @1.beg_pos); + xfree($body); } /*% ripper: lambda!($:args, $:body) %*/ numparam_pop(p, $numparam); diff --git a/test/ripper/test_ripper.rb b/test/ripper/test_ripper.rb index 070023b536..2b3421d827 100644 --- a/test/ripper/test_ripper.rb +++ b/test/ripper/test_ripper.rb @@ -187,6 +187,13 @@ end Ripper.parse("-> {") end end; + + # [Bug #21004] + assert_no_memory_leak(%w(-rripper), "", <<~RUBY, rss: true) + 1_000_000.times do + Ripper.parse("-> do it end") + end + RUBY end def test_sexp_no_memory_leak