• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2021-2022 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/include/class_linker_extension.h"
24 #include "runtime/include/class_linker.h"
25 #include "runtime/include/class_root.h"
26 #include "runtime/include/mem/panda_string.h"
27 #include "plugins/ets/runtime/types/ets_class.h"
28 #include "plugins/ets/runtime/ets_coroutine.h"
29 
30 namespace panda {
31 
32 class Class;
33 class Method;
34 class ObjectHeader;
35 
36 }  // namespace panda
37 
38 namespace panda::ets {
39 
40 class EtsClassLinkerExtension : public ClassLinkerExtension {
41 public:
EtsClassLinkerExtension()42     EtsClassLinkerExtension() : ClassLinkerExtension(panda_file::SourceLang::ETS) {}
43 
44     ~EtsClassLinkerExtension() override;
45 
46     bool InitializeArrayClass(Class *arrayClass, Class *componentClass) override;
47 
48     void InitializePrimitiveClass(Class *primitiveClass) override;
49 
50     size_t GetClassVTableSize(ClassRoot root) override;
51 
52     size_t GetClassIMTSize(ClassRoot root) override;
53 
54     size_t GetClassSize(ClassRoot root) override;
55 
56     size_t GetArrayClassVTableSize() override;
57 
58     size_t GetArrayClassIMTSize() override;
59 
60     size_t GetArrayClassSize() override;
61 
62     Class *CreateClass(const uint8_t *descriptor, size_t vtableSize, size_t imtSize, size_t size) override;
63 
64     void FreeClass(Class *klass) override;
65 
66     bool InitializeClass([[maybe_unused]] Class *klass) override;
67 
68     const void *GetNativeEntryPointFor([[maybe_unused]] Method *method) const override;
69 
CanThrowException(const Method * method)70     bool CanThrowException([[maybe_unused]] const Method *method) const override
71     {
72         return true;
73     }
74 
GetErrorHandler()75     ClassLinkerErrorHandler *GetErrorHandler() override
76     {
77         return &errorHandler_;
78     };
79 
80     Class *FromClassObject(panda::ObjectHeader *obj) override;
81     size_t GetClassObjectSizeFromClassSize(uint32_t size) override;
82 
GetObjectClass()83     Class *GetObjectClass()
84     {
85         return objectClass_;
86     }
87 
GetPromiseClass()88     Class *GetPromiseClass()
89     {
90         return promiseClass_;
91     }
92 
GetArrayBufferClass()93     Class *GetArrayBufferClass()
94     {
95         return arraybufClass_;
96     }
97 
GetSharedMemoryClass()98     Class *GetSharedMemoryClass()
99     {
100         return sharedMemoryClass_;
101     }
102 
GetTypeAPIFieldClass()103     Class *GetTypeAPIFieldClass()
104     {
105         return typeapiFieldClass_;
106     }
107 
GetTypeAPIMethodClass()108     Class *GetTypeAPIMethodClass()
109     {
110         return typeapiMethodClass_;
111     }
112 
GetTypeAPIParameterClass()113     Class *GetTypeAPIParameterClass()
114     {
115         return typeapiParameterClass_;
116     }
117 
GetVoidClass()118     Class *GetVoidClass()
119     {
120         return voidClass_;
121     }
122 
GetBoxBooleanClass()123     Class *GetBoxBooleanClass()
124     {
125         return boxBooleanClass_;
126     }
127 
GetBoxByteClass()128     Class *GetBoxByteClass()
129     {
130         return boxByteClass_;
131     }
132 
GetBoxCharClass()133     Class *GetBoxCharClass()
134     {
135         return boxCharClass_;
136     }
137 
GetBoxShortClass()138     Class *GetBoxShortClass()
139     {
140         return boxShortClass_;
141     }
142 
GetBoxIntClass()143     Class *GetBoxIntClass()
144     {
145         return boxIntClass_;
146     }
147 
GetBoxLongClass()148     Class *GetBoxLongClass()
149     {
150         return boxLongClass_;
151     }
152 
GetBoxFloatClass()153     Class *GetBoxFloatClass()
154     {
155         return boxFloatClass_;
156     }
157 
GetBoxDoubleClass()158     Class *GetBoxDoubleClass()
159     {
160         return boxDoubleClass_;
161     }
162 
FromCoreType(ClassLinkerExtension * ext)163     static EtsClassLinkerExtension *FromCoreType(ClassLinkerExtension *ext)
164     {
165         ASSERT(ext->GetLanguage() == panda_file::SourceLang::ETS);
166         return static_cast<EtsClassLinkerExtension *>(ext);
167     }
168 
GetLanguageContext()169     LanguageContext GetLanguageContext() const
170     {
171         return langCtx_;
172     }
173 
174     NO_COPY_SEMANTIC(EtsClassLinkerExtension);
175     NO_MOVE_SEMANTIC(EtsClassLinkerExtension);
176 
177 private:
178     bool InitializeImpl(bool compressedStringEnabled) override;
179 
180     Class *InitializeClass(ObjectHeader *objectHeader, const uint8_t *descriptor, size_t vtableSize, size_t imtSize,
181                            size_t size);
182 
183     Class *CreateClassRoot(const uint8_t *descriptor, ClassRoot root);
184 
185     bool CacheClass(Class **classForCache, const char *descriptor);
186 
187     class ErrorHandler : public ClassLinkerErrorHandler {
188     public:
189         void OnError(ClassLinker::Error error, const PandaString &message) override;
190     };
191 
192     ErrorHandler errorHandler_;
193     LanguageContext langCtx_ {nullptr};
194     mem::HeapManager *heapManager_ {nullptr};
195 
196     // void class
197     Class *voidClass_ = nullptr;
198 
199     // Box classes
200     Class *boxBooleanClass_ = nullptr;
201     Class *boxByteClass_ = nullptr;
202     Class *boxCharClass_ = nullptr;
203     Class *boxShortClass_ = nullptr;
204     Class *boxIntClass_ = nullptr;
205     Class *boxLongClass_ = nullptr;
206     Class *boxFloatClass_ = nullptr;
207     Class *boxDoubleClass_ = nullptr;
208 
209     // Cached classes
210     Class *objectClass_ = nullptr;
211     Class *promiseClass_ = nullptr;
212     Class *arraybufClass_ = nullptr;
213 
214     // Cached type API classes
215     Class *typeapiFieldClass_ = nullptr;
216     Class *typeapiMethodClass_ = nullptr;
217     Class *typeapiParameterClass_ = nullptr;
218 
219     // Escompat classes
220     Class *sharedMemoryClass_ = nullptr;
221 };
222 
223 }  // namespace panda::ets
224 
225 #endif  // !PANDA_PLUGINS_ETS_RUNTIME_ETS_CLASS_LINKER_EXTENSION_H
226