• 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 #include "plugins/ets/runtime/ets_itable_builder.h"
17 #include "plugins/ets/runtime/ets_language_context.h"
18 #include "plugins/ets/runtime/ets_vtable_builder.h"
19 #include "plugins/ets/runtime/types/ets_method.h"
20 #include "plugins/ets/runtime/types/ets_string.h"
21 #include "plugins/ets/runtime/ets_exceptions.h"
22 #include "plugins/ets/runtime/ets_handle_scope.h"
23 #include "plugins/ets/runtime/ets_handle.h"
24 
25 #include <array>
26 
27 namespace ark::ets {
28 
ThrowException(ManagedThread * thread,const uint8_t * mutf8Name,const uint8_t * mutf8Msg) const29 void EtsLanguageContext::ThrowException(ManagedThread *thread, const uint8_t *mutf8Name, const uint8_t *mutf8Msg) const
30 {
31     EtsCoroutine *coroutine = EtsCoroutine::CastFromThread(thread);
32     ThrowEtsException(coroutine, utf::Mutf8AsCString(mutf8Name), utf::Mutf8AsCString(mutf8Msg));
33 }
34 
CreateITableBuilder(ClassLinkerErrorHandler * errHandler) const35 PandaUniquePtr<ITableBuilder> EtsLanguageContext::CreateITableBuilder(ClassLinkerErrorHandler *errHandler) const
36 {
37     return MakePandaUnique<EtsITableBuilder>(errHandler);
38 }
39 
CreateVTableBuilder(ClassLinkerErrorHandler * errHandler) const40 PandaUniquePtr<VTableBuilder> EtsLanguageContext::CreateVTableBuilder(ClassLinkerErrorHandler *errHandler) const
41 {
42     return MakePandaUnique<EtsVTableBuilder>(errHandler);
43 }
44 
CreateVM(Runtime * runtime,const RuntimeOptions & options) const45 ets::PandaEtsVM *EtsLanguageContext::CreateVM(Runtime *runtime, const RuntimeOptions &options) const
46 {
47     ASSERT(runtime != nullptr);
48 
49     auto vm = ets::PandaEtsVM::Create(runtime, options);
50     if (!vm) {
51         LOG(ERROR, RUNTIME) << vm.Error();
52         return nullptr;
53     }
54 
55     return vm.Value();
56 }
57 
CreateGC(mem::GCType gcType,mem::ObjectAllocatorBase * objectAllocator,const mem::GCSettings & settings) const58 mem::GC *EtsLanguageContext::CreateGC(mem::GCType gcType, mem::ObjectAllocatorBase *objectAllocator,
59                                       const mem::GCSettings &settings) const
60 {
61     return mem::CreateGC<EtsLanguageConfig>(gcType, objectAllocator, settings);
62 }
63 
ThrowStackOverflowException(ManagedThread * thread) const64 void EtsLanguageContext::ThrowStackOverflowException(ManagedThread *thread) const
65 {
66     ASSERT(thread != nullptr);
67     EtsCoroutine *coroutine = EtsCoroutine::CastFromThread(thread);
68     EtsClassLinker *classLinker = coroutine->GetPandaVM()->GetClassLinker();
69     const char *classDescriptor = utf::Mutf8AsCString(GetStackOverflowErrorClassDescriptor());
70     EtsClass *cls = classLinker->GetClass(classDescriptor, true);
71     ASSERT(cls != nullptr);
72 
73     EtsHandleScope scope(coroutine);
74     EtsHandle<EtsObject> exc(coroutine, EtsObject::Create(cls));
75     ASSERT(exc.GetPtr() != nullptr);
76     coroutine->SetException(exc.GetPtr()->GetCoreType());
77 }
78 
GetVerificationInitAPI() const79 VerificationInitAPI EtsLanguageContext::GetVerificationInitAPI() const
80 {
81     VerificationInitAPI vApi;
82     vApi.primitiveRootsForVerification = {
83         panda_file::Type::TypeId::TAGGED, panda_file::Type::TypeId::VOID, panda_file::Type::TypeId::U1,
84         panda_file::Type::TypeId::U8,     panda_file::Type::TypeId::U16,  panda_file::Type::TypeId::U32,
85         panda_file::Type::TypeId::U64,    panda_file::Type::TypeId::I8,   panda_file::Type::TypeId::I16,
86         panda_file::Type::TypeId::I32,    panda_file::Type::TypeId::I64,  panda_file::Type::TypeId::F32,
87         panda_file::Type::TypeId::F64};
88 
89     vApi.arrayElementsForVerification = {reinterpret_cast<const uint8_t *>("[Z"),
90                                          reinterpret_cast<const uint8_t *>("[B"),
91                                          reinterpret_cast<const uint8_t *>("[S"),
92                                          reinterpret_cast<const uint8_t *>("[C"),
93                                          reinterpret_cast<const uint8_t *>("[I"),
94                                          reinterpret_cast<const uint8_t *>("[J"),
95                                          reinterpret_cast<const uint8_t *>("[F"),
96                                          reinterpret_cast<const uint8_t *>("[D")
97 
98     };
99 
100     vApi.isNeedClassSyntheticClass = true;
101     vApi.isNeedObjectSyntheticClass = false;
102     vApi.isNeedStringSyntheticClass = false;
103 
104     return vApi;
105 }
106 
107 }  // namespace ark::ets
108