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