From f00de0139b5a811e2e4f79c5f7cd2a402112da2b Mon Sep 17 00:00:00 2001 From: Artem Udovichenko Date: Fri, 5 Aug 2022 17:43:13 +0300 Subject: [PATCH] Sweep programs Remove an element from EcmaVM::pandaFileWithProgram_ array when a non-movable program object gets reclaimed. Also don't delete the corresponding panda file becuase it leads to double free. The ClassLinker is owner of panda file. --- runtime/ecma_vm.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/runtime/ecma_vm.cpp b/runtime/ecma_vm.cpp index 405fc815f..969c9c3ba 100644 --- a/runtime/ecma_vm.cpp +++ b/runtime/ecma_vm.cpp @@ -560,6 +560,12 @@ void EcmaVM::SweepVmRefs(const GCObjectVisitor &gc_object_visitor) ++it; } } + ProcessPrograms([gc_object_visitor](TaggedObject *obj) -> TaggedObject * { + if (gc_object_visitor(obj) == ObjectStatus::DEAD_OBJECT) { + return nullptr; + } + return obj; + }); } JSHandle EcmaVM::GetGlobalEnv() const @@ -812,7 +818,6 @@ void EcmaVM::ProcessPrograms(const WeakRootVisitor &v0) object->FreeMethodData(); auto pf = std::get<1>(*iter); extractorCache_.erase(pf); - delete pf; iter = pandaFileWithProgram_.erase(iter); } else if (fwd != object) { *iter = std::make_tuple(reinterpret_cast(fwd), std::get<1>(*iter), -- Gitee