• 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_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 ark {
31 
32 class Class;
33 class Method;
34 class ObjectHeader;
35 
36 }  // namespace ark
37 
38 namespace ark::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     void InitializeClassRoots();
67 
68     bool InitializeClass(Class *klass) override;
69 
70     const void *GetNativeEntryPointFor(Method *method) const override;
71 
CanThrowException(const Method * method)72     bool CanThrowException([[maybe_unused]] const Method *method) const override
73     {
74         return true;
75     }
76 
GetErrorHandler()77     ClassLinkerErrorHandler *GetErrorHandler() override
78     {
79         return &errorHandler_;
80     };
81 
82     Class *FromClassObject(ark::ObjectHeader *obj) override;
83     size_t GetClassObjectSizeFromClassSize(uint32_t size) override;
84 
85     void InitializeBuiltinClasses();
86     void InitializeBuiltinSpecialClasses();
87 
GetObjectClass()88     Class *GetObjectClass()
89     {
90         return GetClassRoot(ClassRoot::OBJECT);
91     }
92 
GetUndefinedClass()93     Class *GetUndefinedClass() const
94     {
95         return undefinedClass_;
96     }
97 
GetPromiseClass()98     Class *GetPromiseClass()
99     {
100         return promiseClass_;
101     }
102 
GetPromiseRefClass()103     Class *GetPromiseRefClass()
104     {
105         return promiseRefClass_;
106     }
107 
GetWaitersListClass()108     Class *GetWaitersListClass()
109     {
110         return waiterListClass_;
111     }
112 
GetMutexClass()113     Class *GetMutexClass()
114     {
115         return mutexClass_;
116     }
117 
GetEventClass()118     Class *GetEventClass()
119     {
120         return eventClass_;
121     }
122 
GetCondVarClass()123     Class *GetCondVarClass()
124     {
125         return condVarClass_;
126     }
127 
GetBigIntClass()128     Class *GetBigIntClass()
129     {
130         return bigintClass_;
131     }
132 
GetExceptionClass()133     Class *GetExceptionClass()
134     {
135         return exceptionClass_;
136     }
137 
GetErrorClass()138     Class *GetErrorClass()
139     {
140         return errorClass_;
141     }
142 
GetArrayAsListIntClass()143     Class *GetArrayAsListIntClass()
144     {
145         return arrayAsListIntClass_;
146     }
147 
GetArrayClass()148     Class *GetArrayClass()
149     {
150         return arrayClass_;
151     }
152 
GetArrayBufferClass()153     Class *GetArrayBufferClass()
154     {
155         return arraybufClass_;
156     }
157 
GetStringBuilderClass()158     Class *GetStringBuilderClass()
159     {
160         return stringBuilderClass_;
161     }
162 
GetSharedMemoryClass()163     Class *GetSharedMemoryClass()
164     {
165         return sharedMemoryClass_;
166     }
167 
GetTypeAPIFieldClass()168     Class *GetTypeAPIFieldClass()
169     {
170         return typeapiFieldClass_;
171     }
172 
GetTypeAPIMethodClass()173     Class *GetTypeAPIMethodClass()
174     {
175         return typeapiMethodClass_;
176     }
177 
GetTypeAPIParameterClass()178     Class *GetTypeAPIParameterClass()
179     {
180         return typeapiParameterClass_;
181     }
182 
GetFunctionClass()183     Class *GetFunctionClass()
184     {
185         return functionClass_;
186     }
187 
GetBoxBooleanClass()188     Class *GetBoxBooleanClass()
189     {
190         return boxBooleanClass_;
191     }
192 
GetBoxByteClass()193     Class *GetBoxByteClass()
194     {
195         return boxByteClass_;
196     }
197 
GetBoxCharClass()198     Class *GetBoxCharClass()
199     {
200         return boxCharClass_;
201     }
202 
GetBoxShortClass()203     Class *GetBoxShortClass()
204     {
205         return boxShortClass_;
206     }
207 
GetBoxIntClass()208     Class *GetBoxIntClass()
209     {
210         return boxIntClass_;
211     }
212 
GetBoxLongClass()213     Class *GetBoxLongClass()
214     {
215         return boxLongClass_;
216     }
217 
GetBoxFloatClass()218     Class *GetBoxFloatClass()
219     {
220         return boxFloatClass_;
221     }
222 
GetBoxDoubleClass()223     Class *GetBoxDoubleClass()
224     {
225         return boxDoubleClass_;
226     }
227 
GetFinalizableWeakRefClass()228     Class *GetFinalizableWeakRefClass()
229     {
230         return finalizableWeakClass_;
231     }
232 
GetSubscribeOnAnotherPromiseMethod()233     Method *GetSubscribeOnAnotherPromiseMethod()
234     {
235         return subscribeOnAnotherPromiseMethod_;
236     }
237 
FromCoreType(ClassLinkerExtension * ext)238     static EtsClassLinkerExtension *FromCoreType(ClassLinkerExtension *ext)
239     {
240         ASSERT(ext->GetLanguage() == panda_file::SourceLang::ETS);
241         return static_cast<EtsClassLinkerExtension *>(ext);
242     }
243 
GetLanguageContext()244     LanguageContext GetLanguageContext() const
245     {
246         return langCtx_;
247     }
248 
IsJSValueClass(Class * maybeJSValue)249     bool IsJSValueClass(Class *maybeJSValue) const
250     {
251         return maybeJSValue == jsvalueClass_;
252     }
253 
254     NO_COPY_SEMANTIC(EtsClassLinkerExtension);
255     NO_MOVE_SEMANTIC(EtsClassLinkerExtension);
256 
257 private:
258     bool InitializeImpl(bool compressedStringEnabled) override;
259 
260     Class *InitializeClass(ObjectHeader *objectHeader, const uint8_t *descriptor, size_t vtableSize, size_t imtSize,
261                            size_t size);
262 
263     Class *CreateClassRoot(const uint8_t *descriptor, ClassRoot root);
264 
265     Class *CacheClass(std::string_view descriptor, bool forceInit = false);
266     template <typename F>
267     Class *CacheClass(std::string_view descriptor, F const &setup, bool forceInit = false);
268 
269     class ErrorHandler : public ClassLinkerErrorHandler {
270     public:
271         void OnError(ClassLinker::Error error, const PandaString &message) override;
272     };
273 
274     ErrorHandler errorHandler_;
275     LanguageContext langCtx_ {nullptr};
276     mem::HeapManager *heapManager_ {nullptr};
277 
278     // Cached classes
279     Class *undefinedClass_ = nullptr;
280     // std.core box classes
281     Class *boxBooleanClass_ = nullptr;
282     Class *boxByteClass_ = nullptr;
283     Class *boxCharClass_ = nullptr;
284     Class *boxShortClass_ = nullptr;
285     Class *boxIntClass_ = nullptr;
286     Class *boxLongClass_ = nullptr;
287     Class *boxFloatClass_ = nullptr;
288     Class *boxDoubleClass_ = nullptr;
289     // std.core special types
290     Class *bigintClass_ = nullptr;
291     Class *functionClass_ = nullptr;
292     // std.core
293     Class *exceptionClass_ = nullptr;
294     Class *errorClass_ = nullptr;
295     Class *promiseClass_ = nullptr;
296     Method *subscribeOnAnotherPromiseMethod_ = nullptr;
297     Class *promiseRefClass_ = nullptr;
298     Class *waiterListClass_ = nullptr;
299     Class *mutexClass_ = nullptr;
300     Class *eventClass_ = nullptr;
301     Class *condVarClass_ = nullptr;
302     Class *arrayClass_ = nullptr;
303     Class *arraybufClass_ = nullptr;
304     Class *stringBuilderClass_ = nullptr;
305     Class *arrayAsListIntClass_ = nullptr;
306     Class *jsvalueClass_ = nullptr;
307     Class *finalizableWeakClass_ = nullptr;
308     // Cached type API classes
309     Class *typeapiFieldClass_ = nullptr;
310     Class *typeapiMethodClass_ = nullptr;
311     Class *typeapiParameterClass_ = nullptr;
312     // escompat
313     Class *sharedMemoryClass_ = nullptr;
314 };
315 
316 }  // namespace ark::ets
317 
318 #endif  // !PANDA_PLUGINS_ETS_RUNTIME_ETS_CLASS_LINKER_EXTENSION_H_
319