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