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