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