1 /** 2 * Copyright (c) 2021-2024 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_RUNTIME_CORE_CORE_CLASS_LINKER_EXTENSION_H_ 16 #define PANDA_RUNTIME_CORE_CORE_CLASS_LINKER_EXTENSION_H_ 17 18 #include "runtime/include/class_linker-inl.h" 19 #include "runtime/include/class_linker_extension.h" 20 21 namespace ark { 22 23 class CoreClassLinkerExtension : public ClassLinkerExtension { 24 public: CoreClassLinkerExtension()25 CoreClassLinkerExtension() : ClassLinkerExtension(panda_file::SourceLang::PANDA_ASSEMBLY) {} 26 27 ~CoreClassLinkerExtension() override; 28 29 bool InitializeArrayClass(Class *arrayClass, Class *componentClass) override; 30 31 void InitializePrimitiveClass(Class *primitiveClass) override; 32 33 size_t GetClassVTableSize(ClassRoot root) override; 34 35 size_t GetClassIMTSize(ClassRoot root) override; 36 37 size_t GetClassSize(ClassRoot root) override; 38 39 size_t GetArrayClassVTableSize() override; 40 41 size_t GetArrayClassIMTSize() override; 42 43 size_t GetArrayClassSize() override; 44 45 Class *CreateClass(const uint8_t *descriptor, size_t vtableSize, size_t imtSize, size_t size) override; 46 47 void FreeClass(Class *klass) override; 48 InitializeClass(Class * klass)49 bool InitializeClass([[maybe_unused]] Class *klass) override 50 { 51 return true; 52 } 53 GetNativeEntryPointFor(Method * method)54 const void *GetNativeEntryPointFor([[maybe_unused]] Method *method) const override 55 { 56 return reinterpret_cast<const void *>(intrinsics::UnknownIntrinsic); 57 } 58 CanThrowException(const Method * method)59 bool CanThrowException([[maybe_unused]] const Method *method) const override 60 { 61 return true; 62 } 63 GetErrorHandler()64 ClassLinkerErrorHandler *GetErrorHandler() override 65 { 66 return &errorHandler_; 67 }; 68 69 NO_COPY_SEMANTIC(CoreClassLinkerExtension); 70 NO_MOVE_SEMANTIC(CoreClassLinkerExtension); 71 72 private: 73 bool InitializeImpl(bool compressedStringEnabled) override; 74 void InitializeClassRoots(const LanguageContext &ctx); 75 76 class ErrorHandler : public ClassLinkerErrorHandler { 77 public: 78 void OnError(ClassLinker::Error error, const PandaString &message) override; 79 }; 80 81 ErrorHandler errorHandler_; 82 }; 83 84 } // namespace ark 85 86 #endif // PANDA_RUNTIME_CORE_CORE_CLASS_LINKER_EXTENSION_H_ 87