• 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 
16 #ifndef PANDA_PLUGINS_ETS_RUNTIME_ETS_LANGUAGE_CONTEXT_H_
17 #define PANDA_PLUGINS_ETS_RUNTIME_ETS_LANGUAGE_CONTEXT_H_
18 
19 #include <libpandafile/include/source_lang_enum.h>
20 
21 #include "libpandabase/macros.h"
22 #include "libpandabase/utils/utf.h"
23 #include "runtime/class_initializer.h"
24 #include "runtime/include/class_linker_extension.h"
25 #include "runtime/include/class_linker.h"
26 #include "runtime/include/class.h"
27 #include "runtime/include/coretypes/tagged_value.h"
28 #include "runtime/include/itable_builder.h"
29 #include "runtime/include/language_context.h"
30 #include "runtime/include/managed_thread.h"
31 #include "runtime/include/mem/panda_smart_pointers.h"
32 #include "runtime/include/method.h"
33 #include "runtime/include/vtable_builder_interface.h"
34 #include "runtime/interpreter/acc_vregister.h"
35 #include "runtime/include/runtime.h"
36 #include "runtime/include/runtime_options.h"
37 #include "runtime/mem/gc/gc.h"
38 #include "runtime/mem/gc/gc_types.h"
39 #include "runtime/mem/gc/gc_settings.h"
40 #include "runtime/include/mem/allocator.h"
41 #include "plugins/ets/runtime/ets_panda_file_items.h"
42 #include "plugins/ets/runtime/tooling/pt_ets_extension.h"
43 
44 #include "ets_class_linker_extension.h"
45 #include "ets_vm.h"
46 
47 namespace ark::ets {
48 
49 class EtsLanguageContext : public LanguageContextBase {
50 public:
51     EtsLanguageContext() = default;
52 
53     DEFAULT_COPY_SEMANTIC(EtsLanguageContext);
54     DEFAULT_MOVE_SEMANTIC(EtsLanguageContext);
55 
56     ~EtsLanguageContext() override = default;
57 
GetLanguage()58     panda_file::SourceLang GetLanguage() const override
59     {
60         return panda_file::SourceLang::ETS;
61     }
62 
GetLanguageType()63     LangTypeT GetLanguageType() const override
64     {
65         return EtsLanguageConfig::LANG_TYPE;
66     }
67 
GetObjectClassDescriptor()68     const uint8_t *GetObjectClassDescriptor() const override
69     {
70         return utf::CStringAsMutf8(panda_file_items::class_descriptors::OBJECT.data());
71     }
72 
GetClassClassDescriptor()73     const uint8_t *GetClassClassDescriptor() const override
74     {
75         return utf::CStringAsMutf8(panda_file_items::class_descriptors::CLASS.data());
76     }
77 
GetClassArrayClassDescriptor()78     const uint8_t *GetClassArrayClassDescriptor() const override
79     {
80         return utf::CStringAsMutf8(panda_file_items::class_descriptors::CLASS_ARRAY.data());
81     }
82 
GetStringArrayClassDescriptor()83     const uint8_t *GetStringArrayClassDescriptor() const override
84     {
85         return utf::CStringAsMutf8(panda_file_items::class_descriptors::STRING_ARRAY.data());
86     }
87 
GetCtorName()88     const uint8_t *GetCtorName() const override
89     {
90         return utf::CStringAsMutf8(panda_file_items::CTOR.data());
91     }
92 
GetCctorName()93     const uint8_t *GetCctorName() const override
94     {
95         return utf::CStringAsMutf8(panda_file_items::CCTOR.data());
96     }
97 
GetNullPointerExceptionClassDescriptor()98     const uint8_t *GetNullPointerExceptionClassDescriptor() const override
99     {
100         return utf::CStringAsMutf8(panda_file_items::class_descriptors::NULL_POINTER_ERROR.data());
101     }
102 
GetStackOverflowErrorClassDescriptor()103     const uint8_t *GetStackOverflowErrorClassDescriptor() const override
104     {
105         return utf::CStringAsMutf8(panda_file_items::class_descriptors::STACK_OVERFLOW_ERROR.data());
106     }
107 
GetArrayIndexOutOfBoundsExceptionClassDescriptor()108     const uint8_t *GetArrayIndexOutOfBoundsExceptionClassDescriptor() const override
109     {
110         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ARRAY_INDEX_OUT_OF_BOUNDS_ERROR.data());
111     }
112 
GetIndexOutOfBoundsExceptionClassDescriptor()113     const uint8_t *GetIndexOutOfBoundsExceptionClassDescriptor() const override
114     {
115         return utf::CStringAsMutf8(panda_file_items::class_descriptors::INDEX_OUT_OF_BOUNDS_ERROR.data());
116     }
117 
GetIllegalStateExceptionClassDescriptor()118     const uint8_t *GetIllegalStateExceptionClassDescriptor() const override
119     {
120         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ILLEGAL_STATE_EXCEPTION.data());
121     }
GetNegativeArraySizeExceptionClassDescriptor()122     const uint8_t *GetNegativeArraySizeExceptionClassDescriptor() const override
123     {
124         return utf::CStringAsMutf8(panda_file_items::class_descriptors::NEGATIVE_ARRAY_SIZE_ERROR.data());
125     }
126 
GetStringIndexOutOfBoundsExceptionClassDescriptor()127     const uint8_t *GetStringIndexOutOfBoundsExceptionClassDescriptor() const override
128     {
129         return utf::CStringAsMutf8(panda_file_items::class_descriptors::STRING_INDEX_OUT_OF_BOUNDS_ERROR.data());
130     }
131 
GetRangeErrorExceptionClassDescriptor()132     const uint8_t *GetRangeErrorExceptionClassDescriptor() const
133     {
134         return utf::CStringAsMutf8(panda_file_items::class_descriptors::RANGE_ERROR.data());
135     }
136 
GetArithmeticExceptionClassDescriptor()137     const uint8_t *GetArithmeticExceptionClassDescriptor() const override
138     {
139         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ARITHMETIC_ERROR.data());
140     }
141 
GetClassCastExceptionClassDescriptor()142     const uint8_t *GetClassCastExceptionClassDescriptor() const override
143     {
144         return utf::CStringAsMutf8(panda_file_items::class_descriptors::CLASS_CAST_ERROR.data());
145     }
146 
GetAbstractMethodErrorClassDescriptor()147     const uint8_t *GetAbstractMethodErrorClassDescriptor() const override
148     {
149         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_ABSTRACT_METHOD_ERROR.data());
150     }
151 
GetArrayStoreExceptionClassDescriptor()152     const uint8_t *GetArrayStoreExceptionClassDescriptor() const override
153     {
154         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ARRAY_STORE_ERROR.data());
155     }
156 
GetRuntimeExceptionClassDescriptor()157     const uint8_t *GetRuntimeExceptionClassDescriptor() const override
158     {
159         return utf::CStringAsMutf8(panda_file_items::class_descriptors::RUNTIME_EXCEPTION.data());
160     }
161 
GetFileNotFoundExceptionClassDescriptor()162     const uint8_t *GetFileNotFoundExceptionClassDescriptor() const override
163     {
164         return utf::CStringAsMutf8(panda_file_items::class_descriptors::FILE_NOT_FOUND_ERROR.data());
165     }
166 
GetIOExceptionClassDescriptor()167     const uint8_t *GetIOExceptionClassDescriptor() const override
168     {
169         return utf::CStringAsMutf8(panda_file_items::class_descriptors::IO_ERROR.data());
170     }
171 
GetIllegalArgumentExceptionClassDescriptor()172     const uint8_t *GetIllegalArgumentExceptionClassDescriptor() const override
173     {
174         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ILLEGAL_ARGUMENT_EXCEPTION.data());
175     }
176 
GetIllegalAccessExceptionClassDescriptor()177     const uint8_t *GetIllegalAccessExceptionClassDescriptor() const override
178     {
179         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ILLEGAL_ACCESS_ERROR.data());
180     }
181 
GetOutOfMemoryErrorClassDescriptor()182     const uint8_t *GetOutOfMemoryErrorClassDescriptor() const override
183     {
184         return utf::CStringAsMutf8(panda_file_items::class_descriptors::OUT_OF_MEMORY_ERROR.data());
185     }
186 
GetNoClassDefFoundErrorDescriptor()187     const uint8_t *GetNoClassDefFoundErrorDescriptor() const override
188     {
189         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_UNRESOLVED_CLASS_ERROR.data());
190     }
191 
GetClassCircularityErrorDescriptor()192     const uint8_t *GetClassCircularityErrorDescriptor() const override
193     {
194         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_TYPE_CIRCULARITY_ERROR.data());
195     }
196 
GetCoroutinesLimitExceedErrorDescriptor()197     const uint8_t *GetCoroutinesLimitExceedErrorDescriptor() const override
198     {
199         return utf::CStringAsMutf8(panda_file_items::class_descriptors::COROUTINES_LIMIT_EXCEED_ERROR.data());
200     }
201 
GetNoSuchFieldErrorDescriptor()202     const uint8_t *GetNoSuchFieldErrorDescriptor() const override
203     {
204         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_UNRESOLVED_FIELD_ERROR.data());
205     }
206 
GetNoSuchMethodErrorDescriptor()207     const uint8_t *GetNoSuchMethodErrorDescriptor() const override
208     {
209         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_UNRESOLVED_METHOD_ERROR.data());
210     }
211 
GetExceptionInInitializerErrorDescriptor()212     const uint8_t *GetExceptionInInitializerErrorDescriptor() const override
213     {
214         return utf::CStringAsMutf8(panda_file_items::class_descriptors::EXCEPTION_IN_INITIALIZER_ERROR.data());
215     }
216 
GetClassNotFoundExceptionDescriptor()217     const uint8_t *GetClassNotFoundExceptionDescriptor() const override
218     {
219         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_CLASS_NOT_FOUND_ERROR.data());
220     }
221 
GetInstantiationErrorDescriptor()222     const uint8_t *GetInstantiationErrorDescriptor() const override
223     {
224         return utf::CStringAsMutf8(panda_file_items::class_descriptors::INSTANTIATION_ERROR.data());
225     }
226 
GetUnsupportedOperationExceptionClassDescriptor()227     const uint8_t *GetUnsupportedOperationExceptionClassDescriptor() const override
228     {
229         return utf::CStringAsMutf8(panda_file_items::class_descriptors::UNSUPPORTED_OPERATION_EXCEPTION.data());
230     }
231 
GetVerifyErrorClassDescriptor()232     const uint8_t *GetVerifyErrorClassDescriptor() const override
233     {
234         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_VERIFICATION_ERROR.data());
235     }
236 
GetErrorClassDescriptor()237     const uint8_t *GetErrorClassDescriptor() const override
238     {
239         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ERROR.data());
240     }
241 
GetIncompatibleClassChangeErrorDescriptor()242     const uint8_t *GetIncompatibleClassChangeErrorDescriptor() const override
243     {
244         return utf::CStringAsMutf8(panda_file_items::class_descriptors::LINKER_BAD_SUPERTYPE_ERROR.data());
245     }
246 
GetInitialTaggedValue()247     coretypes::TaggedValue GetInitialTaggedValue() const override
248     {
249         UNREACHABLE();
250         return coretypes::TaggedValue(coretypes::TaggedValue::VALUE_UNDEFINED);
251     }
252 
GetEncodedTaggedValue(int64_t value,int64_t tag)253     coretypes::TaggedValue GetEncodedTaggedValue([[maybe_unused]] int64_t value,
254                                                  [[maybe_unused]] int64_t tag) const override
255     {
256         UNREACHABLE();
257         return coretypes::TaggedValue(coretypes::TaggedValue::VALUE_UNDEFINED);
258     }
259 
SetExceptionToVReg(interpreter::AccVRegister & vreg,ObjectHeader * obj)260     void SetExceptionToVReg(interpreter::AccVRegister &vreg, ObjectHeader *obj) const override
261     {
262         vreg.AsVRegRef().SetReference(obj);
263     }
264 
IsCallableObject(ObjectHeader * obj)265     bool IsCallableObject([[maybe_unused]] ObjectHeader *obj) const override
266     {
267         UNREACHABLE();
268         return false;
269     }
270 
GetCallTarget(ObjectHeader * obj)271     Method *GetCallTarget([[maybe_unused]] ObjectHeader *obj) const override
272     {
273         UNREACHABLE();
274         return nullptr;
275     }
276 
GetReferenceErrorDescriptor()277     const uint8_t *GetReferenceErrorDescriptor() const override
278     {
279         UNREACHABLE();
280         return nullptr;
281     }
282 
GetTypedErrorDescriptor()283     const uint8_t *GetTypedErrorDescriptor() const override
284     {
285         UNREACHABLE();
286         return nullptr;
287     }
288 
GetIllegalMonitorStateExceptionDescriptor()289     const uint8_t *GetIllegalMonitorStateExceptionDescriptor() const override
290     {
291         return utf::CStringAsMutf8(panda_file_items::class_descriptors::ILLEGAL_MONITOR_STATE_ERROR.data());
292     }
293 
294     void ThrowException(ManagedThread *thread, const uint8_t *mutf8Name, const uint8_t *mutf8Msg) const override;
295 
296     PandaUniquePtr<ITableBuilder> CreateITableBuilder(ClassLinkerErrorHandler *errHandler) const override;
297 
298     PandaUniquePtr<VTableBuilder> CreateVTableBuilder(ClassLinkerErrorHandler *errHandler) const override;
299 
InitializeClass(ClassLinker * classLinker,ManagedThread * thread,Class * klass)300     bool InitializeClass(ClassLinker *classLinker, ManagedThread *thread, Class *klass) const override
301     {
302         return ClassInitializer<MT_MODE_TASK>::Initialize(classLinker, thread, klass);
303     }
304 
CreateClassLinkerExtension()305     std::unique_ptr<ClassLinkerExtension> CreateClassLinkerExtension() const override
306     {
307         return std::make_unique<EtsClassLinkerExtension>();
308     }
309 
310     ets::PandaEtsVM *CreateVM(Runtime *runtime, const RuntimeOptions &options) const override;
311 
312     mem::GC *CreateGC(mem::GCType gcType, mem::ObjectAllocatorBase *objectAllocator,
313                       const mem::GCSettings &settings) const override;
314 
315     void ThrowStackOverflowException(ManagedThread *thread) const override;
316 
317     VerificationInitAPI GetVerificationInitAPI() const override;
318 
GetVerificationTypeClass()319     const char *GetVerificationTypeClass() const override
320     {
321         return "std.core.Class";
322     }
323 
GetVerificationTypeObject()324     const char *GetVerificationTypeObject() const override
325     {
326         return "std.core.Object";
327     }
328 
GetVerificationTypeThrowable()329     const char *GetVerificationTypeThrowable() const override
330     {
331         return "std.core.Object";
332     }
333 
WrapClassInitializerException(ClassLinker * classLinker,ManagedThread * thread)334     void WrapClassInitializerException([[maybe_unused]] ClassLinker *classLinker,
335                                        [[maybe_unused]] ManagedThread *thread) const override
336     {
337     }
338 
CreatePtLangExt()339     std::unique_ptr<tooling::PtLangExt> CreatePtLangExt() const override
340     {
341         return std::make_unique<PtEtsExtension>();
342     }
343 };
344 
345 }  // namespace ark::ets
346 
347 #endif  // !PANDA_PLUGINS_ETS_RUNTIME_ETS_LANGUAGE_CONTEXT_H_
348