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