1 /** 2 * Copyright (c) 2021-2025 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 #ifndef PANDA_PLUGINS_ETS_RUNTIME_ETS_CLASS_LINKER_EXTENSION_H_ 16 #define PANDA_PLUGINS_ETS_RUNTIME_ETS_CLASS_LINKER_EXTENSION_H_ 17 18 #include <cstddef> 19 20 #include <libpandafile/include/source_lang_enum.h> 21 22 #include "libpandabase/macros.h" 23 #include "runtime/class_linker_context.h" 24 #include "runtime/include/class_linker_extension.h" 25 #include "runtime/include/class_linker.h" 26 #include "runtime/include/class_root.h" 27 #include "runtime/include/mem/panda_string.h" 28 #include "plugins/ets/runtime/types/ets_class.h" 29 #include "plugins/ets/runtime/ets_coroutine.h" 30 #include "plugins/ets/runtime/ets_platform_types.h" 31 32 namespace ark { 33 34 class Class; 35 class Method; 36 class ObjectHeader; 37 38 } // namespace ark 39 40 namespace ark::ets { 41 42 class EtsRuntimeLinker; 43 44 class EtsClassLinkerExtension : public ClassLinkerExtension { 45 public: EtsClassLinkerExtension()46 EtsClassLinkerExtension() : ClassLinkerExtension(panda_file::SourceLang::ETS) {} 47 48 ~EtsClassLinkerExtension() override; 49 50 bool InitializeArrayClass(Class *arrayClass, Class *componentClass) override; 51 52 void InitializePrimitiveClass(Class *primitiveClass) override; 53 54 size_t GetClassVTableSize(ClassRoot root) override; 55 56 size_t GetClassIMTSize(ClassRoot root) override; 57 58 size_t GetClassSize(ClassRoot root) override; 59 60 size_t GetArrayClassVTableSize() override; 61 62 size_t GetArrayClassIMTSize() override; 63 64 size_t GetArrayClassSize() override; 65 66 Class *CreateClass(const uint8_t *descriptor, size_t vtableSize, size_t imtSize, size_t size) override; 67 68 void FreeClass(Class *klass) override; 69 70 void InitializeClassRoots(); 71 72 bool InitializeClass(Class *klass) override; 73 74 bool InitializeClass(Class *klass, ClassLinkerErrorHandler *handler) override; 75 76 bool IsMethodNativeApi(const Method *method) const override; 77 78 const void *GetNativeEntryPointFor(Method *method) const override; 79 80 bool CanThrowException([[maybe_unused]] const Method *method) const override; 81 82 bool IsNecessarySwitchThreadState(const Method *method) const override; 83 84 bool CanNativeMethodUseObjects(const Method *method) const override; 85 GetErrorHandler()86 ClassLinkerErrorHandler *GetErrorHandler() override 87 { 88 return &errorHandler_; 89 }; 90 91 Class *FromClassObject(ark::ObjectHeader *obj) override; 92 size_t GetClassObjectSizeFromClassSize(uint32_t size) override; 93 94 ClassLinkerContext *CreateApplicationClassLinkerContext(const PandaVector<PandaString> &path) override; 95 96 void InitializeBuiltinClasses(); 97 void InitializeBuiltinSpecialClasses(); 98 GetPlatformTypes()99 EtsPlatformTypes const *GetPlatformTypes() 100 { 101 return plaformTypes_.get(); 102 } 103 FromCoreType(ClassLinkerExtension * ext)104 static EtsClassLinkerExtension *FromCoreType(ClassLinkerExtension *ext) 105 { 106 ASSERT(ext->GetLanguage() == panda_file::SourceLang::ETS); 107 return static_cast<EtsClassLinkerExtension *>(ext); 108 } 109 GetLanguageContext()110 LanguageContext GetLanguageContext() const 111 { 112 return langCtx_; 113 } 114 115 static EtsRuntimeLinker *GetOrCreateEtsRuntimeLinker(ClassLinkerContext *ctx); 116 117 /// @brief Removes reference to `RuntimeLinker` from `BootContext` and `EtsClassLinkerContext`. 118 static void RemoveRefToLinker(ClassLinkerContext *ctx); 119 120 NO_COPY_SEMANTIC(EtsClassLinkerExtension); 121 NO_MOVE_SEMANTIC(EtsClassLinkerExtension); 122 123 private: 124 bool InitializeImpl(bool compressedStringEnabled) override; 125 126 Class *InitializeClass(ObjectHeader *objectHeader, const uint8_t *descriptor, size_t vtableSize, size_t imtSize, 127 size_t size); 128 129 Class *CreateClassRoot(const uint8_t *descriptor, ClassRoot root); 130 131 Class *CacheClass(std::string_view descriptor, bool forceInit = false); 132 template <typename F> 133 Class *CacheClass(std::string_view descriptor, F const &setup, bool forceInit = false); 134 135 class ErrorHandler : public ClassLinkerErrorHandler { 136 public: 137 void OnError(ClassLinker::Error error, const PandaString &message) override; 138 }; 139 140 ErrorHandler errorHandler_; 141 LanguageContext langCtx_ {nullptr}; 142 mem::HeapManager *heapManager_ {nullptr}; 143 144 PandaUniquePtr<EtsPlatformTypes> plaformTypes_ {nullptr}; 145 }; 146 147 } // namespace ark::ets 148 149 #endif // !PANDA_PLUGINS_ETS_RUNTIME_ETS_CLASS_LINKER_EXTENSION_H_ 150