1 /** 2 * Copyright (c) 2021-2022 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 panda { 31 32 class Class; 33 class Method; 34 class ObjectHeader; 35 36 } // namespace panda 37 38 namespace panda::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 bool InitializeClass([[maybe_unused]] Class *klass) override; 67 68 const void *GetNativeEntryPointFor([[maybe_unused]] Method *method) const override; 69 CanThrowException(const Method * method)70 bool CanThrowException([[maybe_unused]] const Method *method) const override 71 { 72 return true; 73 } 74 GetErrorHandler()75 ClassLinkerErrorHandler *GetErrorHandler() override 76 { 77 return &errorHandler_; 78 }; 79 80 Class *FromClassObject(panda::ObjectHeader *obj) override; 81 size_t GetClassObjectSizeFromClassSize(uint32_t size) override; 82 GetObjectClass()83 Class *GetObjectClass() 84 { 85 return objectClass_; 86 } 87 GetPromiseClass()88 Class *GetPromiseClass() 89 { 90 return promiseClass_; 91 } 92 GetArrayBufferClass()93 Class *GetArrayBufferClass() 94 { 95 return arraybufClass_; 96 } 97 GetSharedMemoryClass()98 Class *GetSharedMemoryClass() 99 { 100 return sharedMemoryClass_; 101 } 102 GetTypeAPIFieldClass()103 Class *GetTypeAPIFieldClass() 104 { 105 return typeapiFieldClass_; 106 } 107 GetTypeAPIMethodClass()108 Class *GetTypeAPIMethodClass() 109 { 110 return typeapiMethodClass_; 111 } 112 GetTypeAPIParameterClass()113 Class *GetTypeAPIParameterClass() 114 { 115 return typeapiParameterClass_; 116 } 117 GetVoidClass()118 Class *GetVoidClass() 119 { 120 return voidClass_; 121 } 122 GetBoxBooleanClass()123 Class *GetBoxBooleanClass() 124 { 125 return boxBooleanClass_; 126 } 127 GetBoxByteClass()128 Class *GetBoxByteClass() 129 { 130 return boxByteClass_; 131 } 132 GetBoxCharClass()133 Class *GetBoxCharClass() 134 { 135 return boxCharClass_; 136 } 137 GetBoxShortClass()138 Class *GetBoxShortClass() 139 { 140 return boxShortClass_; 141 } 142 GetBoxIntClass()143 Class *GetBoxIntClass() 144 { 145 return boxIntClass_; 146 } 147 GetBoxLongClass()148 Class *GetBoxLongClass() 149 { 150 return boxLongClass_; 151 } 152 GetBoxFloatClass()153 Class *GetBoxFloatClass() 154 { 155 return boxFloatClass_; 156 } 157 GetBoxDoubleClass()158 Class *GetBoxDoubleClass() 159 { 160 return boxDoubleClass_; 161 } 162 FromCoreType(ClassLinkerExtension * ext)163 static EtsClassLinkerExtension *FromCoreType(ClassLinkerExtension *ext) 164 { 165 ASSERT(ext->GetLanguage() == panda_file::SourceLang::ETS); 166 return static_cast<EtsClassLinkerExtension *>(ext); 167 } 168 GetLanguageContext()169 LanguageContext GetLanguageContext() const 170 { 171 return langCtx_; 172 } 173 174 NO_COPY_SEMANTIC(EtsClassLinkerExtension); 175 NO_MOVE_SEMANTIC(EtsClassLinkerExtension); 176 177 private: 178 bool InitializeImpl(bool compressedStringEnabled) override; 179 180 Class *InitializeClass(ObjectHeader *objectHeader, const uint8_t *descriptor, size_t vtableSize, size_t imtSize, 181 size_t size); 182 183 Class *CreateClassRoot(const uint8_t *descriptor, ClassRoot root); 184 185 bool CacheClass(Class **classForCache, const char *descriptor); 186 187 class ErrorHandler : public ClassLinkerErrorHandler { 188 public: 189 void OnError(ClassLinker::Error error, const PandaString &message) override; 190 }; 191 192 ErrorHandler errorHandler_; 193 LanguageContext langCtx_ {nullptr}; 194 mem::HeapManager *heapManager_ {nullptr}; 195 196 // void class 197 Class *voidClass_ = nullptr; 198 199 // Box classes 200 Class *boxBooleanClass_ = nullptr; 201 Class *boxByteClass_ = nullptr; 202 Class *boxCharClass_ = nullptr; 203 Class *boxShortClass_ = nullptr; 204 Class *boxIntClass_ = nullptr; 205 Class *boxLongClass_ = nullptr; 206 Class *boxFloatClass_ = nullptr; 207 Class *boxDoubleClass_ = nullptr; 208 209 // Cached classes 210 Class *objectClass_ = nullptr; 211 Class *promiseClass_ = nullptr; 212 Class *arraybufClass_ = nullptr; 213 214 // Cached type API classes 215 Class *typeapiFieldClass_ = nullptr; 216 Class *typeapiMethodClass_ = nullptr; 217 Class *typeapiParameterClass_ = nullptr; 218 219 // Escompat classes 220 Class *sharedMemoryClass_ = nullptr; 221 }; 222 223 } // namespace panda::ets 224 225 #endif // !PANDA_PLUGINS_ETS_RUNTIME_ETS_CLASS_LINKER_EXTENSION_H 226