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