• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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