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