1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef PANDA_RUNTIME_MEM_OBJECT_HELPERS_H_ 17 #define PANDA_RUNTIME_MEM_OBJECT_HELPERS_H_ 18 19 #include <functional> 20 21 #include "runtime/include/coretypes/tagged_value.h" 22 #include "libpandafile/file_items.h" 23 #include "runtime/include/language_config.h" 24 #include "runtime/include/mem/panda_string.h" 25 #include "runtime/object_header_config.h" 26 #include "libpandabase/utils/logger.h" 27 28 namespace panda { 29 class Class; 30 class Field; 31 class ManagedThread; 32 class ObjectHeader; 33 class PandaVM; 34 } // namespace panda 35 36 namespace panda::coretypes { 37 class DynClass; 38 } // namespace panda::coretypes 39 40 namespace panda::mem { 41 42 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) 43 #define LOG_DEBUG_OBJ_HELPERS LOG(DEBUG, GC) << vm->GetGC()->GetLogPrefix() 44 45 class GC; 46 47 size_t GetObjectSize(const void *mem); 48 49 PandaString GetDebugInfoAboutObject(const ObjectHeader *header); 50 51 void DumpObject(ObjectHeader *object_header, std::basic_ostream<char, std::char_traits<char>> *o_stream = &std::cerr); 52 53 void DumpClass(Class *cls, std::basic_ostream<char, std::char_traits<char>> *o_stream = &std::cerr); 54 55 [[nodiscard]] ObjectHeader *GetForwardAddress(ObjectHeader *object_header); 56 57 const char *GetFieldName(const Field &field); 58 59 size_t GetDynClassInstanceSize(coretypes::DynClass *object); 60 61 class GCStaticObjectHelpers { 62 public: 63 static void TraverseAllObjects(ObjectHeader *object_header, 64 const std::function<void(ObjectHeader *, ObjectHeader *)> &obj_visitor); 65 66 template <typename FieldVisitor> 67 static void TraverseObject(ObjectHeader *object_header, BaseClass *base_cls, const FieldVisitor &field_visitor); 68 69 template <typename ElementVisitor> 70 static void TraverseArray(ObjectHeader *object_header, BaseClass *base_cls, 71 const ElementVisitor &array_element_visitor); 72 73 static void UpdateRefsToMovedObjects(PandaVM *vm, ObjectHeader *object, BaseClass *base_cls); 74 }; 75 76 class GCDynamicObjectHelpers { 77 public: 78 static void TraverseAllObjects(ObjectHeader *object_header, 79 const std::function<void(ObjectHeader *, ObjectHeader *)> &obj_visitor); 80 81 template <typename FieldVisitor> 82 static void TraverseObject(ObjectHeader *object_header, BaseClass *base_cls, const FieldVisitor &field_visitor); 83 84 template <typename ElementVisitor> 85 static void TraverseArray(ObjectHeader *object_header, BaseClass *base_cls, 86 const ElementVisitor &array_element_visitor); 87 88 static void UpdateRefsToMovedObjects(PandaVM *vm, ObjectHeader *object, BaseClass *base_cls); 89 90 static void RecordDynWeakReference(GC *gc, coretypes::TaggedType *value); 91 static void HandleDynWeakReferences(GC *gc); 92 93 private: 94 static void UpdateDynArray(PandaVM *vm, ObjectHeader *object_header, array_size_t index, ObjectHeader *obj_ref); 95 96 static void UpdateDynObjectRef(PandaVM *vm, ObjectHeader *object_header, size_t offset, ObjectHeader *field_obj_ref, 97 bool is_update_classword); 98 }; 99 100 template <LangTypeT LangType> 101 class GCObjectHelpers { 102 }; 103 104 template <> 105 class GCObjectHelpers<LANG_TYPE_STATIC> { 106 public: 107 using Value = GCStaticObjectHelpers; 108 }; 109 110 template <> 111 class GCObjectHelpers<LANG_TYPE_DYNAMIC> { 112 public: 113 using Value = GCDynamicObjectHelpers; 114 }; 115 116 template <LangTypeT LangType> 117 using ObjectHelpers = typename GCObjectHelpers<LangType>::Value; 118 119 } // namespace panda::mem 120 121 #endif // PANDA_RUNTIME_MEM_OBJECT_HELPERS_H_ 122