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