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