From 126be06fafc2b442c1d21146d80a4dd80ea6a7bc Mon Sep 17 00:00:00 2001 From: Petrov Igor Date: Mon, 5 Dec 2022 18:22:56 +0300 Subject: [PATCH] [MM] Add dump for dynamic object Signed-off-by: Petrov Igor --- runtime/dump.cpp | 12 ++++++++++++ runtime/ecma_vm.cpp | 11 +++++++++++ runtime/ecma_vm.h | 2 ++ 3 files changed, 25 insertions(+) diff --git a/runtime/dump.cpp b/runtime/dump.cpp index d28a3129e..581bbb548 100644 --- a/runtime/dump.cpp +++ b/runtime/dump.cpp @@ -269,6 +269,12 @@ PandaString JSHClass::DumpJSType(JSType type) return "ClassInfoExtractor"; case JSType::JS_ARRAY_LIST: return "ArrayList"; + case JSType::FREE_OBJECT_WITH_NONE_FIELD: + return "FreeObjectWithNoneField"; + case JSType::FREE_OBJECT_WITH_ONE_FIELD: + return "FreeObjectWithOneField"; + case JSType::FREE_OBJECT_WITH_TWO_FIELD: + return "FreeObjectWithTwoField"; default: { PandaString ret = "unknown type "; return ret + static_cast(type); @@ -629,6 +635,12 @@ static void DumpObject(JSThread *thread, TaggedObject *obj, std::ostream &os) case JSType::JS_ARRAY_LIST: JSArrayList::Cast(obj)->Dump(thread, os); break; + case JSType::FREE_OBJECT_WITH_NONE_FIELD: + case JSType::FREE_OBJECT_WITH_ONE_FIELD: + case JSType::FREE_OBJECT_WITH_TWO_FIELD: + case JSType::INTERNAL_ACCESSOR: + // No additional info + break; default: UNREACHABLE(); break; diff --git a/runtime/ecma_vm.cpp b/runtime/ecma_vm.cpp index 99ee66d1c..f656e28f2 100644 --- a/runtime/ecma_vm.cpp +++ b/runtime/ecma_vm.cpp @@ -458,6 +458,17 @@ bool EcmaVM::ExecuteFromBuffer(const void *buffer, size_t size, std::string_view return Execute(std::move(pf), entry_point, args); } +void EcmaVM::DumpHeap(PandaOStringStream *o_str) const +{ + size_t obj_cnt = 0; + *o_str << "Dumping heap" << std::endl; + GetHeapManager()->GetObjectAllocator()->IterateOverObjects([&obj_cnt, &o_str](ObjectHeader *mem) { + JSTaggedValue(mem).Dump(nullptr, *o_str); + obj_cnt++; + }); + *o_str << "\nTotal dumped " << obj_cnt << std::endl; +} + tooling::ecmascript::PtJSExtractor *EcmaVM::GetDebugInfoExtractor(const panda_file::File *file) { tooling::ecmascript::PtJSExtractor *res = nullptr; diff --git a/runtime/ecma_vm.h b/runtime/ecma_vm.h index de611e467..a68988824 100644 --- a/runtime/ecma_vm.h +++ b/runtime/ecma_vm.h @@ -451,6 +451,8 @@ public: profiles_methods_.insert(method); } + void DumpHeap(PandaOStringStream *o_str) const final; + static constexpr size_t GetGlobalEnvOffset() { return MEMBER_OFFSET(EcmaVM, global_env_); -- Gitee