From c197d756517bcb8bfc1cd8512dcb3a440e381548 Mon Sep 17 00:00:00 2001 From: Artem Udovichenko Date: Wed, 9 Nov 2022 12:26:54 +0300 Subject: [PATCH] Treat EcmaVM::panda_file_with_program_lock_ as a GCRoot Change-Id: I4439968570a90062044041da2cd54a655a59df4c --- runtime/ecma_vm.cpp | 61 +++++++++++++-------------------------------- runtime/ecma_vm.h | 1 - 2 files changed, 17 insertions(+), 45 deletions(-) diff --git a/runtime/ecma_vm.cpp b/runtime/ecma_vm.cpp index ba6fee4b7..fe7e5bdd2 100644 --- a/runtime/ecma_vm.cpp +++ b/runtime/ecma_vm.cpp @@ -509,12 +509,6 @@ 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 @@ -646,8 +640,20 @@ void EcmaVM::AddPandaFile(const panda_file::File *pf, bool is_module) panda_file_with_program_.push_back(std::make_tuple(nullptr, pf, is_module)); } +#ifndef NDEBUG +static bool IsNonMovable(ObjectHeader *obj, EcmaVM *vm) +{ + mem::GCType gc_type = vm->GetGC()->GetType(); + if (gc_type == mem::GCType::EPSILON_GC || gc_type == mem::GCType::STW_GC) { + return true; + } + return PoolManager::GetMmapMemPool()->GetSpaceTypeForAddr(obj) == SpaceType::SPACE_TYPE_NON_MOVABLE_OBJECT; +} +#endif + void EcmaVM::SetProgram(Program *program, const panda_file::File *pf) { + ASSERT(IsNonMovable(program, this)); os::memory::LockHolder lock(panda_file_with_program_lock_); auto it = std::find_if(panda_file_with_program_.begin(), panda_file_with_program_.end(), [pf](auto entry) { return std::get<1>(entry) == pf; }); @@ -744,44 +750,6 @@ void EcmaVM::ProcessReferences(const WeakRootVisitor &v0) ++iter; } } - - ProcessPrograms(v0); - - // framework program - if (!framework_program_.IsHole()) { - auto fwd = v0(framework_program_.GetTaggedObject()); - if (fwd == nullptr) { - framework_program_ = JSTaggedValue::Undefined(); - } else if (fwd != framework_program_.GetTaggedObject()) { - framework_program_ = JSTaggedValue(fwd); - } - } -} - -void EcmaVM::ProcessPrograms(const WeakRootVisitor &v0) -{ - os::memory::LockHolder lock(panda_file_with_program_lock_); - // program vector - for (auto iter = panda_file_with_program_.begin(); iter != panda_file_with_program_.end();) { - auto object = std::get<0>(*iter); - if (object != nullptr) { - auto fwd = v0(object); - if (fwd == nullptr) { - object->FreeMethodData(); - auto pf = std::get<1>(*iter); - extractor_cache_.erase(pf); - iter = panda_file_with_program_.erase(iter); - } else if (fwd != object) { - *iter = std::make_tuple(reinterpret_cast(fwd), std::get<1>(*iter), - std::get<2>(*iter)); // 2: index - ++iter; - } else { - ++iter; - } - } else { - ++iter; - } - } } void EcmaVM::HandleEnqueueReferences() @@ -868,6 +836,11 @@ void EcmaVM::Iterate(const RootVisitor &v) v(Root::ROOT_VM, ObjectSlot(ToUintPtr(µ_job_queue_))); v(Root::ROOT_VM, ObjectSlot(ToUintPtr(&module_manager_->ecmaModules_))); v(Root::ROOT_VM, ObjectSlot(ToUintPtr(®exp_cache_))); + + os::memory::LockHolder lock(panda_file_with_program_lock_); + for (const auto &iter : panda_file_with_program_) { + v(Root::ROOT_VM, ObjectSlot(ToUintPtr(&std::get<0>(iter)))); + } } void EcmaVM::SetGlobalEnv(GlobalEnv *global) diff --git a/runtime/ecma_vm.h b/runtime/ecma_vm.h index 3b3da59ff..31f5de919 100644 --- a/runtime/ecma_vm.h +++ b/runtime/ecma_vm.h @@ -488,7 +488,6 @@ private: Method *GetNativeMethodWrapper(); void LoadEcmaStdLib(); const panda_file::File *GetLastLoadedPandaFile(); - void ProcessPrograms(const WeakRootVisitor &v0); NO_MOVE_SEMANTIC(EcmaVM); NO_COPY_SEMANTIC(EcmaVM); -- Gitee