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 16 #ifndef ECMASCRIPT_BUILTINS_H 17 #define ECMASCRIPT_BUILTINS_H 18 19 #include "ecmascript/builtins/builtins_lazy_callback.h" 20 #include "ecmascript/global_env.h" 21 #include "ecmascript/js_function.h" 22 #include "ecmascript/js_handle.h" 23 #include "ecmascript/js_hclass.h" 24 #include "ecmascript/js_symbol.h" 25 #include "ecmascript/js_tagged_value.h" 26 #include "ecmascript/js_thread.h" 27 #include "ecmascript/object_factory.h" 28 29 namespace panda::ecmascript { 30 struct ErrorParameter { 31 EcmaEntrypoint nativeConstructor{nullptr}; 32 EcmaEntrypoint nativeMethod{nullptr}; 33 std::string_view nativePropertyName{}; 34 JSType nativeJstype{JSType::INVALID}; 35 }; 36 37 enum FunctionLength : uint8_t { ZERO = 0, ONE, TWO, THREE, FOUR }; 38 39 class Builtins { 40 public: 41 Builtins() = default; Builtins(JSThread * thread,ObjectFactory * factory,EcmaVM * vm)42 Builtins(JSThread *thread, ObjectFactory *factory, EcmaVM *vm) 43 : thread_(thread), factory_(factory), vm_(vm) {} 44 ~Builtins() = default; 45 NO_COPY_SEMANTIC(Builtins); 46 NO_MOVE_SEMANTIC(Builtins); 47 48 void Initialize(const JSHandle<GlobalEnv> &env, JSThread *thread, bool lazyInit = false, bool isRealm = false); 49 void InitializeForSnapshot(JSThread *thread); 50 51 void InitializeSharedBitVector(const JSHandle<GlobalEnv> &env, 52 const JSHandle<JSObject> &sObjPrototype, 53 const JSHandle<JSFunction> &sFuncPrototype) const; 54 private: 55 JSThread *thread_{nullptr}; 56 ObjectFactory *factory_{nullptr}; 57 EcmaVM *vm_{nullptr}; 58 SharedHeap *sHeap_{nullptr}; 59 60 JSHandle<JSFunction> NewBuiltinConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 61 EcmaEntrypoint ctorFunc, std::string_view name, int length, 62 kungfu::BuiltinsStubCSigns::ID builtinId = 63 kungfu::BuiltinsStubCSigns::INVALID) const; 64 65 JSHandle<JSFunction> NewBuiltinCjsCtor(const JSHandle<GlobalEnv> &env, 66 const JSHandle<JSObject> &prototype, EcmaEntrypoint ctorFunc, 67 std::string_view name, int length) const; 68 69 JSHandle<JSFunction> NewFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &key, 70 EcmaEntrypoint func, int length, 71 kungfu::BuiltinsStubCSigns::ID builtinId = 72 kungfu::BuiltinsStubCSigns::INVALID) const; 73 74 void InitializePropertyDetector(const JSHandle<GlobalEnv> &env, bool lazyInit) const; 75 76 void SetLazyAccessor(const JSHandle<JSObject> &object, const JSHandle<JSTaggedValue> &key, 77 const JSHandle<AccessorData> &accessor) const; 78 79 void InitializeCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 80 const JSHandle<JSFunction> &ctor, std::string_view name, int length) const; 81 82 void InitializeGlobalObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject); 83 84 void InitializeFunction(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 85 86 void InitializeFunctionPrototype(const JSHandle<GlobalEnv> &env, JSHandle<JSFunction> &funcFuncPrototype, 87 JSHandle<JSFunction> &funcFunc) const; 88 89 JSHandle<JSHClass> CreateFunctionHClass(const JSHandle<JSFunction> &funcPrototype) const; 90 91 JSHandle<JSHClass> CreateFunctionPrototypeHClass(const JSHandle<GlobalEnv> &env, 92 const JSHandle<JSTaggedValue> &ObjPrototypeVal) const; 93 94 void InitializeObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &objFuncPrototype, 95 const JSHandle<JSObject> &objFunc); 96 97 void InitializeNumber(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 98 const JSHandle<JSHClass> &primRefObjClass); 99 100 void InitializeBigInt(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjClass) const; 101 102 void InitializeBigIntWithRealm(const JSHandle<GlobalEnv> &realm) const; 103 104 void InitializeDate(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 105 void LazyInitializeDate(const JSHandle<GlobalEnv> &env) const; 106 107 void InitializeBoolean(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &primRefObjClass) const; 108 109 void InitializeSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 110 111 void InitializeSymbolWithRealm(const JSHandle<GlobalEnv> &realm, const JSHandle<JSHClass> &objFuncInstanceHClass); 112 113 void InitializeArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 114 115 JSHandle<JSObject> InitializeArrayPrototype(JSHandle<JSHClass> &arrBaseFuncInstanceHClass) const; 116 117 JSHandle<JSHClass> InitializeArrayPrototypeHClass(const JSHandle<JSObject> &arrFuncPrototype) const; 118 119 void InitializeSharedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &sObjIHClass, 120 JSHandle<JSFunction> &sFuncPrototype) const; 121 122 void InitializeTypedArray(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 123 void LazyInitializeTypedArray(const JSHandle<GlobalEnv> &env) const; 124 125 void InitializeInt8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 126 void LazyInitializeInt8Array(const JSHandle<GlobalEnv> &env) const; 127 128 void InitializeUint8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 129 void LazyInitializeUint8Array(const JSHandle<GlobalEnv> &env) const; 130 131 void InitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 132 void LazyInitializeUint8ClampedArray(const JSHandle<GlobalEnv> &env) const; 133 134 void InitializeInt16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 135 void LazyInitializeInt16Array(const JSHandle<GlobalEnv> &env) const; 136 137 void InitializeUint16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 138 void LazyInitializeUint16Array(const JSHandle<GlobalEnv> &env) const; 139 140 void InitializeInt32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 141 void LazyInitializeInt32Array(const JSHandle<GlobalEnv> &env) const; 142 143 void InitializeUint32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 144 void LazyInitializeUint32Array(const JSHandle<GlobalEnv> &env) const; 145 146 void InitializeFloat32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 147 void LazyInitializeFloat32Array(const JSHandle<GlobalEnv> &env) const; 148 149 void InitializeFloat64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 150 void LazyInitializeFloat64Array(const JSHandle<GlobalEnv> &env) const; 151 152 void InitializeBigInt64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 153 void LazyInitializeBigInt64Array(const JSHandle<GlobalEnv> &env) const; 154 155 void InitializeBigUint64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 156 void LazyInitializeBigUint64Array(const JSHandle<GlobalEnv> &env) const; 157 158 void InitializeAllTypeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 159 160 void InitializeAllTypeErrorWithRealm(const JSHandle<GlobalEnv> &realm) const; 161 162 void InitializeError(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass, 163 const JSType &errorTag) const; 164 165 void SetErrorWithRealm(const JSHandle<GlobalEnv> &realm, const JSType &errorTag) const; 166 167 void InitializeRegExp(const JSHandle<GlobalEnv> &env); 168 169 // for Intl. 170 JSHandle<JSFunction> NewIntlConstructor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 171 EcmaEntrypoint ctorFunc, std::string_view name, int length); 172 void InitializeIntlCtor(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &prototype, 173 const JSHandle<JSFunction> &ctor, std::string_view name, int length); 174 void InitializeIntl(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeValue); 175 void InitializeLocale(const JSHandle<GlobalEnv> &env); 176 void InitializeDateTimeFormat(const JSHandle<GlobalEnv> &env); 177 void InitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env); 178 void InitializeNumberFormat(const JSHandle<GlobalEnv> &env); 179 void InitializeCollator(const JSHandle<GlobalEnv> &env); 180 void InitializePluralRules(const JSHandle<GlobalEnv> &env); 181 void InitializeDisplayNames(const JSHandle<GlobalEnv> &env); 182 void InitializeListFormat(const JSHandle<GlobalEnv> &env); 183 void InitializeSegmenter(const JSHandle<GlobalEnv> &env); 184 void InitializeSegments(const JSHandle<GlobalEnv> &env); 185 186 void LazyInitializeLocale(const JSHandle<GlobalEnv> &env) const; 187 void LazyInitializeDateTimeFormat(const JSHandle<GlobalEnv> &env) const; 188 void LazyInitializeNumberFormat(const JSHandle<GlobalEnv> &env) const; 189 void LazyInitializeRelativeTimeFormat(const JSHandle<GlobalEnv> &env) const; 190 void LazyInitializeCollator(const JSHandle<GlobalEnv> &env) const; 191 void LazyInitializePluralRules(const JSHandle<GlobalEnv> &env) const; 192 void LazyInitializeDisplayNames(const JSHandle<GlobalEnv> &env) const; 193 void LazyInitializeListFormat(const JSHandle<GlobalEnv> &env) const; 194 void LazyInitializeSegmenter(const JSHandle<GlobalEnv> &env) const; 195 void LazyInitializeSegments(const JSHandle<GlobalEnv> &env) const; 196 197 void GeneralUpdateError(ErrorParameter *error, EcmaEntrypoint constructor, EcmaEntrypoint method, 198 std::string_view name, JSType type) const; 199 200 void InitializeSet(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 201 void LazyInitializeSet(const JSHandle<GlobalEnv> &env); 202 203 void InitializeMap(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 204 void LazyInitializeMap(const JSHandle<GlobalEnv> &env) const; 205 206 void InitializeWeakMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 207 void LazyInitializeWeakMap(const JSHandle<GlobalEnv> &env) const; 208 209 void InitializeWeakSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 210 void LazyInitializeWeakSet(const JSHandle<GlobalEnv> &env) const; 211 212 void InitializeWeakRef(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 213 void LazyInitializeWeakRef(const JSHandle<GlobalEnv> &env) const; 214 215 void InitializeFinalizationRegistry(const JSHandle<GlobalEnv> &env, 216 const JSHandle<JSHClass> &objFuncClass) const; 217 void LazyInitializeFinalizationRegistry(const JSHandle<GlobalEnv> &env) const; 218 219 void InitializeMath(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 220 221 void InitializeAtomics(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 222 223 void InitializeJson(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 224 225 void InitializeSendableJson(const JSHandle<GlobalEnv> &env, 226 const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 227 228 void InitializeString(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 229 230 void InitializeIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 231 232 void InitializeRegexpIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 233 234 void InitializeStringIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 235 236 void InitializeSegmentIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 237 238 void InitializeAsyncFromSyncIterator(const JSHandle<GlobalEnv> &env, 239 const JSHandle<JSHClass> &iteratorFuncClass) const; 240 241 void InitializeForinIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 242 243 void InitializeMapIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 244 void InitializeSMapIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 245 246 void InitializeSetIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 247 void InitializeSSetIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 248 249 void InitializeArrayIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass, 250 const JSHandle<JSHClass> &iteratorPrototypeClass) const; 251 void InitializeSArrayIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &iteratorFuncClass) const; 252 253 void InitializeArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 254 void LazyInitializeArrayBuffer(const JSHandle<GlobalEnv> &env) const; 255 256 void InitializeSharedArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 257 void LazyInitializeSharedArrayBuffer(const JSHandle<GlobalEnv> &env) const; 258 259 void InitializeDataView(const JSHandle<GlobalEnv> &env, JSHandle<JSTaggedValue> objFuncPrototypeVal) const; 260 void LazyInitializeDataView(const JSHandle<GlobalEnv> &env) const; 261 262 void InitializeForPromiseFuncClass(const JSHandle<GlobalEnv> &env); 263 264 void InitializeProxy(const JSHandle<GlobalEnv> &env); 265 266 void InitializeReflect(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &objFuncPrototypeVal) const; 267 268 void InitializeAsyncFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 269 270 void InitializeGeneratorFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 271 272 void InitializeAsyncGeneratorFunction(const JSHandle<GlobalEnv> &env, 273 const JSHandle<JSHClass> &objFuncClass) const; 274 275 void InitializeAsyncGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 276 277 void InitializeAsyncIterator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 278 279 void InitializeGenerator(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 280 281 JSHandle<JSFunction> InitializeExoticConstructor(const JSHandle<GlobalEnv> &env, EcmaEntrypoint ctorFunc, 282 std::string_view name, int length); 283 284 void InitializePromise(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &promiseFuncClass); 285 286 void InitializePromiseJob(const JSHandle<GlobalEnv> &env); 287 288 void InitializeModuleNamespace(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 289 290 void InitializeSModuleNamespace(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &sObjIHClass) const; 291 292 void InitializeNativeModuleFailureInfo(const JSHandle<GlobalEnv> &env, 293 const JSHandle<JSHClass> &objFuncClass) const; 294 295 void InitializeCjsModule(const JSHandle<GlobalEnv> &env) const; 296 297 void InitializeCjsExports(const JSHandle<GlobalEnv> &env) const; 298 299 void InitializeCjsRequire(const JSHandle<GlobalEnv> &env) const; 300 301 void InitializeDefaultExportOfScript(const JSHandle<GlobalEnv> &env) const; 302 303 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 304 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 305 kungfu::BuiltinsStubCSigns::INVALID) const; 306 307 void SetFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 308 EcmaEntrypoint func, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 309 kungfu::BuiltinsStubCSigns::INVALID) const; 310 311 JSHandle<JSFunction> SetAndReturnFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 312 const char *key, EcmaEntrypoint func, int length, 313 kungfu::BuiltinsStubCSigns::ID builtinId = 314 kungfu::BuiltinsStubCSigns::INVALID) const ; 315 316 JSHandle<JSFunction> SetAndReturnFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 317 const JSHandle<JSTaggedValue> &key, EcmaEntrypoint func, int length, 318 kungfu::BuiltinsStubCSigns::ID builtinId = 319 kungfu::BuiltinsStubCSigns::INVALID) const; 320 321 void SetFuncToObjAndGlobal(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &globalObject, 322 const JSHandle<JSObject> &obj, std::string_view key, EcmaEntrypoint func, int length, 323 kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID); 324 325 template<int type = JSSymbol::SYMBOL_DEFAULT_TYPE> 326 void SetFunctionAtSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 327 const JSHandle<JSTaggedValue> &symbol, std::string_view name, EcmaEntrypoint func, 328 int length) const; 329 330 template<int type = JSSymbol::SYMBOL_DEFAULT_TYPE> 331 JSHandle<JSTaggedValue> SetAndReturnFunctionAtSymbol(const JSHandle<GlobalEnv> &env, 332 const JSHandle<JSObject> &obj, 333 const JSHandle<JSTaggedValue> &symbol, 334 std::string_view name, 335 EcmaEntrypoint func, 336 int length, 337 kungfu::BuiltinsStubCSigns::ID builtinId = 338 kungfu::BuiltinsStubCSigns::INVALID) const; 339 340 void SetStringTagSymbol(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 341 std::string_view key) const; 342 JSHandle<JSTaggedValue> CreateGetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 343 std::string_view name, int length) const; 344 JSHandle<JSTaggedValue> CreateGetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 345 JSHandle<JSTaggedValue> key, int length) const; 346 347 void SetConstant(const JSHandle<JSObject> &obj, std::string_view key, JSTaggedValue value) const; 348 349 void SetGlobalThis(const JSHandle<JSObject> &obj, std::string_view key, 350 const JSHandle<JSTaggedValue> &globalValue); 351 352 void SetAttribute(const JSHandle<JSObject> &obj, std::string_view key, std::string_view value) const; 353 354 void SetNoneAttributeProperty(const JSHandle<JSObject> &obj, std::string_view key, 355 const JSHandle<JSTaggedValue> &value) const; 356 357 void StrictModeForbiddenAccessCallerArguments(const JSHandle<GlobalEnv> &env, uint32_t &index, 358 const JSHandle<JSObject> &prototype) const; 359 void SetInlineAccessor(const JSHandle<JSObject> &obj, uint32_t index, 360 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 361 362 void SetInlineFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 363 const JSHandle<JSTaggedValue> &key, EcmaEntrypoint func, uint32_t index, int length, 364 kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; 365 366 void SetInlineFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 367 EcmaEntrypoint func, uint32_t index, int length, 368 kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; 369 370 JSHandle<JSFunction> SetInlineFunctionAndRetJSFunction(const JSHandle<GlobalEnv> &env, 371 const JSHandle<JSObject> &obj, std::string_view key, 372 EcmaEntrypoint func, uint32_t index, int length, 373 kungfu::BuiltinsStubCSigns::ID builtinId) const; 374 375 void SetFunctionPrototype(const JSHandle<JSFunction> &ctor, const JSTaggedValue &prototype) const; 376 377 void SetFunctionLength(const JSHandle<JSFunction> &ctor, int length) const; 378 379 void SetFunctionName(const JSHandle<JSFunction> &ctor, std::string_view name) const; 380 381 void SetFunctionName(const JSHandle<JSFunction> &ctor, const JSHandle<JSTaggedValue> &name) const; 382 383 JSHandle<JSTaggedValue> CreateSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 384 std::string_view name, int length) const; 385 JSHandle<JSTaggedValue> CreateSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 386 JSHandle<JSTaggedValue> key, int length) const; 387 388 void SetArgumentsSharedAccessor(const JSHandle<GlobalEnv> &env); 389 void SetAccessor(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 390 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 391 void SetGetter(const JSHandle<JSObject> &obj, const JSHandle<JSTaggedValue> &key, 392 const JSHandle<JSTaggedValue> &getter) const; 393 JSHandle<JSObject> InitializeArkTools(const JSHandle<GlobalEnv> &env) const; 394 JSHandle<JSObject> InitializeGcBuiltins(const JSHandle<GlobalEnv> &env) const; 395 void InitializeGlobalRegExp(JSHandle<JSObject> &obj) const; 396 // Using to initialize jsapi container 397 JSHandle<JSObject> InitializeArkPrivate(const JSHandle<GlobalEnv> &env) const; 398 void SetConstantObject(const JSHandle<JSObject> &obj, std::string_view key, 399 JSHandle<JSTaggedValue> &value) const; 400 void SetFrozenFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 401 EcmaEntrypoint func, int length) const; 402 void SetNonConstantObject(const JSHandle<JSObject> &obj, std::string_view key, 403 JSHandle<JSTaggedValue> &value) const; 404 void RegisterSendableContainers(const JSHandle<GlobalEnv> &env) const; 405 406 // For SharedObject/SharedFunction 407 void InitializeSObjectAndSFunction(const JSHandle<GlobalEnv> &env) const; 408 void CopySObjectAndSFunction(const JSHandle<GlobalEnv> &env, const JSTaggedValue &srcEnv) const; 409 void InitializeSObject(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &sObjIHClass, 410 const JSHandle<JSObject> &sObjPrototype, 411 const JSHandle<JSFunction> &sFuncPrototype) const; 412 void InitializeSFunction(const JSHandle<GlobalEnv> &env, 413 const JSHandle<JSFunction> &sFuncPrototype) const; 414 void InitializeSAsyncFunction(const JSHandle<GlobalEnv> &env, 415 const JSHandle<JSHClass> &sObjIHClass) const; 416 void InitializeSArrayBuffer(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &objFuncClass, 417 const JSHandle<JSFunction> &sFuncPrototype) const; 418 void InitializeSSet(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &sObjPrototype, 419 const JSHandle<JSFunction> &sFuncPrototype) const; 420 void InitializeSMap(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &sObjPrototype, 421 const JSHandle<JSFunction> &sFuncPrototype) const; 422 void InitializeSTypedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &sObjPrototype, 423 const JSHandle<JSFunction> &sFuncPrototype) const; 424 void InitializeSInt8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 425 void InitializeSUint8Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 426 void InitializeSUint8ClampedArray(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 427 void InitializeSInt16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 428 void InitializeSUint16Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 429 void InitializeSInt32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 430 void InitializeSUint32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 431 void InitializeSFloat32Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 432 void InitializeSFloat64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 433 void InitializeSBigInt64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 434 void InitializeSBigUint64Array(const JSHandle<GlobalEnv> &env, const JSHandle<JSHClass> &objFuncClass) const; 435 436 JSHandle<JSHClass> CreateSObjectFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 437 JSHandle<JSHClass> CreateSObjectPrototypeHClass() const; 438 JSHandle<JSHClass> CreateSFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 439 JSHandle<JSHClass> CreateSFunctionPrototypeHClass(const JSHandle<JSTaggedValue> &sObjPrototypeVal) const; 440 JSHandle<JSHClass> CreateSSetPrototypeHClass(const JSHandle<JSObject> &sObjPrototype) const; 441 JSHandle<JSHClass> CreateSSetFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 442 JSHandle<JSHClass> CreateSMapPrototypeHClass(const JSHandle<JSObject> &sObjPrototype) const; 443 JSHandle<JSHClass> CreateBitVectorPrototypeHClass(const JSHandle<JSObject> &sObjPrototype) const; 444 JSHandle<JSHClass> CreateSMapFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 445 JSHandle<JSHClass> CreateBitVectorFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 446 JSHandle<JSHClass> CreateSArrayPrototypeHClass(const JSHandle<JSObject> &sObjPrototype) const; 447 JSHandle<JSHClass> CreateSArrayFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 448 JSHandle<JSHClass> CreateSTypedArrayPrototypeHClass(const JSHandle<JSObject> &sObjPrototype) const; 449 JSHandle<JSHClass> CreateSTypedArrayFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 450 JSHandle<JSHClass> CreateSSpecificTypedArrayFuncHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 451 JSHandle<JSHClass> CreateSSpecificTypedArrayInstanceHClass(const JSHandle<JSObject> &sObjPrototype) const; 452 JSHandle<JSHClass> CreateSArrayBufferPrototypeHClass(const JSHandle<JSObject> &sObjPrototype) const; 453 JSHandle<JSHClass> CreateSArrayBufferFunctionHClass(const JSHandle<JSFunction> &sFuncPrototype) const; 454 455 void InitializeSCtor(const JSHandle<JSHClass> &protoHClass, const JSHandle<JSFunction> &ctor, 456 std::string_view name, int length) const; 457 458 void SetSFunctionName(const JSHandle<JSFunction> &ctor, std::string_view name) const; 459 void SetSFunctionName(const JSHandle<JSFunction> &ctor, const JSHandle<JSTaggedValue> &name) const; 460 void SetSFunctionLength(const JSHandle<JSFunction> &ctor, int length) const; 461 void SetSFunctionPrototype(const JSHandle<JSFunction> &ctor, const JSTaggedValue &prototype) const; 462 463 JSHandle<JSFunction> NewSFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSTaggedValue> &key, 464 EcmaEntrypoint func, int length, 465 kungfu::BuiltinsStubCSigns::ID builtinId = 466 kungfu::BuiltinsStubCSigns::INVALID) const; 467 468 void SetSFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, std::string_view key, 469 EcmaEntrypoint func, uint32_t index, int length, kungfu::BuiltinsStubCSigns::ID builtinId = 470 kungfu::BuiltinsStubCSigns::INVALID) const; 471 472 void SetSFunction(const JSHandle<GlobalEnv> &env, const JSHandle<JSObject> &obj, 473 const JSHandle<JSTaggedValue> &key, EcmaEntrypoint func, uint32_t index, int length, 474 kungfu::BuiltinsStubCSigns::ID builtinId = kungfu::BuiltinsStubCSigns::INVALID) const; 475 void SetSAccessor(const JSHandle<JSObject> &obj, uint32_t index, 476 const JSHandle<JSTaggedValue> &getter, const JSHandle<JSTaggedValue> &setter) const; 477 478 JSHandle<JSTaggedValue> CreateSGetterSetter(const JSHandle<GlobalEnv> &env, EcmaEntrypoint func, 479 std::string_view name, int length) const; 480 void SharedStrictModeForbiddenAccessCallerArguments(const JSHandle<GlobalEnv> &env, uint32_t &index, 481 const JSHandle<JSObject> &prototype) const; 482 JSHandle<JSTaggedValue> CreateArrayUnscopables(JSThread *thread) const; 483 void InitializeSSymbolAttributes(const JSHandle<GlobalEnv> &env); 484 friend class builtins::BuiltinsLazyCallback; 485 }; 486 } // namespace panda::ecmascript 487 #endif // ECMASCRIPT_BUILTINS_H 488