From ab15a98b2854563a30f111d93ef265f24d087dde Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Mon, 11 Jan 2021 15:07:01 -0800 Subject: [PATCH] Fix memory leaks in lambda capture/frame management --- src/Func.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Func.cc b/src/Func.cc index cdb680b1d9..8ab24d5eef 100644 --- a/src/Func.cc +++ b/src/Func.cc @@ -484,6 +484,8 @@ void ScriptFunc::CreateCaptures(Frame* f) // Create a private Frame to hold the values of captured variables, // and a mapping from those variables to their offsets in the Frame. + delete captures_frame; + delete captures_offset_mapping; captures_frame = new Frame(captures->size(), this, nullptr); captures_offset_mapping = new OffsetMap; @@ -497,10 +499,8 @@ void ScriptFunc::CreateCaptures(Frame* f) { if ( c->deep_copy || ! v->Modifiable() ) v = v->Clone(); - else - v->Ref(); - captures_frame->SetElement(offset, v); + captures_frame->SetElement(offset, std::move(v)); } (*captures_offset_mapping)[cid->Name()] = offset; @@ -513,6 +513,8 @@ void ScriptFunc::SetCaptures(Frame* f) auto captures = type->GetCaptures(); ASSERT(captures); + delete captures_frame; + delete captures_offset_mapping; captures_frame = f; captures_offset_mapping = new OffsetMap;