• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 #include "ecmascript/jspandafile/program_object.h"
17 #include "ecmascript/layout_info-inl.h"
18 #include "ecmascript/mem/heap-inl.h"
19 #include "ecmascript/symbol_table.h"
20 #include "ecmascript/jspandafile/program_object.h"
21 
22 // class Object;
23 namespace panda::ecmascript {
NewSObjectHook() const24 void ObjectFactory::NewSObjectHook() const
25 {
26     CHECK_NO_HEAP_ALLOC;
27 #ifndef NDEBUG
28     static std::atomic<uint32_t> count = 0;
29     static uint32_t frequency = vm_->GetJSOptions().GetForceSharedGCFrequency();
30     static constexpr uint32_t CONCURRENT_MARK_FREQUENCY_FACTOR = 2;
31     if (frequency == 0 || !vm_->GetJSOptions().EnableForceGC() || !vm_->IsInitialized() ||
32         !thread_->IsAllContextsInitialized()) {
33         return;
34     }
35     if (count++ % frequency == 0) {
36         if (count % (CONCURRENT_MARK_FREQUENCY_FACTOR * frequency) == 0) {
37             sHeap_->CollectGarbage<TriggerGCType::SHARED_GC, GCReason::OTHER>(thread_);
38         } else if (sHeap_->CheckCanTriggerConcurrentMarking(thread_)) {
39             sHeap_->TriggerConcurrentMarking<TriggerGCType::SHARED_GC, GCReason::OTHER>(thread_);
40         }
41         if (!ecmascript::AnFileDataManager::GetInstance()->IsEnable()) {
42             if (count % (CONCURRENT_MARK_FREQUENCY_FACTOR * frequency) == 0) {
43                 sHeap_->WaitGCFinished(thread_);
44                 sHeap_->CollectGarbage<TriggerGCType::SHARED_FULL_GC, GCReason::OTHER>(thread_);
45             } else if (sHeap_->CheckCanTriggerConcurrentMarking(thread_)) {
46                 sHeap_->TriggerConcurrentMarking<TriggerGCType::SHARED_PARTIAL_GC, GCReason::OTHER>(thread_);
47             }
48         }
49     }
50 #endif
51 }
52 
CreateSFunctionClass(uint32_t size,JSType type,const JSHandle<JSTaggedValue> & prototype,bool isAccessor,bool setProto)53 JSHandle<JSHClass> ObjectFactory::CreateSFunctionClass(uint32_t size, JSType type,
54                                                        const JSHandle<JSTaggedValue> &prototype,
55                                                        bool isAccessor, bool setProto)
56 {
57     const GlobalEnvConstants *globalConst = thread_->GlobalConstants();
58     uint32_t fieldOrder = 0;
59     ASSERT(JSFunction::LENGTH_INLINE_PROPERTY_INDEX == fieldOrder);
60     PropertyAttributes attributes = PropertyAttributes::Default(false, false, false);
61     attributes.SetIsAccessor(isAccessor);
62     attributes.SetIsInlinedProps(true);
63     attributes.SetRepresentation(Representation::TAGGED);
64     JSHandle<LayoutInfo> layoutInfoHandle = CreateSLayoutInfo(JSFunction::LENGTH_OF_INLINE_PROPERTIES);
65     {
66         attributes.SetOffset(fieldOrder);
67         layoutInfoHandle->AddKey(thread_, fieldOrder, globalConst->GetLengthString(), attributes);
68         fieldOrder++;
69     }
70 
71     ASSERT(JSFunction::NAME_INLINE_PROPERTY_INDEX == fieldOrder);
72     {
73         attributes.SetOffset(fieldOrder);
74         layoutInfoHandle->AddKey(thread_, fieldOrder,
75                                  globalConst->GetHandledNameString().GetTaggedValue(), attributes);
76         fieldOrder++;
77     }
78     if (setProto) {
79         ASSERT(JSFunction::PROTOTYPE_INLINE_PROPERTY_INDEX == fieldOrder);
80         {
81             attributes.SetOffset(fieldOrder);
82             layoutInfoHandle->AddKey(thread_, fieldOrder,
83                                      globalConst->GetPrototypeString(), attributes);
84             fieldOrder++;
85         }
86     }
87     JSHandle<JSHClass> functionClass = NewSEcmaHClass(size, fieldOrder, type, prototype,
88         JSHandle<JSTaggedValue>(layoutInfoHandle));
89     functionClass->SetCallable(true);
90     return functionClass;
91 }
92 
NewSEcmaHClass(uint32_t size,JSType type,uint32_t inlinedProps)93 JSHandle<JSHClass> ObjectFactory::NewSEcmaHClass(uint32_t size, JSType type, uint32_t inlinedProps)
94 {
95     return NewSEcmaHClass(JSHClass::Cast(thread_->GlobalConstants()->GetHClassClass().GetTaggedObject()),
96                           size, type, inlinedProps);
97 }
98 
NewSEcmaHClass(JSHClass * hclass,uint32_t size,JSType type,uint32_t inlinedProps)99 JSHandle<JSHClass> ObjectFactory::NewSEcmaHClass(JSHClass *hclass, uint32_t size, JSType type, uint32_t inlinedProps)
100 {
101     NewSObjectHook();
102     uint32_t classSize = JSHClass::SIZE;
103     auto *newClass = static_cast<JSHClass *>(sHeap_->AllocateNonMovableOrHugeObject(thread_, hclass, classSize));
104     newClass->Initialize(thread_, size, type, inlinedProps, thread_->GlobalConstants()->GetHandledEmptySLayoutInfo());
105     return JSHandle<JSHClass>(thread_, newClass);
106 }
107 
108 // This function don't UpdateProtoClass
NewSEcmaHClass(uint32_t size,uint32_t inlinedProps,JSType type,const JSHandle<JSTaggedValue> & prototype,const JSHandle<JSTaggedValue> & layout)109 JSHandle<JSHClass> ObjectFactory::NewSEcmaHClass(uint32_t size, uint32_t inlinedProps, JSType type,
110     const JSHandle<JSTaggedValue> &prototype, const JSHandle<JSTaggedValue> &layout)
111 {
112     NewSObjectHook();
113     uint32_t classSize = JSHClass::SIZE;
114     auto *newClass = static_cast<JSHClass *>(sHeap_->AllocateNonMovableOrHugeObject(
115         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetHClassClass().GetTaggedObject()), classSize));
116     newClass->Initialize(thread_, size, type, inlinedProps, layout);
117     JSHandle<JSHClass> hclass(thread_, newClass);
118     if (prototype->IsJSObject()) {
119         prototype->GetTaggedObject()->GetClass()->SetIsPrototype(true);
120     }
121     hclass->SetProto(thread_, prototype.GetTaggedValue());
122     hclass->SetNumberOfProps(inlinedProps);
123     hclass->SetExtensible(false);
124     return hclass;
125 }
126 
NewSEcmaHClassDictMode(uint32_t size,uint32_t inlinedProps,JSType type,const JSHandle<JSTaggedValue> & prototype)127 JSHandle<JSHClass> ObjectFactory::NewSEcmaHClassDictMode(uint32_t size, uint32_t inlinedProps, JSType type,
128                                                          const JSHandle<JSTaggedValue> &prototype)
129 {
130     NewSObjectHook();
131     uint32_t classSize = JSHClass::SIZE;
132     auto *newClass = static_cast<JSHClass *>(sHeap_->AllocateNonMovableOrHugeObject(thread_,
133         JSHClass::Cast(thread_->GlobalConstants()->GetHClassClass().GetTaggedObject()), classSize));
134     newClass->Initialize(thread_, size, type, inlinedProps, thread_->GlobalConstants()->GetHandledEmptySLayoutInfo());
135     JSHandle<JSHClass> hclass(thread_, newClass);
136     if (prototype->IsJSObject()) {
137         prototype->GetTaggedObject()->GetClass()->SetIsPrototype(true);
138     }
139     hclass->SetProto(thread_, prototype.GetTaggedValue());
140     hclass->SetNumberOfProps(0);
141     hclass->SetIsDictionaryMode(true);
142     hclass->SetExtensible(false);
143     return hclass;
144 }
145 
NewSEcmaHClassClass(JSHClass * hclass,uint32_t size,JSType type)146 JSHandle<JSHClass> ObjectFactory::NewSEcmaHClassClass(JSHClass *hclass, uint32_t size, JSType type)
147 {
148     NewSObjectHook();
149     uint32_t classSize = JSHClass::SIZE;
150     auto *newClass = static_cast<JSHClass *>(sHeap_->AllocateClassClass(thread_, hclass, classSize));
151     newClass->Initialize(thread_, size, type, 0, thread_->GlobalConstants()->GetHandledEmptySLayoutInfo());
152     return JSHandle<JSHClass>(thread_, newClass);
153 }
154 
NewSEcmaReadOnlyHClass(JSHClass * hclass,uint32_t size,JSType type,uint32_t inlinedProps)155 JSHandle<JSHClass> ObjectFactory::NewSEcmaReadOnlyHClass(JSHClass *hclass, uint32_t size, JSType type,
156                                                          uint32_t inlinedProps)
157 {
158     NewSObjectHook();
159     uint32_t classSize = JSHClass::SIZE;
160     auto *newClass = static_cast<JSHClass *>(sHeap_->AllocateReadOnlyOrHugeObject(thread_, hclass, classSize));
161     ASSERT(newClass != nullptr);
162     newClass->Initialize(thread_, size, type, inlinedProps, thread_->GlobalConstants()->GetHandledEmptySLayoutInfo());
163     return JSHandle<JSHClass>(thread_, newClass);
164 }
165 
InitSClassClass()166 JSHandle<JSHClass> ObjectFactory::InitSClassClass()
167 {
168     JSHandle<JSHClass> hClassHandle = NewSEcmaHClassClass(nullptr, JSHClass::SIZE, JSType::HCLASS);
169     JSHClass *hclass = reinterpret_cast<JSHClass *>(hClassHandle.GetTaggedValue().GetTaggedObject());
170     hclass->SetClass(thread_, hclass);
171     return hClassHandle;
172 }
173 
NewSAccessorData()174 JSHandle<AccessorData> ObjectFactory::NewSAccessorData()
175 {
176     NewSObjectHook();
177     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(
178         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetAccessorDataClass().GetTaggedObject()));
179     JSHandle<AccessorData> acc(thread_, AccessorData::Cast(header));
180     acc->SetGetter(thread_, JSTaggedValue::Undefined());
181     acc->SetSetter(thread_, JSTaggedValue::Undefined());
182     return acc;
183 }
184 
NewSMethod(const JSPandaFile * jsPandaFile,MethodLiteral * methodLiteral,JSHandle<ConstantPool> constpool,uint32_t entryIndex,bool needSetAotFlag,bool * canFastCall)185 JSHandle<Method> ObjectFactory::NewSMethod(const JSPandaFile *jsPandaFile, MethodLiteral *methodLiteral,
186                                            JSHandle<ConstantPool> constpool, uint32_t entryIndex,
187                                            bool needSetAotFlag, bool *canFastCall)
188 {
189     JSHandle<Method> method;
190     if (jsPandaFile->IsNewVersion()) {
191         method = Method::Create(thread_, jsPandaFile, methodLiteral);
192     } else {
193         method = NewSMethod(methodLiteral);
194         method->SetConstantPool(thread_, constpool);
195     }
196     if (needSetAotFlag) {
197         auto aotFileManager = thread_->GetEcmaVM()->GetAOTFileManager();
198         aotFileManager->SetAOTFuncEntry(jsPandaFile, nullptr, *method, entryIndex, canFastCall);
199     } else {
200         method->InitInterpreterStatusForCompiledMethod(thread_);
201     }
202     return method;
203 }
204 
NewSMethod(const MethodLiteral * methodLiteral,MemSpaceType spaceType)205 JSHandle<Method> ObjectFactory::NewSMethod(const MethodLiteral *methodLiteral, MemSpaceType spaceType)
206 {
207     ASSERT(spaceType == SHARED_READ_ONLY_SPACE ||
208            spaceType == SHARED_NON_MOVABLE ||
209            spaceType == SHARED_OLD_SPACE);
210     NewSObjectHook();
211     TaggedObject *header = nullptr;
212     if (spaceType == SHARED_READ_ONLY_SPACE) {
213         header = sHeap_->AllocateReadOnlyOrHugeObject(thread_,
214             JSHClass::Cast(thread_->GlobalConstants()->GetMethodClass().GetTaggedObject()));
215     } else if (spaceType == SHARED_NON_MOVABLE) {
216         header = sHeap_->AllocateNonMovableOrHugeObject(thread_,
217             JSHClass::Cast(thread_->GlobalConstants()->GetMethodClass().GetTaggedObject()));
218     } else {
219         header = sHeap_->AllocateOldOrHugeObject(thread_,
220             JSHClass::Cast(thread_->GlobalConstants()->GetMethodClass().GetTaggedObject()));
221     }
222     JSHandle<Method> method(thread_, header);
223     InitializeMethod(methodLiteral, method);
224     return method;
225 }
226 
NewSMethodForNativeFunction(const void * func,FunctionKind kind,kungfu::BuiltinsStubCSigns::ID builtinId,MemSpaceType spaceType)227 JSHandle<Method> ObjectFactory::NewSMethodForNativeFunction(const void *func, FunctionKind kind,
228                                                             kungfu::BuiltinsStubCSigns::ID builtinId,
229                                                             MemSpaceType spaceType)
230 {
231     uint32_t numArgs = 2;  // function object and this
232     auto method = NewSMethod(nullptr, spaceType);
233     method->SetNativePointer(const_cast<void *>(func));
234     method->SetNativeBit(true);
235     if (builtinId != kungfu::BuiltinsStubCSigns::INVALID) {
236         bool isFast = kungfu::BuiltinsStubCSigns::IsFastBuiltin(builtinId);
237         method->SetFastBuiltinBit(isFast);
238         method->SetBuiltinId(static_cast<uint8_t>(builtinId));
239     }
240     method->SetNumArgsWithCallField(numArgs);
241     method->SetFunctionKind(kind);
242     return method;
243 }
244 
NewSFunctionByHClass(const JSHandle<Method> & method,const JSHandle<JSHClass> & hclass)245 JSHandle<JSFunction> ObjectFactory::NewSFunctionByHClass(const JSHandle<Method> &method,
246                                                          const JSHandle<JSHClass> &hclass)
247 {
248     JSHandle<JSFunction> function(NewSharedOldSpaceJSObject(hclass));
249     hclass->SetCallable(true);
250     JSFunction::InitializeSFunction(thread_, function, method->GetFunctionKind());
251     function->SetMethod(thread_, method);
252     function->SetTaskConcurrentFuncFlag(0); // 0 : default value
253     if (method->IsNativeWithCallField()) {
254         SetNativePointerToFunctionFromMethod(JSHandle<JSFunctionBase>::Cast(function), method);
255     } else if (method->IsAotWithCallField()) {
256         thread_->GetEcmaVM()->GetAOTFileManager()->
257             SetAOTFuncEntry(method->GetJSPandaFile(), *function, *method);
258     } else {
259         SetCodeEntryToFunctionFromMethod(function, method);
260     }
261     return function;
262 }
263 
NewNativeSFunctionByHClass(const JSHandle<JSHClass> & hclass,const void * nativeFunc,FunctionKind kind)264 JSHandle<JSFunction> ObjectFactory::NewNativeSFunctionByHClass(const JSHandle<JSHClass> &hclass,
265                                                                const void *nativeFunc,
266                                                                FunctionKind kind)
267 {
268     JSHandle<JSFunction> function(NewSharedOldSpaceJSObject(hclass));
269     hclass->SetCallable(true);
270     JSFunction::InitializeSFunction(thread_, function, kind);
271     function->SetMethod(thread_, GetReadOnlyMethodForNativeFunction(kind));
272     function->SetNativePointer(const_cast<void *>(nativeFunc));
273     function->SetTaskConcurrentFuncFlag(0); // 0 : default value
274     return function;
275 }
276 
277 // new function with name/length accessor
NewSFunctionWithAccessor(const void * func,const JSHandle<JSHClass> & hclass,FunctionKind kind,kungfu::BuiltinsStubCSigns::ID builtinId,MemSpaceType spaceType)278 JSHandle<JSFunction> ObjectFactory::NewSFunctionWithAccessor(const void *func, const JSHandle<JSHClass> &hclass,
279     FunctionKind kind, kungfu::BuiltinsStubCSigns::ID builtinId, MemSpaceType spaceType)
280 {
281     ASSERT(spaceType == SHARED_NON_MOVABLE || spaceType == SHARED_OLD_SPACE);
282     if (builtinId != kungfu::BuiltinsStubCSigns::INVALID) {
283         JSHandle<Method> method = NewSMethodForNativeFunction(func, kind, builtinId, spaceType);
284         return NewSFunctionByHClass(method, hclass);
285     }
286     return NewNativeSFunctionByHClass(hclass, func, kind);
287 }
288 
289 // new function without name/length accessor
NewSFunctionByHClass(const void * func,const JSHandle<JSHClass> & hclass,FunctionKind kind,kungfu::BuiltinsStubCSigns::ID builtinId,MemSpaceType spaceType)290 JSHandle<JSFunction> ObjectFactory::NewSFunctionByHClass(const void *func, const JSHandle<JSHClass> &hclass,
291     FunctionKind kind, kungfu::BuiltinsStubCSigns::ID builtinId, MemSpaceType spaceType)
292 {
293     ASSERT(spaceType == SHARED_NON_MOVABLE || spaceType == SHARED_OLD_SPACE);
294     JSHandle<JSFunction> function(NewSharedOldSpaceJSObject(hclass));
295     hclass->SetCallable(true);
296     JSFunction::InitializeWithDefaultValue(thread_, function);
297     if (builtinId != kungfu::BuiltinsStubCSigns::INVALID) {
298         JSHandle<Method> method = NewSMethodForNativeFunction(func, kind, builtinId, spaceType);
299         function->SetMethod(thread_, method);
300     } else {
301         function->SetMethod(thread_, GetReadOnlyMethodForNativeFunction(kind));
302     }
303     function->SetNativePointer(const_cast<void *>(func));
304     return function;
305 }
306 
NewSharedOldSpaceObject(const JSHandle<JSHClass> & hclass)307 TaggedObject *ObjectFactory::NewSharedOldSpaceObject(const JSHandle<JSHClass> &hclass)
308 {
309     NewSObjectHook();
310     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_, *hclass);
311     if (header == nullptr) {
312         LOG_ECMA(FATAL) << "ObjectFactory::NewSharedOldSpaceObject:header is nullptr";
313     }
314     uint32_t inobjPropCount = hclass->GetInlinedProperties();
315     if (inobjPropCount > 0) {
316         InitializeExtraProperties(hclass, header, inobjPropCount);
317     }
318     return header;
319 }
320 
NewSharedOldSpaceJSObjectWithInit(const JSHandle<JSHClass> & jshclass)321 JSHandle<JSObject> ObjectFactory::NewSharedOldSpaceJSObjectWithInit(const JSHandle<JSHClass> &jshclass)
322 {
323     auto obj = NewSharedOldSpaceJSObject(jshclass);
324     InitializeJSObject(obj, jshclass);
325     return obj;
326 }
327 
NewSharedOldSpaceJSObject(const JSHandle<JSHClass> & jshclass)328 JSHandle<JSObject> ObjectFactory::NewSharedOldSpaceJSObject(const JSHandle<JSHClass> &jshclass)
329 {
330     JSHandle<JSObject> obj(thread_, JSObject::Cast(NewSharedOldSpaceObject(jshclass)));
331     JSHandle<TaggedArray> emptyArray = SharedEmptyArray();
332     obj->InitializeHash();
333     obj->SetElements(thread_, emptyArray);
334     obj->SetProperties(thread_, emptyArray);
335     return obj;
336 }
337 
CreateSObjectWithProperties(std::vector<PropertyDescriptor> & descs)338 JSHandle<JSTaggedValue> ObjectFactory::CreateSObjectWithProperties(std::vector<PropertyDescriptor> &descs)
339 {
340     JSHandle<JSHClass> hclass = JSHClass::CreateSHClass(thread_, descs);
341     JSHandle<JSObject> object = NewSharedOldSpaceJSObject(hclass);
342     JSObject::SetSProperties(thread_, object, descs);
343     JSHandle<GlobalEnv> env = vm_->GetGlobalEnv();
344     JSHandle<JSTaggedValue> objFuncProto = env->GetSObjectFunctionPrototype();
345     hclass->SetPrototype(thread_, objFuncProto);
346     hclass->SetExtensible(false);
347     return JSHandle<JSTaggedValue>(object);
348 }
349 
SharedEmptyArray() const350 JSHandle<TaggedArray> ObjectFactory::SharedEmptyArray() const
351 {
352     return JSHandle<TaggedArray>(thread_->GlobalConstants()->GetHandledEmptyArray());
353 }
354 
CopySArray(const JSHandle<TaggedArray> & old,uint32_t oldLength,uint32_t newLength,JSTaggedValue initVal,ElementsKind kind)355 JSHandle<TaggedArray> ObjectFactory::CopySArray(const JSHandle<TaggedArray> &old, uint32_t oldLength,
356                                                 uint32_t newLength, JSTaggedValue initVal, ElementsKind kind)
357 {
358     if (newLength == 0) {
359         return SharedEmptyArray();
360     }
361     if (newLength > oldLength) {
362         return ExtendSArray(old, newLength, initVal, kind);
363     }
364 
365     NewObjectHook();
366     // Shared-array does not support Mutantarray yet.
367     ASSERT(!old->GetClass()->IsMutantTaggedArray());
368 
369     size_t size = TaggedArray::ComputeSize(JSTaggedValue::TaggedTypeSize(), newLength);
370     JSHClass *arrayClass = JSHClass::Cast(thread_->GlobalConstants()->GetArrayClass().GetTaggedObject());
371     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_, arrayClass, size);
372     JSHandle<TaggedArray> newArray(thread_, header);
373     newArray->SetLength(newLength);
374     newArray->SetExtraLength(old->GetExtraLength());
375 
376     for (uint32_t i = 0; i < newLength; i++) {
377         newArray->Set(thread_, i, old->Get(i));
378     }
379 
380     return newArray;
381 }
382 
ExtendSArray(const JSHandle<TaggedArray> & old,uint32_t length,JSTaggedValue initVal,ElementsKind kind)383 JSHandle<TaggedArray> ObjectFactory::ExtendSArray(const JSHandle<TaggedArray> &old, uint32_t length,
384                                                   JSTaggedValue initVal, [[maybe_unused]] ElementsKind kind)
385 {
386     ASSERT(length > old->GetLength());
387     NewObjectHook();
388     size_t size = TaggedArray::ComputeSize(JSTaggedValue::TaggedTypeSize(), length);
389     JSHClass *arrayClass = nullptr;
390     // Shared-array does not support Mutantarray yet.
391     ASSERT(!old->GetClass()->IsMutantTaggedArray());
392     arrayClass = JSHClass::Cast(thread_->GlobalConstants()->GetArrayClass().GetTaggedObject());
393 
394     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_, arrayClass, size);
395     JSHandle<TaggedArray> newArray(thread_, header);
396     newArray->SetLength(length);
397     newArray->SetExtraLength(old->GetExtraLength());
398 
399     uint32_t oldLength = old->GetLength();
400     for (uint32_t i = 0; i < oldLength; i++) {
401         newArray->Set(thread_, i, old->Get(i));
402     }
403     for (uint32_t i = oldLength; i < length; i++) {
404         newArray->Set(thread_, i, initVal);
405     }
406     return newArray;
407 }
408 
NewSTaggedArrayWithoutInit(uint32_t length,MemSpaceType spaceType)409 JSHandle<TaggedArray> ObjectFactory::NewSTaggedArrayWithoutInit(uint32_t length, MemSpaceType spaceType)
410 {
411     NewSObjectHook();
412     size_t size = TaggedArray::ComputeSize(JSTaggedValue::TaggedTypeSize(), length);
413     TaggedObject *header;
414     auto arrayClass = JSHClass::Cast(thread_->GlobalConstants()->GetArrayClass().GetTaggedObject());
415     switch (spaceType) {
416         case MemSpaceType::SHARED_OLD_SPACE:
417             header = sHeap_->AllocateOldOrHugeObject(thread_, arrayClass, size);
418             break;
419         case MemSpaceType::SHARED_READ_ONLY_SPACE:
420             header = sHeap_->AllocateReadOnlyOrHugeObject(thread_, arrayClass, size);
421             break;
422         default:
423             LOG_ECMA(FATAL) << "this branch is unreachable";
424             UNREACHABLE();
425     }
426     JSHandle<TaggedArray> array(thread_, header);
427     array->SetLength(length);
428     return array;
429 }
430 
CreateSLayoutInfo(uint32_t properties)431 JSHandle<LayoutInfo> ObjectFactory::CreateSLayoutInfo(uint32_t properties)
432 {
433     uint32_t arrayLength = LayoutInfo::ComputeArrayLength(properties);
434     JSHandle<LayoutInfo> layoutInfoHandle = JSHandle<LayoutInfo>::Cast(NewSTaggedArrayWithoutInit(arrayLength));
435     layoutInfoHandle->Initialize(thread_);
436     return layoutInfoHandle;
437 }
438 
NewSEmptyLayoutInfo()439 JSHandle<LayoutInfo> ObjectFactory::NewSEmptyLayoutInfo()
440 {
441     JSHandle<LayoutInfo> layoutInfoHandle = JSHandle<LayoutInfo>::Cast(
442         NewSTaggedArrayWithoutInit(0, MemSpaceType::SHARED_READ_ONLY_SPACE));
443     layoutInfoHandle->Initialize(thread_);
444     return layoutInfoHandle;
445 }
446 
NewJSSArray()447 JSHandle<JSSharedArray> ObjectFactory::NewJSSArray()
448 {
449     JSHandle<GlobalEnv> env = vm_->GetGlobalEnv();
450     JSHandle<JSFunction> function(env->GetSharedArrayFunction());
451     return JSHandle<JSSharedArray>(NewJSObjectByConstructor(function));
452 }
453 
NewSJsonFixedArray(size_t start,size_t length,const std::vector<JSHandle<JSTaggedValue>> & vec)454 JSHandle<TaggedArray> ObjectFactory::NewSJsonFixedArray(size_t start, size_t length,
455                                                         const std::vector<JSHandle<JSTaggedValue>> &vec)
456 {
457     if (length == 0) {
458         return SharedEmptyArray();
459     }
460 
461     JSHandle<TaggedArray> array = NewTaggedArrayWithoutInit(length, MemSpaceType::SHARED_OLD_SPACE);
462     array->SetExtraLength(0);
463     for (size_t i = 0; i < length; i++) {
464         array->Set(thread_, i, vec[start + i]);
465     }
466     return array;
467 }
468 
CopyAndReSortSLayoutInfo(const JSHandle<LayoutInfo> & old,int end,int capacity)469 JSHandle<LayoutInfo> ObjectFactory::CopyAndReSortSLayoutInfo(const JSHandle<LayoutInfo> &old, int end, int capacity)
470 {
471     ASSERT(capacity >= end);
472     JSHandle<LayoutInfo> newArr = CreateSLayoutInfo(capacity);
473     Span<struct Properties> sp(old->GetProperties(), end);
474     for (int i = 0; i < end; i++) {
475         newArr->AddKey(thread_, i, sp[i].key_, PropertyAttributes(sp[i].attr_));
476     }
477     return newArr;
478 }
479 
NewSDictionaryArray(uint32_t length)480 JSHandle<TaggedArray> ObjectFactory::NewSDictionaryArray(uint32_t length)
481 {
482     NewSObjectHook();
483     ASSERT(length > 0);
484     size_t size = TaggedArray::ComputeSize(JSTaggedValue::TaggedTypeSize(), length);
485     auto header = sHeap_->AllocateOldOrHugeObject(
486         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetDictionaryClass().GetTaggedObject()), size);
487     JSHandle<TaggedArray> array(thread_, header);
488     array->InitializeWithSpecialValue(JSTaggedValue::Undefined(), length);
489     return array;
490 }
491 
NewSEmptyProfileTypeInfoCell()492 JSHandle<ProfileTypeInfoCell> ObjectFactory::NewSEmptyProfileTypeInfoCell()
493 {
494     NewSObjectHook();
495     auto header = sHeap_->AllocateReadOnlyOrHugeObject(thread_,
496         JSHClass::Cast(thread_->GlobalConstants()->GetProfileTypeInfoCell0Class().GetTaggedObject()));
497     JSHandle<ProfileTypeInfoCell> profileTypeInfoCell(thread_, header);
498     profileTypeInfoCell->SetValue(thread_, JSTaggedValue::Undefined());
499     profileTypeInfoCell->SetMachineCode(thread_, JSTaggedValue::Hole());
500     profileTypeInfoCell->SetBaselineCode(thread_, JSTaggedValue::Hole());
501     profileTypeInfoCell->SetHandle(thread_, JSTaggedValue::Undefined());
502     return profileTypeInfoCell;
503 }
504 
NewSEmptyNativeFunctionMethod(FunctionKind kind)505 JSHandle<Method> ObjectFactory::NewSEmptyNativeFunctionMethod(FunctionKind kind)
506 {
507     uint32_t numArgs = 2;  // function object and this
508     auto method = NewSMethod(nullptr, MemSpaceType::SHARED_READ_ONLY_SPACE);
509     method->SetNativeBit(true);
510     method->SetNumArgsWithCallField(numArgs);
511     method->SetFunctionKind(kind);
512     return method;
513 }
514 
NewSFunctionTemplate(const JSHandle<Method> & method,const JSHandle<JSTaggedValue> & module,int32_t length)515 JSHandle<FunctionTemplate> ObjectFactory::NewSFunctionTemplate(
516     const JSHandle<Method> &method, const JSHandle<JSTaggedValue> &module, int32_t length)
517 {
518     NewSObjectHook();
519     auto globalConstants = thread_->GlobalConstants();
520     auto header = sHeap_->AllocateOldOrHugeObject(thread_,
521         JSHClass::Cast(globalConstants->GetFunctionTemplateClass().GetTaggedObject()));
522     JSHandle<FunctionTemplate> functionTemplate(thread_, header);
523     functionTemplate->SetMethod(thread_, method);
524     functionTemplate->SetModule(thread_, module);
525     functionTemplate->SetRawProfileTypeInfo(thread_, globalConstants->GetEmptyProfileTypeInfoCell(), SKIP_BARRIER);
526     functionTemplate->SetLength(length);
527     return functionTemplate;
528 }
529 
NewSEmptyArray()530 JSHandle<TaggedArray> ObjectFactory::NewSEmptyArray()
531 {
532     NewSObjectHook();
533     auto header = sHeap_->AllocateReadOnlyOrHugeObject(thread_,
534         JSHClass::Cast(thread_->GlobalConstants()->GetArrayClass().GetTaggedObject()), TaggedArray::SIZE);
535     JSHandle<TaggedArray> array(thread_, header);
536     array->SetLength(0);
537     array->SetExtraLength(0);
538     return array;
539 }
540 
NewSEmptyMutantArray()541 JSHandle<MutantTaggedArray> ObjectFactory::NewSEmptyMutantArray()
542 {
543     NewSObjectHook();
544     auto header = sHeap_->AllocateReadOnlyOrHugeObject(thread_,
545         JSHClass::Cast(thread_->GlobalConstants()->GetMutantTaggedArrayClass().GetTaggedObject()), TaggedArray::SIZE);
546     JSHandle<MutantTaggedArray> array(thread_, header);
547     array->SetLength(0);
548     array->SetExtraLength(0);
549     return array;
550 }
551 
NewSJSNativePointer(void * externalPointer,const NativePointerCallback & callBack,void * data,bool nonMovable,size_t nativeBindingsize,NativeFlag flag)552 JSHandle<JSNativePointer> ObjectFactory::NewSJSNativePointer(void *externalPointer,
553                                                              const NativePointerCallback &callBack,
554                                                              void *data,
555                                                              bool nonMovable,
556                                                              size_t nativeBindingsize,
557                                                              NativeFlag flag)
558 {
559     NewSObjectHook();
560     TaggedObject *header;
561     auto jsNativePointerClass =
562         JSHClass::Cast(thread_->GlobalConstants()->GetSJSNativePointerClass().GetTaggedObject());
563     jsNativePointerClass->SetIsJSShared(true);
564     if (nonMovable) {
565         header = sHeap_->AllocateNonMovableOrHugeObject(thread_, jsNativePointerClass);
566     } else {
567         header = sHeap_->AllocateOldOrHugeObject(thread_, jsNativePointerClass);
568     }
569     JSHandle<JSNativePointer> obj(thread_, header);
570     obj->SetExternalPointer(externalPointer);
571     obj->SetDeleter(callBack);
572     obj->SetData(data);
573     uint32_t fixedNativeBindingsize = nativeBindingsize < UINT32_MAX ? nativeBindingsize
574                                                                      : UINT32_MAX;
575     obj->SetBindingSize(fixedNativeBindingsize);
576     obj->SetNativeFlag(flag);
577 
578     if (callBack != nullptr) {
579         sHeap_->IncNativeSizeAfterLastGC(fixedNativeBindingsize);
580         Runtime::GetInstance()->PushToSharedNativePointerList(static_cast<JSNativePointer *>(header));
581         // In some cases, the size of JS/TS object is too small and the native binding size is too large.
582         // Check and try trigger concurrent mark here.
583         size_t nativeSizeAfterLastGC = sHeap_->GetNativeSizeAfterLastGC();
584         if (nativeSizeAfterLastGC > sHeap_->GetNativeSizeTriggerSharedGC()) {
585             sHeap_->CollectGarbage<TriggerGCType::SHARED_GC, GCReason::ALLOCATION_FAILED>(thread_);
586         } else if (sHeap_->CheckCanTriggerConcurrentMarking(thread_) &&
587             nativeSizeAfterLastGC > sHeap_->GetNativeSizeTriggerSharedCM()) {
588             sHeap_->TriggerConcurrentMarking<TriggerGCType::SHARED_GC, GCReason::ALLOCATION_LIMIT>(thread_);
589         }
590     }
591     return obj;
592 }
593 
NewSReadOnlyJSNativePointer(void * externalPointer)594 JSHandle<JSNativePointer> ObjectFactory::NewSReadOnlyJSNativePointer(void* externalPointer)
595 {
596     NewSObjectHook();
597     auto jsNativePointerClass =
598         JSHClass::Cast(thread_->GlobalConstants()->GetSJSNativePointerClass().GetTaggedObject());
599     jsNativePointerClass->SetIsJSShared(true);
600     TaggedObject* header = sHeap_->AllocateReadOnlyOrHugeObject(thread_, jsNativePointerClass);
601     JSHandle<JSNativePointer> obj(thread_, header);
602     obj->SetExternalPointer(externalPointer);
603     obj->SetDeleter(nullptr);
604     obj->SetData(nullptr);
605     obj->SetBindingSize(0U);
606     obj->SetNativeFlag(NativeFlag::NO_DIV);
607     return obj;
608 }
609 
NewSInternalAccessor(void * setter,void * getter)610 JSHandle<AccessorData> ObjectFactory::NewSInternalAccessor(void *setter, void *getter)
611 {
612     NewSObjectHook();
613     TaggedObject *header = sHeap_->AllocateReadOnlyOrHugeObject(thread_,
614         JSHClass::Cast(thread_->GlobalConstants()->GetInternalAccessorClass().GetTaggedObject()));
615     JSHandle<InternalAccessor> obj(thread_, InternalAccessor::Cast(header));
616 
617     obj->SetSetter(reinterpret_cast<InternalAccessor::InternalSetFunc>(setter));
618     obj->SetGetter(reinterpret_cast<InternalAccessor::InternalGetFunc>(getter));
619     return JSHandle<AccessorData>::Cast(obj);
620 }
621 
NewSConstantPool(uint32_t capacity)622 JSHandle<ConstantPool> ObjectFactory::NewSConstantPool(uint32_t capacity)
623 {
624     NewSObjectHook();
625     size_t size = ConstantPool::ComputeSize(capacity);
626     auto header = sHeap_->AllocateOldOrHugeObject(
627         thread_, JSHClass::Cast(sHeap_->GetGlobalConst()->GetConstantPoolClass().GetTaggedObject()), size);
628     JSHandle<ConstantPool> array(thread_, header);
629     array->InitializeWithSpecialValue(thread_, JSTaggedValue::Hole(), capacity);
630     return array;
631 }
632 
NewSCOWTaggedArray(uint32_t length,JSTaggedValue initVal)633 JSHandle<COWTaggedArray> ObjectFactory::NewSCOWTaggedArray(uint32_t length, JSTaggedValue initVal)
634 {
635     NewSObjectHook();
636     ASSERT(length > 0);
637 
638     size_t size = TaggedArray::ComputeSize(JSTaggedValue::TaggedTypeSize(), length);
639     auto header = sHeap_->AllocateNonMovableOrHugeObject(
640         thread_, JSHClass::Cast(sHeap_->GetGlobalConst()->GetCOWArrayClass().GetTaggedObject()), size);
641     JSHandle<COWTaggedArray> cowArray(thread_, header);
642     cowArray->InitializeWithSpecialValue(initVal, length);
643     return cowArray;
644 }
645 
NewSClassLiteral()646 JSHandle<ClassLiteral> ObjectFactory::NewSClassLiteral()
647 {
648     NewSObjectHook();
649     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(
650         thread_, JSHClass::Cast(sHeap_->GetGlobalConst()->GetClassLiteralClass().GetTaggedObject()));
651     JSHandle<TaggedArray> emptyArray = EmptyArray();
652 
653     JSHandle<ClassLiteral> classLiteral(thread_, header);
654     classLiteral->SetArray(thread_, emptyArray);
655     classLiteral->SetIsAOTUsed(false);
656 
657     return classLiteral;
658 }
659 
NewSClassInfoExtractor(JSHandle<JSTaggedValue> method)660 JSHandle<ClassInfoExtractor> ObjectFactory::NewSClassInfoExtractor(
661     JSHandle<JSTaggedValue> method)
662 {
663     NewSObjectHook();
664     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(
665         thread_, JSHClass::Cast(sHeap_->GetGlobalConst()->GetClassInfoExtractorHClass().GetTaggedObject()));
666     JSHandle<ClassInfoExtractor> obj(thread_, header);
667     obj->ClearBitField();
668     obj->SetConstructorMethod(thread_, method.GetTaggedValue());
669     JSHandle<TaggedArray> emptyArray = EmptyArray();
670     obj->SetNonStaticKeys(thread_, emptyArray, SKIP_BARRIER);
671     obj->SetNonStaticProperties(thread_, emptyArray, SKIP_BARRIER);
672     obj->SetNonStaticElements(thread_, emptyArray, SKIP_BARRIER);
673     obj->SetStaticKeys(thread_, emptyArray, SKIP_BARRIER);
674     obj->SetStaticProperties(thread_, emptyArray, SKIP_BARRIER);
675     obj->SetStaticElements(thread_, emptyArray, SKIP_BARRIER);
676     return obj;
677 }
678 
NewSOldSpaceTaggedArray(uint32_t length,JSTaggedValue initVal)679 JSHandle<TaggedArray> ObjectFactory::NewSOldSpaceTaggedArray(uint32_t length, JSTaggedValue initVal)
680 {
681     return NewSTaggedArray(length, initVal, MemSpaceType::SHARED_OLD_SPACE);
682 }
683 
NewSTaggedArray(uint32_t length,JSTaggedValue initVal,MemSpaceType spaceType)684 JSHandle<TaggedArray> ObjectFactory::NewSTaggedArray(uint32_t length, JSTaggedValue initVal, MemSpaceType spaceType)
685 {
686     NewSObjectHook();
687     if (length == 0) {
688         return EmptyArray();
689     }
690 
691     size_t size = TaggedArray::ComputeSize(JSTaggedValue::TaggedTypeSize(), length);
692     TaggedObject *header = nullptr;
693     JSHClass *arrayClass = JSHClass::Cast(thread_->GlobalConstants()->GetArrayClass().GetTaggedObject());
694     switch (spaceType) {
695         case MemSpaceType::SHARED_OLD_SPACE:
696             header = sHeap_->AllocateOldOrHugeObject(thread_, arrayClass, size);
697             break;
698         case MemSpaceType::SHARED_NON_MOVABLE:
699             header = sHeap_->AllocateNonMovableOrHugeObject(thread_, arrayClass, size);
700             break;
701         default:
702             LOG_ECMA(FATAL) << "this branch is unreachable";
703             UNREACHABLE();
704     }
705 
706     JSHandle<TaggedArray> array(thread_, header);
707     array->InitializeWithSpecialValue(initVal, length);
708     return array;
709 }
710 
NewSWellKnownSymbol(const JSHandle<JSTaggedValue> & name)711 JSHandle<JSSymbol> ObjectFactory::NewSWellKnownSymbol(const JSHandle<JSTaggedValue> &name)
712 {
713     NewSObjectHook();
714     TaggedObject *header = sHeap_->AllocateNonMovableOrHugeObject(
715         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetSymbolClass().GetTaggedObject()));
716     JSHandle<JSSymbol> obj(thread_, JSSymbol::Cast(header));
717     obj->SetFlags(0);
718     obj->SetWellKnownSymbol();
719     obj->SetDescription(thread_, name);
720     obj->SetHashField(SymbolTable::Hash(name.GetTaggedValue()));
721     return obj;
722 }
723 
NewSPublicSymbol(const JSHandle<JSTaggedValue> & name)724 JSHandle<JSSymbol> ObjectFactory::NewSPublicSymbol(const JSHandle<JSTaggedValue> &name)
725 {
726     NewObjectHook();
727     TaggedObject *header = sHeap_->AllocateNonMovableOrHugeObject(
728         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetSymbolClass().GetTaggedObject()));
729     JSHandle<JSSymbol> obj(thread_, JSSymbol::Cast(header));
730     obj->SetFlags(0);
731     obj->SetDescription(thread_, name);
732     obj->SetHashField(SymbolTable::Hash(name.GetTaggedValue()));
733     return obj;
734 }
735 
NewSConstantPrivateSymbol()736 JSHandle<JSSymbol> ObjectFactory::NewSConstantPrivateSymbol()
737 {
738     NewObjectHook();
739     TaggedObject *header = sHeap_->AllocateReadOnlyOrHugeObject(
740         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetSymbolClass().GetTaggedObject()));
741     JSHandle<JSSymbol> obj(thread_, JSSymbol::Cast(header));
742     obj->SetDescription(thread_, JSTaggedValue::Undefined());
743     obj->SetFlags(0);
744     obj->SetHashField(SymbolTable::Hash(obj.GetTaggedValue()));
745     obj->SetPrivate();
746     return obj;
747 }
748 
NewSEmptySymbol()749 JSHandle<JSSymbol> ObjectFactory::NewSEmptySymbol()
750 {
751     NewObjectHook();
752     TaggedObject *header = sHeap_->AllocateNonMovableOrHugeObject(
753         thread_, JSHClass::Cast(thread_->GlobalConstants()->GetSymbolClass().GetTaggedObject()));
754     JSHandle<JSSymbol> obj(thread_, JSSymbol::Cast(header));
755     obj->SetDescription(thread_, JSTaggedValue::Undefined());
756     obj->SetFlags(0);
757     obj->SetHashField(0);
758     return obj;
759 }
760 
NewSWellKnownSymbolWithChar(std::string_view description)761 JSHandle<JSSymbol> ObjectFactory::NewSWellKnownSymbolWithChar(std::string_view description)
762 {
763     JSHandle<EcmaString> string = NewFromUtf8(description);
764     return NewSWellKnownSymbol(JSHandle<JSTaggedValue>(string));
765 }
766 
NewSPublicSymbolWithChar(std::string_view description)767 JSHandle<JSSymbol> ObjectFactory::NewSPublicSymbolWithChar(std::string_view description)
768 {
769     JSHandle<EcmaString> string = NewFromUtf8(description);
770     return NewSPublicSymbol(JSHandle<JSTaggedValue>(string));
771 }
772 
NewSSourceTextModule()773 JSHandle<SourceTextModule> ObjectFactory::NewSSourceTextModule()
774 {
775     NewObjectHook();
776     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
777         JSHClass::Cast(thread_->GlobalConstants()->GetSourceTextModuleClass().GetTaggedObject()));
778     JSHandle<SourceTextModule> obj(thread_, header);
779     JSTaggedValue undefinedValue = thread_->GlobalConstants()->GetUndefined();
780     obj->SetEnvironment(thread_, undefinedValue);
781     obj->SetNamespace(thread_, undefinedValue);
782     obj->SetModuleRequests(thread_, undefinedValue);
783     obj->SetRequestedModules(thread_, undefinedValue);
784     obj->SetImportEntries(thread_, undefinedValue);
785     obj->SetLocalExportEntries(thread_, undefinedValue);
786     obj->SetIndirectExportEntries(thread_, undefinedValue);
787     obj->SetStarExportEntries(thread_, undefinedValue);
788     obj->SetNameDictionary(thread_, undefinedValue);
789     // [[CycleRoot]]: For a module not in a cycle, this would be the module itself.
790     obj->SetCycleRoot(thread_, obj);
791     obj->SetTopLevelCapability(thread_, undefinedValue);
792     obj->SetAsyncParentModules(thread_, undefinedValue);
793     obj->SetHasTLA(false);
794     obj->SetAsyncEvaluatingOrdinal(SourceTextModule::NOT_ASYNC_EVALUATED);
795     obj->SetPendingAsyncDependencies(SourceTextModule::UNDEFINED_INDEX);
796     obj->SetDFSIndex(SourceTextModule::UNDEFINED_INDEX);
797     obj->SetDFSAncestorIndex(SourceTextModule::UNDEFINED_INDEX);
798     obj->SetException(thread_, JSTaggedValue::Hole());
799     obj->SetStatus(ModuleStatus::UNINSTANTIATED);
800     obj->SetTypes(ModuleTypes::UNKNOWN);
801     obj->SetIsNewBcVersion(false);
802     obj->SetRegisterCounts(UINT16_MAX);
803     obj->SetLazyImportStatus(ToUintPtr(nullptr));
804     obj->SetEcmaModuleFilename(ToUintPtr(nullptr));
805     obj->SetEcmaModuleRecordName(ToUintPtr(nullptr));
806     obj->SetSharedType(SharedTypes::UNSENDABLE_MODULE);
807     obj->SetSendableEnv(thread_, undefinedValue);
808     return obj;
809 }
810 
NewSModuleNamespace()811 JSHandle<ModuleNamespace> ObjectFactory::NewSModuleNamespace()
812 {
813     NewObjectHook();
814     JSHandle<GlobalEnv> env = vm_->GetGlobalEnv();
815     JSHandle<JSHClass> hclass = JSHandle<JSHClass>::Cast(env->GetSharedModuleNamespaceClass());
816     JSHandle<JSObject> obj = NewSharedOldSpaceJSObject(hclass);
817 
818     JSHandle<ModuleNamespace> moduleNamespace = JSHandle<ModuleNamespace>::Cast(obj);
819     moduleNamespace->SetModule(thread_, JSTaggedValue::Undefined());
820     moduleNamespace->SetExports(thread_, JSTaggedValue::Undefined());
821     moduleNamespace->SetDeregisterProcession(thread_, JSTaggedValue::Undefined());
822     return moduleNamespace;
823 }
824 
NewSImportEntry(const uint32_t moduleRequestIdx,const JSHandle<JSTaggedValue> & importName,const JSHandle<JSTaggedValue> & localName)825 JSHandle<ImportEntry> ObjectFactory::NewSImportEntry(const uint32_t moduleRequestIdx,
826                                                      const JSHandle<JSTaggedValue> &importName,
827                                                      const JSHandle<JSTaggedValue> &localName)
828 {
829     NewObjectHook();
830     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
831         JSHClass::Cast(thread_->GlobalConstants()->GetImportEntryClass().GetTaggedObject()));
832     JSHandle<ImportEntry> obj(thread_, header);
833     obj->SetModuleRequestIndex(moduleRequestIdx);
834     obj->SetImportName(thread_, importName);
835     obj->SetLocalName(thread_, localName);
836     return obj;
837 }
838 
NewSLocalExportEntry(const JSHandle<JSTaggedValue> & exportName,const JSHandle<JSTaggedValue> & localName,const uint32_t index)839 JSHandle<LocalExportEntry> ObjectFactory::NewSLocalExportEntry(const JSHandle<JSTaggedValue> &exportName,
840     const JSHandle<JSTaggedValue> &localName, const uint32_t index)
841 {
842     NewObjectHook();
843     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
844         JSHClass::Cast(thread_->GlobalConstants()->GetLocalExportEntryClass().GetTaggedObject()));
845     JSHandle<LocalExportEntry> obj(thread_, header);
846     obj->SetExportName(thread_, exportName);
847     obj->SetLocalName(thread_, localName);
848     obj->SetLocalIndex(index);
849     return obj;
850 }
851 
NewSIndirectExportEntry(const JSHandle<JSTaggedValue> & exportName,const uint32_t moduleRequestIdx,const JSHandle<JSTaggedValue> & importName)852 JSHandle<IndirectExportEntry> ObjectFactory::NewSIndirectExportEntry(const JSHandle<JSTaggedValue> &exportName,
853                                                                      const uint32_t moduleRequestIdx,
854                                                                      const JSHandle<JSTaggedValue> &importName)
855 {
856     NewObjectHook();
857     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
858         JSHClass::Cast(thread_->GlobalConstants()->GetIndirectExportEntryClass().GetTaggedObject()));
859     JSHandle<IndirectExportEntry> obj(thread_, header);
860     obj->SetExportName(thread_, exportName);
861     obj->SetModuleRequestIndex(moduleRequestIdx);
862     obj->SetImportName(thread_, importName);
863     return obj;
864 }
865 
NewSStarExportEntry(const uint32_t moduleRequestIdx)866 JSHandle<StarExportEntry> ObjectFactory::NewSStarExportEntry(const uint32_t moduleRequestIdx)
867 {
868     NewObjectHook();
869     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
870         JSHClass::Cast(thread_->GlobalConstants()->GetStarExportEntryClass().GetTaggedObject()));
871     JSHandle<StarExportEntry> obj(thread_, header);
872     obj->SetModuleRequestIndex(moduleRequestIdx);
873     return obj;
874 }
875 
NewSResolvedIndexBindingRecord()876 JSHandle<ResolvedIndexBinding> ObjectFactory::NewSResolvedIndexBindingRecord()
877 {
878     JSHandle<JSTaggedValue> undefinedValue = thread_->GlobalConstants()->GetHandledUndefined();
879     JSHandle<SourceTextModule> ecmaModule(undefinedValue);
880     int32_t index = 0;
881     return NewSResolvedIndexBindingRecord(ecmaModule, index);
882 }
883 
NewSResolvedIndexBindingRecord(const JSHandle<SourceTextModule> & module,int32_t index)884 JSHandle<ResolvedIndexBinding> ObjectFactory::NewSResolvedIndexBindingRecord(const JSHandle<SourceTextModule> &module,
885                                                                              int32_t index)
886 {
887     NewObjectHook();
888     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
889         JSHClass::Cast(thread_->GlobalConstants()->GetResolvedIndexBindingClass().GetTaggedObject()));
890     JSHandle<ResolvedIndexBinding> obj(thread_, header);
891     obj->SetModule(thread_, module);
892     obj->SetIndex(index);
893     return obj;
894 }
895 
NewSResolvedBindingRecord()896 JSHandle<ResolvedBinding> ObjectFactory::NewSResolvedBindingRecord()
897 {
898     JSHandle<JSTaggedValue> undefinedValue = thread_->GlobalConstants()->GetHandledUndefined();
899     JSHandle<SourceTextModule> ecmaModule(undefinedValue);
900     JSHandle<JSTaggedValue> bindingName(undefinedValue);
901     return NewSResolvedBindingRecord(ecmaModule, bindingName);
902 }
903 
NewSResolvedBindingRecord(const JSHandle<SourceTextModule> & module,const JSHandle<JSTaggedValue> & bindingName)904 JSHandle<ResolvedBinding> ObjectFactory::NewSResolvedBindingRecord(const JSHandle<SourceTextModule> &module,
905                                                                    const JSHandle<JSTaggedValue> &bindingName)
906 {
907     NewObjectHook();
908     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
909         JSHClass::Cast(thread_->GlobalConstants()->GetResolvedBindingClass().GetTaggedObject()));
910     JSHandle<ResolvedBinding> obj(thread_, header);
911     obj->SetModule(thread_, module);
912     obj->SetBindingName(thread_, bindingName);
913     return obj;
914 }
915 
NewSResolvedRecordIndexBindingRecord()916 JSHandle<ResolvedRecordIndexBinding> ObjectFactory::NewSResolvedRecordIndexBindingRecord()
917 {
918     JSHandle<JSTaggedValue> undefinedValue = thread_->GlobalConstants()->GetHandledUndefined();
919     JSHandle<EcmaString> ecmaModule(undefinedValue);
920     JSHandle<EcmaString> fileName(undefinedValue);
921     int32_t index = 0;
922     return NewSResolvedRecordIndexBindingRecord(ecmaModule, fileName, index);
923 }
924 
NewSResolvedRecordIndexBindingRecord(const JSHandle<EcmaString> & moduleRecord,const JSHandle<EcmaString> & abcFileName,int32_t index)925 JSHandle<ResolvedRecordIndexBinding> ObjectFactory::NewSResolvedRecordIndexBindingRecord(
926     const JSHandle<EcmaString> &moduleRecord, const JSHandle<EcmaString> &abcFileName, int32_t index)
927 {
928     NewObjectHook();
929     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
930         JSHClass::Cast(thread_->GlobalConstants()->GetResolvedRecordIndexBindingClass().GetTaggedObject()));
931     JSHandle<ResolvedRecordIndexBinding> obj(thread_, header);
932     obj->SetModuleRecord(thread_, moduleRecord);
933     obj->SetAbcFileName(thread_, abcFileName);
934     obj->SetIndex(index);
935     return obj;
936 }
937 
NewSResolvedRecordBindingRecord()938 JSHandle<ResolvedRecordBinding> ObjectFactory::NewSResolvedRecordBindingRecord()
939 {
940     JSHandle<JSTaggedValue> undefinedValue = thread_->GlobalConstants()->GetHandledUndefined();
941     JSHandle<EcmaString> ecmaModule(undefinedValue);
942     JSHandle<JSTaggedValue> bindingName(undefinedValue);
943     return NewSResolvedRecordBindingRecord(ecmaModule, bindingName);
944 }
945 
NewSResolvedRecordBindingRecord(const JSHandle<EcmaString> & moduleRecord,const JSHandle<JSTaggedValue> & bindingName)946 JSHandle<ResolvedRecordBinding> ObjectFactory::NewSResolvedRecordBindingRecord(
947     const JSHandle<EcmaString> &moduleRecord, const JSHandle<JSTaggedValue> &bindingName)
948 {
949     NewObjectHook();
950     TaggedObject *header = sHeap_->AllocateOldOrHugeObject(thread_,
951         JSHClass::Cast(thread_->GlobalConstants()->GetResolvedRecordBindingClass().GetTaggedObject()));
952     JSHandle<ResolvedRecordBinding> obj(thread_, header);
953     obj->SetModuleRecord(thread_, moduleRecord);
954     obj->SetBindingName(thread_, bindingName);
955     return obj;
956 }
957 
NewSAOTLiteralInfo(uint32_t length,JSTaggedValue initVal)958 JSHandle<AOTLiteralInfo> ObjectFactory::NewSAOTLiteralInfo(uint32_t length, JSTaggedValue initVal)
959 {
960     NewObjectHook();
961     size_t size = AOTLiteralInfo::ComputeSize(length);
962     auto header = sHeap_->AllocateOldOrHugeObject(thread_,
963         JSHClass::Cast(sHeap_->GetGlobalConst()->GetAOTLiteralInfoClass().GetTaggedObject()), size);
964 
965     JSHandle<AOTLiteralInfo> aotLiteralInfo(thread_, header);
966     aotLiteralInfo->InitializeWithSpecialValue(initVal, length);
967     return aotLiteralInfo;
968 }
969 
NewSendableEnv(int numSlots)970 JSHandle<SendableEnv> ObjectFactory::NewSendableEnv(int numSlots)
971 {
972     NewObjectHook();
973     size_t size = SendableEnv::ComputeSize(numSlots);
974     auto header = sHeap_->AllocateOldOrHugeObject(thread_,
975         JSHClass::Cast(sHeap_->GetGlobalConst()->GetSendableEnvClass().GetTaggedObject()), size);
976     JSHandle<SendableEnv> array(thread_, header);
977     array->InitializeWithSpecialValue(JSTaggedValue::Hole(), numSlots + SendableEnv::SENDABLE_RESERVED_ENV_LENGTH);
978     return array;
979 }
980 
NewJSSendableFunction(const JSHandle<Method> & methodHandle)981 JSHandle<JSFunction> ObjectFactory::NewJSSendableFunction(const JSHandle<Method> &methodHandle)
982 {
983     JSHandle<GlobalEnv> env = vm_->GetGlobalEnv();
984     FunctionKind kind = methodHandle->GetFunctionKind();
985     JSHandle<JSHClass> hclass;
986     switch (kind) {
987         case FunctionKind::ASYNC_FUNCTION: {
988             hclass = JSHandle<JSHClass>::Cast(env->GetSAsyncFunctionClass());
989             break;
990         }
991         case FunctionKind::BASE_CONSTRUCTOR: {
992             hclass = JSHandle<JSHClass>::Cast(env->GetSFunctionClassWithProto());
993             break;
994         }
995         default:
996             LOG_ECMA(FATAL) << "this branch is unreachable";
997             UNREACHABLE();
998     }
999 
1000     JSHandle<JSFunction> func = NewSFunctionByHClass(methodHandle, hclass);
1001     ASSERT_NO_ABRUPT_COMPLETION(thread_);
1002     return func;
1003 }
1004 }  // namespace panda::ecmascript
1005