Merge remote-tracking branch 'openharmony/dev_shareheap' into dev_shareheap

Change-Id: If69df3b9dfd9910c1dab772726ebeb486080a1ed
This commit is contained in:
wengchangcheng 2024-03-16 10:06:24 +08:00
commit 65984f4aa8
18 changed files with 95 additions and 96 deletions

View File

@ -727,7 +727,7 @@ void BuiltinsObjectStubBuilder::HasOwnProperty(Variable *result, Label *exit, La
Branch(TaggedIsString(prop), &keyIsString, slowPath); // 2 : two args
Bind(&keyIsString);
{
GateRef res = CallNGCRuntime(glue_, RTSTUB_ID(TryToElementsIndexOrFindInStringTable), { glue_, prop });
GateRef res = CallRuntime(glue_, RTSTUB_ID(TryToElementsIndexOrFindInStringTable), { prop });
Branch(TaggedIsNumber(res), &isIndex, &notIndex);
Bind(&isIndex);
{

View File

@ -2160,38 +2160,6 @@ DEF_CALL_SIGNATURE(JsBoundCallInternal)
callSign->SetCallConv(CallSignature::CallConv::CCallConv);
}
DEF_CALL_SIGNATURE(TryToElementsIndexOrFindInStringTable)
{
// 2 : 2 input parameters
CallSignature tryToElementsIndexOrFindInStringTable("TryToElementsIndexOrFindInStringTable", 0, 2,
ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
*callSign = tryToElementsIndexOrFindInStringTable;
// 2 : 2 input parameters
std::array<VariableType, 2> params = {
VariableType::NATIVE_POINTER(),
VariableType::JS_POINTER(),
};
callSign->SetParameters(params.data());
callSign->SetGCLeafFunction(true);
callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
}
DEF_CALL_SIGNATURE(TryGetInternString)
{
// 2 : 2 input parameters
CallSignature tryGetInternString("TryGetInternString", 0, 2,
ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
*callSign = tryGetInternString;
// 2 : 2 input parameters
std::array<VariableType, 2> params = {
VariableType::NATIVE_POINTER(),
VariableType::JS_POINTER(),
};
callSign->SetParameters(params.data());
callSign->SetGCLeafFunction(true);
callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB_NO_GC);
}
DEF_CALL_SIGNATURE(CreateArrayFromList)
{
// 3 : 3 input parameters

View File

@ -476,8 +476,6 @@ private:
V(JSFunctionEntry) \
V(OptimizedFastCallEntry) \
V(JSProxyCallInternalWithArgV) \
V(TryToElementsIndexOrFindInStringTable) \
V(TryGetInternString) \
V(CreateArrayFromList) \
V(JSObjectGetMethod) \
V(JsProxyCallInternal) \

View File

@ -2667,7 +2667,7 @@ GateRef StubBuilder::GetPropertyByValue(GateRef glue, GateRef receiver, GateRef
Label notFind(env);
Label find(env);
// if key can't find in stringtabele, key is not propertyname for a object
GateRef res = CallNGCRuntime(glue, RTSTUB_ID(TryGetInternString), { glue, *key });
GateRef res = CallRuntime(glue, RTSTUB_ID(TryGetInternString), { *key });
Branch(TaggedIsHole(res), &notFind, &find);
Bind(&notFind);
{
@ -3881,7 +3881,7 @@ GateRef StubBuilder::SetPropertyByValue(GateRef glue, GateRef receiver, GateRef
{
Label notFind(env);
Label find(env);
GateRef res = CallNGCRuntime(glue, RTSTUB_ID(TryGetInternString), { glue, *varKey });
GateRef res = CallRuntime(glue, RTSTUB_ID(TryGetInternString), { *varKey });
Branch(TaggedIsHole(res), &notFind, &find);
Bind(&notFind);
{
@ -4352,7 +4352,7 @@ void StubBuilder::FastSetPropertyByName(GateRef glue, GateRef obj, GateRef key,
{
Label notFind(env);
Label find(env);
GateRef res = CallNGCRuntime(glue, RTSTUB_ID(TryGetInternString), { glue, *keyVar });
GateRef res = CallRuntime(glue, RTSTUB_ID(TryGetInternString), { *keyVar });
Branch(TaggedIsHole(res), &notFind, &find);
Bind(&notFind);
{

View File

@ -25,19 +25,31 @@
namespace panda::ecmascript {
static constexpr size_t DEFAULT_HEAP_SIZE = 448_MB; // Recommended range: 128-448MB
static constexpr size_t DEFAULT_WORKER_HEAP_SIZE = 768_MB; // Recommended range: 128_MB, LargeHeap: 768_MB
static constexpr size_t DEFAULT_SHARED_HEAP_SIZE = 778_MB;
class EcmaParamConfiguration {
public:
EcmaParamConfiguration(bool isWorker, size_t poolSize)
enum class HeapType : uint8_t {
DEFAULT_HEAP,
WORKER_HEAP,
SHARED_HEAP
};
EcmaParamConfiguration(HeapType heapType, size_t poolSize)
{
if (isWorker) {
maxHeapSize_ = DEFAULT_WORKER_HEAP_SIZE;
} else {
if (poolSize >= DEFAULT_HEAP_SIZE) {
maxHeapSize_ = DEFAULT_HEAP_SIZE;
} else {
maxHeapSize_ = poolSize; // pool is too small, no memory left for worker
}
switch (heapType) {
case HeapType::WORKER_HEAP:
maxHeapSize_ = DEFAULT_WORKER_HEAP_SIZE;
break;
case HeapType::SHARED_HEAP:
maxHeapSize_ = DEFAULT_SHARED_HEAP_SIZE;
break;
default:
if (poolSize >= DEFAULT_HEAP_SIZE) {
maxHeapSize_ = DEFAULT_HEAP_SIZE;
} else {
maxHeapSize_ = poolSize; // pool is too small, no memory left for worker
}
}
Initialize();
}

View File

@ -194,13 +194,17 @@ EcmaString *EcmaStringTable::GetOrInternString(EcmaVM *vm, EcmaString *string)
if (EcmaStringAccessor(string).IsInternString()) {
return string;
}
JSHandle<EcmaString> strHandle(vm->GetJSThread(), string);
auto thread = vm->GetJSThread();
JSHandle<EcmaString> strHandle(thread, string);
// may gc
auto strFlat = EcmaStringAccessor::Flatten(vm, strHandle, MemSpaceType::SHARED_OLD_SPACE);
if (EcmaStringAccessor(strFlat).IsInternString()) {
return strFlat;
}
RuntimeLockHolder locker(vm->GetJSThread(), mutex_);
JSHandle<EcmaString> strFlatHandle(thread, strFlat);
// may gc
RuntimeLockHolder locker(thread, mutex_);
strFlat = *strFlatHandle;
EcmaString *result = GetStringThreadUnsafe(strFlat);
if (result != nullptr) {
return result;
@ -231,16 +235,16 @@ EcmaString *EcmaStringTable::GetOrInternStringThreadUnsafe(EcmaVM *vm, EcmaStrin
EcmaString *EcmaStringTable::InsertStringToTable(EcmaVM *vm, const JSHandle<EcmaString> &strHandle)
{
auto strFlat = EcmaStringAccessor::Flatten(vm, strHandle, MemSpaceType::SHARED_OLD_SPACE);
RuntimeLockHolder locker(vm->GetJSThread(), mutex_);
auto strFlat = EcmaStringAccessor::Flatten(vm, strHandle, MemSpaceType::SHARED_OLD_SPACE);
InternStringThreadUnsafe(strFlat);
return strFlat;
}
EcmaString *EcmaStringTable::TryGetInternString(JSThread *thread, EcmaString *string)
EcmaString *EcmaStringTable::TryGetInternString(JSThread *thread, const JSHandle<EcmaString> &string)
{
RuntimeLockHolder locker(thread, mutex_);
return GetStringThreadUnsafe(string);
return GetStringThreadUnsafe(*string);
}
EcmaString *EcmaStringTable::GetOrInternStringWithSpaceType(EcmaVM *vm, const uint8_t *utf8Data, uint32_t utf8Len,

View File

@ -48,7 +48,7 @@ public:
MemSpaceType type, bool isConstantString, uint32_t idOffset);
EcmaString *GetOrInternStringWithSpaceType(EcmaVM *vm, const uint8_t *utf8Data, uint32_t utf16Len,
MemSpaceType type);
EcmaString *TryGetInternString(JSThread *thread, EcmaString *string);
EcmaString *TryGetInternString(JSThread *thread, const JSHandle<EcmaString> &string);
EcmaString *InsertStringToTable(EcmaVM *vm, const JSHandle<EcmaString> &strHandle);
void SweepWeakReference(const WeakRootVisitor &visitor);

View File

@ -103,7 +103,9 @@ AOTFileManager *JsStackInfo::loader = nullptr;
EcmaVM *EcmaVM::Create(const JSRuntimeOptions &options)
{
Runtime::CreateIfFirstVm(options);
auto config = EcmaParamConfiguration(options.IsWorker(),
auto heapType = options.IsWorker() ? EcmaParamConfiguration::HeapType::WORKER_HEAP :
EcmaParamConfiguration::HeapType::DEFAULT_HEAP;
auto config = EcmaParamConfiguration(heapType,
MemMapAllocator::GetInstance()->GetCapacity());
MemMapAllocator::GetInstance()->IncreaseAndCheckReserved(config.GetMaxHeapSize());
JSRuntimeOptions newOptions = options;

View File

@ -39,16 +39,16 @@ namespace panda::ecmascript {
DumpHeapSnapshotBeforeOOM(); \
} \
StatisticHeapDetail(); \
(object) = reinterpret_cast<TaggedObject *>((space)->Allocate(size)); \
ThrowOutOfMemoryError(GetJSThread(), size, message); \
(object) = reinterpret_cast<TaggedObject *>((space)->Allocate(size)); \
}
#define CHECK_SOBJ_AND_THROW_OOM_ERROR(thread, object, size, space, message) \
if (UNLIKELY((object) == nullptr)) { \
size_t oomOvershootSize = GetEcmaParamConfiguration().GetOutOfMemoryOvershootSize(); \
(space)->IncreaseOutOfMemoryOvershootSize(oomOvershootSize); \
(object) = reinterpret_cast<TaggedObject *>((space)->Allocate(thread, size)); \
ThrowOutOfMemoryError(thread, size, message); \
(object) = reinterpret_cast<TaggedObject *>((space)->Allocate(thread, size)); \
}
template<class Callback>
@ -314,6 +314,7 @@ TaggedObject *Heap::AllocateHugeObject(size_t size)
StatisticHeapDetail();
object = reinterpret_cast<TaggedObject *>(hugeObjectSpace_->Allocate(size, thread_));
ThrowOutOfMemoryError(thread_, size, "Heap::AllocateHugeObject");
object = reinterpret_cast<TaggedObject *>(hugeObjectSpace_->Allocate(size, thread_));
if (UNLIKELY(object == nullptr)) {
FatalOutOfMemoryError(size, "Heap::AllocateHugeObject");
}
@ -531,8 +532,6 @@ TaggedObject *SharedHeap::AllocateOldOrHugeObject(JSThread *thread, size_t size)
TaggedObject *SharedHeap::AllocateHugeObject(JSThread *thread, JSHClass *hclass, size_t size)
{
// Check whether it is necessary to trigger Old GC before expanding to avoid OOM risk.
CheckAndTriggerOldGC(thread, size);
auto object = AllocateHugeObject(thread, size);
object->SetClass(thread, hclass);
// TODO(lukai)
@ -542,9 +541,8 @@ TaggedObject *SharedHeap::AllocateHugeObject(JSThread *thread, JSHClass *hclass,
TaggedObject *SharedHeap::AllocateHugeObject(JSThread *thread, size_t size)
{
// Check whether it is necessary to trigger Old GC before expanding to avoid OOM risk.
CheckAndTriggerOldGC(thread, size);
// Check whether it is necessary to trigger Shared GC before expanding to avoid OOM risk.
CheckHugeAndTriggerGC(thread, size);
auto *object = reinterpret_cast<TaggedObject *>(sHugeObjectSpace_->Allocate(thread, size));
if (UNLIKELY(object == nullptr)) {
CollectGarbage(thread, TriggerGCType::SHARED_GC, GCReason::ALLOCATION_LIMIT);
@ -552,11 +550,11 @@ TaggedObject *SharedHeap::AllocateHugeObject(JSThread *thread, size_t size)
if (UNLIKELY(object == nullptr)) {
// if allocate huge object OOM, temporarily increase space size to avoid vm crash
size_t oomOvershootSize = config_.GetOutOfMemoryOvershootSize();
sOldSpace_->IncreaseOutOfMemoryOvershootSize(oomOvershootSize);
object = reinterpret_cast<TaggedObject *>(sHugeObjectSpace_->Allocate(thread, size));
sHugeObjectSpace_->IncreaseOutOfMemoryOvershootSize(oomOvershootSize);
// TODO(lukai)
// DumpHeapSnapshotBeforeOOM();
ThrowOutOfMemoryError(thread, size, "SharedHeap::AllocateHugeObject");
object = reinterpret_cast<TaggedObject *>(sHugeObjectSpace_->Allocate(thread, size));
if (UNLIKELY(object == nullptr)) {
FatalOutOfMemoryError(size, "SharedHeap::AllocateHugeObject");
}

View File

@ -59,7 +59,15 @@
#endif
namespace panda::ecmascript {
bool SharedHeap::CheckAndTriggerOldGC(JSThread *thread, size_t size)
SharedHeap* SharedHeap::GetInstance()
{
EcmaParamConfiguration config(EcmaParamConfiguration::HeapType::SHARED_HEAP,
MemMapAllocator::GetInstance()->GetCapacity());
static SharedHeap *shareHeap = new SharedHeap(config);
return shareHeap;
}
bool SharedHeap::CheckAndTriggerGC(JSThread *thread, size_t size)
{
if ((OldSpaceExceedLimit() || OldSpaceExceedCapacity(size) ||
GetHeapObjectSize() > globalSpaceAllocLimit_ ) && !NeedStopCollection()) {
@ -69,6 +77,15 @@ bool SharedHeap::CheckAndTriggerOldGC(JSThread *thread, size_t size)
return false;
}
bool SharedHeap::CheckHugeAndTriggerGC(JSThread *thread, size_t size)
{
if (sHugeObjectSpace_->CommittedSizeExceed(size) && !NeedStopCollection()) {
CollectGarbage(thread, TriggerGCType::SHARED_GC, GCReason::ALLOCATION_LIMIT);
return true;
}
return false;
}
void SharedHeap::Initialize(NativeAreaAllocator *nativeAreaAllocator, HeapRegionAllocator *heapRegionAllocator,
const JSRuntimeOptions &option)
{
@ -81,12 +98,11 @@ void SharedHeap::Initialize(NativeAreaAllocator *nativeAreaAllocator, HeapRegion
size_t nonmovableSpaceCapacity = config_.GetDefaultNonMovableSpaceSize();
sNonMovableSpace_ = new SharedNonMovableSpace(this, nonmovableSpaceCapacity, nonmovableSpaceCapacity);
size_t oldSpaceCapacity = maxHeapSize - nonmovableSpaceCapacity;
size_t readOnlySpaceCapacity = config_.GetDefaultReadOnlySpaceSize();
size_t oldSpaceCapacity = (maxHeapSize - nonmovableSpaceCapacity - readOnlySpaceCapacity) / 2; // 2: half
globalSpaceAllocLimit_ = maxHeapSize;
sOldSpace_ = new SharedOldSpace(this, oldSpaceCapacity, oldSpaceCapacity);
size_t readOnlySpaceCapacity = config_.GetDefaultReadOnlySpaceSize();
sReadOnlySpace_ = new SharedReadOnlySpace(this, readOnlySpaceCapacity, readOnlySpaceCapacity);
sHugeObjectSpace_ = new SharedHugeObjectSpace(this, heapRegionAllocator_, oldSpaceCapacity, oldSpaceCapacity);
}

View File

@ -314,12 +314,7 @@ public:
SharedHeap(const EcmaParamConfiguration &config) : BaseHeap(config) {}
virtual ~SharedHeap() = default;
static SharedHeap* GetInstance()
{
EcmaParamConfiguration config(false, DEFAULT_HEAP_SIZE);
static SharedHeap *shareHeap = new SharedHeap(config);
return shareHeap;
}
static SharedHeap* GetInstance();
void Initialize(NativeAreaAllocator *nativeAreaAllocator, HeapRegionAllocator *heapRegionAllocator,
const JSRuntimeOptions &option);
@ -371,7 +366,9 @@ public:
return onSerializeEvent_;
}
bool CheckAndTriggerOldGC(JSThread *thread, size_t size = 0);
bool CheckAndTriggerGC(JSThread *thread, size_t size = 0);
bool CheckHugeAndTriggerGC(JSThread *thread, size_t size);
void TryTriggerConcurrentMarking() override
{
@ -393,14 +390,13 @@ public:
bool OldSpaceExceedCapacity(size_t size) const override
{
size_t totalSize = sOldSpace_->GetCommittedSize() + sHugeObjectSpace_->GetCommittedSize() + size;
size_t totalSize = sOldSpace_->GetCommittedSize() + size;
return totalSize >= sOldSpace_->GetMaximumCapacity() + sOldSpace_->GetOutOfMemoryOvershootSize();
}
bool OldSpaceExceedLimit() const override
{
size_t totalSize = sOldSpace_->GetHeapObjectSize() + sHugeObjectSpace_->GetHeapObjectSize();
return totalSize >= sOldSpace_->GetInitialCapacity();
return sOldSpace_->GetHeapObjectSize() >= sOldSpace_->GetInitialCapacity();
}
SharedConcurrentSweeper *GetSweeper() const

View File

@ -47,7 +47,8 @@ static constexpr size_t MIN_MEM_POOL_CAPACITY = 64_MB;
static constexpr size_t WORKER_NUM = 8;
static constexpr size_t PHY_SIZE_MULTIPLE = WORKER_NUM + 1;
// todo(Gymee) fix size for shared heap
static constexpr size_t STANDARD_POOL_SIZE = WORKER_NUM * DEFAULT_WORKER_HEAP_SIZE + DEFAULT_HEAP_SIZE;
static constexpr size_t STANDARD_POOL_SIZE =
WORKER_NUM * DEFAULT_WORKER_HEAP_SIZE + DEFAULT_HEAP_SIZE + DEFAULT_SHARED_HEAP_SIZE;
#if defined(PANDA_TARGET_32)
static constexpr size_t MAX_GLOBAL_NATIVE_LIMIT = 512_MB;

View File

@ -62,8 +62,8 @@ uintptr_t SharedSparseSpace::Allocate(JSThread *thread, size_t size, bool allowG
object = AllocateAfterSweepingCompleted(size);
CHECK_SOBJECT_AND_INC_OBJ_SIZE(size);
}
// Check whether it is necessary to trigger Old GC before expanding to avoid OOM risk.
if (allowGC && sHeap_->CheckAndTriggerOldGC(thread)) {
// Check whether it is necessary to trigger Shared GC before expanding to avoid OOM risk.
if (allowGC && sHeap_->CheckAndTriggerGC(thread)) {
object = TryAllocate(size);
CHECK_SOBJECT_AND_INC_OBJ_SIZE(size);
}
@ -389,7 +389,7 @@ uintptr_t SharedHugeObjectSpace::Allocate(JSThread *thread, size_t objectSize)
// In HugeObject allocation, we have a revervation of 8 bytes for markBitSet in objectSize.
// In case Region is not aligned by 16 bytes, HUGE_OBJECT_BITSET_SIZE is 8 bytes more.
size_t alignedSize = AlignUp(objectSize + sizeof(Region) + HUGE_OBJECT_BITSET_SIZE, PANDA_POOL_ALIGNMENT_IN_BYTES);
if (heap_->OldSpaceExceedCapacity(alignedSize)) {
if (CommittedSizeExceed(alignedSize)) {
LOG_ECMA_MEM(INFO) << "Committed size " << committedSize_ << " of huge object space is too big.";
return 0;
}

View File

@ -191,6 +191,10 @@ public:
void InvokeAllocationInspector(Address object, size_t objectSize);
bool CommittedSizeExceed(size_t size) const
{
return committedSize_ + size >= maximumCapacity_ + outOfMemoryOvershootSize_;
}
private:
static constexpr size_t HUGE_OBJECT_BITSET_SIZE = 16;
EcmaList<Region> hugeNeedFreeList_ {};

View File

@ -83,8 +83,8 @@ std::pair<JSTaggedValue, bool> ObjectFastOperator::HasOwnProperty(JSThread *thre
}
if (!EcmaStringAccessor(key).IsInternString()) {
EcmaString *str = thread->GetEcmaVM()->GetEcmaStringTable()->TryGetInternString(
thread, EcmaString::Cast(key.GetTaggedObject()));
JSHandle<EcmaString> keyHandle(thread, key);
EcmaString *str = thread->GetEcmaVM()->GetEcmaStringTable()->TryGetInternString(thread, keyHandle);
if (str == nullptr) {
return std::make_pair(JSTaggedValue::Hole(), true);
}

View File

@ -3176,7 +3176,7 @@ JSTaggedValue RuntimeStubs::ArrayNumberSort(JSThread *thread, JSHandle<JSObject>
return thisObj.GetTaggedValue();
}
JSTaggedType RuntimeStubs::RuntimeTryGetInternString(uintptr_t argGlue, EcmaString *string)
JSTaggedType RuntimeStubs::RuntimeTryGetInternString(uintptr_t argGlue, const JSHandle<EcmaString> &string)
{
auto thread = JSThread::GlueToJSThread(argGlue);
EcmaString *str =

View File

@ -817,7 +817,7 @@ DEF_RUNTIME_STUBS(RegularJSObjDeletePrototype)
JSTaggedValue value = GetArg(argv, argc, 1);
uint32_t index = 0;
if (value.IsString()) {
auto string = reinterpret_cast<EcmaString *>(value.GetTaggedObject());
auto string = JSHandle<EcmaString>(thread, value);
if (EcmaStringAccessor(string).ToElementIndex(&index)) {
value = JSTaggedValue(index);
} else if (!EcmaStringAccessor(string).IsInternString()) {
@ -2812,9 +2812,10 @@ DEF_RUNTIME_STUBS(SlowFlattenString)
return JSTaggedValue(EcmaStringAccessor::SlowFlatten(thread->GetEcmaVM(), str)).GetRawData();
}
JSTaggedType RuntimeStubs::TryToElementsIndexOrFindInStringTable(uintptr_t argGlue, JSTaggedType ecmaString)
DEF_RUNTIME_STUBS(TryToElementsIndexOrFindInStringTable)
{
auto string = reinterpret_cast<EcmaString *>(ecmaString);
RUNTIME_STUBS_HEADER(TryToElementsIndexOrFindInStringTable);
JSHandle<EcmaString> string = GetHArg<EcmaString>(argv, argc, 0); // 0: means the zeroth parameter
uint32_t index = 0;
if (EcmaStringAccessor(string).ToElementIndex(&index)) {
return JSTaggedValue(index).GetRawData();
@ -2822,12 +2823,13 @@ JSTaggedType RuntimeStubs::TryToElementsIndexOrFindInStringTable(uintptr_t argGl
if (!EcmaStringAccessor(string).IsInternString()) {
return RuntimeTryGetInternString(argGlue, string);
}
return ecmaString;
return string.GetTaggedValue().GetRawData();
}
JSTaggedType RuntimeStubs::TryGetInternString(uintptr_t argGlue, JSTaggedType ecmaString)
DEF_RUNTIME_STUBS(TryGetInternString)
{
auto string = reinterpret_cast<EcmaString *>(ecmaString);
RUNTIME_STUBS_HEADER(TryGetInternString);
JSHandle<EcmaString> string = GetHArg<EcmaString>(argv, argc, 0); // 0: means the zeroth parameter
return RuntimeTryGetInternString(argGlue, string);
}

View File

@ -137,8 +137,6 @@ using FastCallAotEntryType = JSTaggedValue (*)(uintptr_t glue, uint32_t argc, co
V(FloatFloor) \
V(FloatPow) \
V(FindElementWithCache) \
V(TryToElementsIndexOrFindInStringTable) \
V(TryGetInternString) \
V(CreateArrayFromList) \
V(StringsAreEquals) \
V(BigIntEquals) \
@ -409,7 +407,9 @@ using FastCallAotEntryType = JSTaggedValue (*)(uintptr_t glue, uint32_t argc, co
V(FunctionDefineOwnProperty) \
V(AOTEnableProtoChangeMarker) \
V(HasProperty) \
V(DumpObject)
V(DumpObject) \
V(TryGetInternString) \
V(TryToElementsIndexOrFindInStringTable)
#define RUNTIME_STUB_LIST(V) \
RUNTIME_ASM_STUB_LIST(V) \
@ -467,8 +467,6 @@ public:
uintptr_t object, size_t offset, TaggedObject *value);
static void StoreBarrier([[maybe_unused]] uintptr_t argGlue,
uintptr_t object, size_t offset, TaggedObject *value);
static JSTaggedType TryToElementsIndexOrFindInStringTable(uintptr_t argGlue, JSTaggedType ecmaString);
static JSTaggedType TryGetInternString(uintptr_t argGlue, JSTaggedType ecmaString);
static JSTaggedType CreateArrayFromList([[maybe_unused]] uintptr_t argGlue, int32_t argc, JSTaggedValue *argvPtr);
static JSTaggedType GetActualArgvNoGC(uintptr_t argGlue);
static void InsertOldToNewRSet([[maybe_unused]] uintptr_t argGlue, uintptr_t object, size_t offset);
@ -853,7 +851,7 @@ private:
static inline bool ShouldUseAOTHClass(const JSHandle<JSTaggedValue> &ihc,
const JSHandle<JSTaggedValue> &chc,
const JSHandle<ClassLiteral> &classLiteral);
static inline JSTaggedType RuntimeTryGetInternString(uintptr_t argGlue, EcmaString *string);
static inline JSTaggedType RuntimeTryGetInternString(uintptr_t argGlue, const JSHandle<EcmaString> &string);
friend class SlowRuntimeStub;
};
} // namespace panda::ecmascript