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