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
29namespace panda::ecmascript {
30struct ErrorParameter {
31    EcmaEntrypoint nativeConstructor{nullptr};
32    EcmaEntrypoint nativeMethod{nullptr};
33    std::string_view nativePropertyName{};
34    JSType nativeJstype{JSType::INVALID};
35};
36
37enum FunctionLength : uint8_t { ZERO = 0, ONE, TWO, THREE, FOUR };
38
39class Builtins {
40public:
41    Builtins() = default;
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
51private:
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