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