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_TESTS_CLASS_LINKER_TEST_EXTENSION_H_ 16 #define PANDA_RUNTIME_TESTS_CLASS_LINKER_TEST_EXTENSION_H_ 17 18 #include "runtime/include/class_linker.h" 19 #include "runtime/include/class_linker_extension.h" 20 #include "runtime/include/coretypes/class.h" 21 #include "runtime/include/panda_vm.h" 22 23 namespace ark::test { 24 25 class ClassLinkerTestExtension : public ClassLinkerExtension { 26 public: 27 NO_COPY_SEMANTIC(ClassLinkerTestExtension); 28 NO_MOVE_SEMANTIC(ClassLinkerTestExtension); 29 ClassLinkerTestExtension(ManagedThread * thread,panda_file::SourceLang lang)30 ClassLinkerTestExtension(ManagedThread *thread, panda_file::SourceLang lang) 31 : ClassLinkerExtension(lang), thread_(thread) 32 { 33 } 34 ~ClassLinkerTestExtension()35 ~ClassLinkerTestExtension() override 36 { 37 FreeLoadedClasses(); 38 } 39 InitializeArrayClass(Class * arrayClass,Class * componentClass)40 bool InitializeArrayClass(Class *arrayClass, Class *componentClass) override 41 { 42 auto *objectClass = GetClassRoot(ClassRoot::OBJECT); 43 arrayClass->SetBase(objectClass); 44 arrayClass->SetComponentType(componentClass); 45 return true; 46 } 47 InitializePrimitiveClass(Class * primitiveClass)48 void InitializePrimitiveClass([[maybe_unused]] Class *primitiveClass) override {} 49 GetClassVTableSize(ClassRoot root)50 size_t GetClassVTableSize([[maybe_unused]] ClassRoot root) override 51 { 52 return 0; 53 } 54 GetClassIMTSize(ClassRoot root)55 size_t GetClassIMTSize([[maybe_unused]] ClassRoot root) override 56 { 57 return 0; 58 } 59 GetClassSize(ClassRoot root)60 size_t GetClassSize(ClassRoot root) override 61 { 62 return Class::ComputeClassSize(GetClassVTableSize(root), GetClassIMTSize(root), 0, 0, 0, 0, 0, 0); 63 } 64 GetArrayClassVTableSize()65 size_t GetArrayClassVTableSize() override 66 { 67 return GetClassVTableSize(ClassRoot::OBJECT); 68 } 69 GetArrayClassIMTSize()70 size_t GetArrayClassIMTSize() override 71 { 72 return GetClassIMTSize(ClassRoot::OBJECT); 73 } 74 GetArrayClassSize()75 size_t GetArrayClassSize() override 76 { 77 return GetClassSize(ClassRoot::OBJECT); 78 } 79 CreateClass(const uint8_t * descriptor,size_t vtableSize,size_t imtSize,size_t size)80 Class *CreateClass(const uint8_t *descriptor, size_t vtableSize, size_t imtSize, size_t size) override 81 { 82 auto vm = thread_->GetVM(); 83 auto allocator = vm->GetGC()->GetObjectAllocator(); 84 void *ptr = allocator->AllocateNonMovable(coretypes::Class::GetSize(size), DEFAULT_ALIGNMENT, nullptr, 85 mem::ObjectAllocatorBase::ObjMemInitPolicy::REQUIRE_INIT); 86 auto *res = reinterpret_cast<coretypes::Class *>(ptr); 87 res->InitClass(descriptor, vtableSize, imtSize, size); 88 vm->GetGC()->InitGCBits(res); 89 res->SetClass(GetClassRoot(ClassRoot::CLASS)); 90 auto *klass = res->GetRuntimeClass(); 91 klass->SetManagedObject(res); 92 klass->SetSourceLang(GetLanguage()); 93 AddCreatedClass(klass); 94 return klass; 95 } 96 FreeClass(Class * klass)97 void FreeClass(Class *klass) override 98 { 99 RemoveCreatedClass(klass); 100 } 101 InitializeClass(Class *)102 bool InitializeClass(Class * /*klass*/) override 103 { 104 return true; 105 } 106 GetNativeEntryPointFor(ark::Method *)107 const void *GetNativeEntryPointFor(ark::Method * /*method*/) const override 108 { 109 return nullptr; 110 } 111 CanThrowException(const Method *)112 bool CanThrowException(const Method * /* method */) const override 113 { 114 return true; 115 } 116 GetErrorHandler()117 ClassLinkerErrorHandler *GetErrorHandler() override 118 { 119 return nullptr; 120 } 121 122 private: 123 bool InitializeImpl(bool compressedStringEnabled) override; 124 125 ManagedThread *thread_; 126 }; 127 128 } // namespace ark::test 129 130 #endif // PANDA_RUNTIME_TESTS_CLASS_LINKER_TEST_EXTENSION_H_ 131