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