diff --git a/ecmascript/mem/machine_code.h b/ecmascript/mem/machine_code.h index 3345918be79194c2cd104a7ac335468091e0ab5f..6cfca754fe576599b6e7ec0854a91d59a26464ac 100644 --- a/ecmascript/mem/machine_code.h +++ b/ecmascript/mem/machine_code.h @@ -16,8 +16,8 @@ #ifndef PANDA_RUNTIME_ECMASCRIPT_MEM_MACHINE_CODE_H #define PANDA_RUNTIME_ECMASCRIPT_MEM_MACHINE_CODE_H +#include "ecmascript/ecma_macros.h" #include "ecmascript/js_tagged_value.h" -#include "ecmascript/object_factory.h" #include "ecmascript/mem/tagged_object.h" namespace panda { diff --git a/ecmascript/mem/region.h b/ecmascript/mem/region.h index c80d1a9c0159fba30ba3d60d4a041dfd0a7e2f80..4e541d18e504c4a85f9e65ad9727e4689e13aa1d 100644 --- a/ecmascript/mem/region.h +++ b/ecmascript/mem/region.h @@ -141,27 +141,11 @@ public: return crossRegionSet_; } - RememberedSet *GetOrCreateCrossRegionRememberedSet() - { - if (UNLIKELY(crossRegionSet_ == nullptr)) { - crossRegionSet_ = CreateRememberedSet(); - } - return crossRegionSet_; - } - RememberedSet *GetOldToNewRememberedSet() { return oldToNewSet_; } - RememberedSet *GetOrCreateOldToNewRememberedSet() - { - if (UNLIKELY(oldToNewSet_ == nullptr)) { - oldToNewSet_ = CreateRememberedSet(); - } - return oldToNewSet_; - } - static Region *ObjectAddressToRange(TaggedObject *obj) { return reinterpret_cast(ToUintPtr(obj) & ~DEFAULT_REGION_MASK); @@ -193,7 +177,9 @@ public: } RangeBitmap *CreateMarkBitmap(); - RememberedSet *CreateRememberedSet(); + inline RememberedSet *CreateRememberedSet(); + inline RememberedSet *GetOrCreateCrossRegionRememberedSet(); + inline RememberedSet *GetOrCreateOldToNewRememberedSet(); inline void InsertCrossRegionRememberedSet(uintptr_t addr); inline void InsertOldToNewRememberedSet(uintptr_t addr); diff --git a/ecmascript/mem/region_factory.cpp b/ecmascript/mem/region_factory.cpp index 757babbd7f1939c9bed150a7ada3d578b82120cc..10b969b9c9fa482b10db8962eed10c692c56769e 100644 --- a/ecmascript/mem/region_factory.cpp +++ b/ecmascript/mem/region_factory.cpp @@ -102,22 +102,6 @@ void RegionFactory::FreeArea(Area *area) free(reinterpret_cast(area)); } -void *RegionFactory::Allocate(size_t size) -{ - if (size == 0) { - LOG_ECMA_MEM(FATAL) << "size must have a size bigger than 0"; - UNREACHABLE(); - } - // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) - void *ptr = malloc(size); - if (ptr == nullptr) { - LOG_ECMA_MEM(FATAL) << "malloc failed"; - UNREACHABLE(); - } - IncreaseNativeMemoryUsage(size); - return ptr; -} - void RegionFactory::Free(void *mem, size_t size) { if (mem == nullptr) { diff --git a/ecmascript/mem/region_factory.h b/ecmascript/mem/region_factory.h index af2bf0438bfac47d29567c65aff2f83ac3d218a5..6968503865007d56ee838a8e06c5ad90d2475331 100644 --- a/ecmascript/mem/region_factory.h +++ b/ecmascript/mem/region_factory.h @@ -42,7 +42,6 @@ public: void FreeRegion(Region *region); Area *AllocateArea(size_t capacity); void FreeArea(Area *area); - void *Allocate(size_t size); void Free(void *mem, size_t size); void *AllocateBuffer(size_t size); void FreeBuffer(void *mem); @@ -120,6 +119,22 @@ public: return maxNativeMemoryUsage_.load(std::memory_order_relaxed); } + void *Allocate(size_t size) + { + if (size == 0) { + LOG_ECMA_MEM(FATAL) << "size must have a size bigger than 0"; + UNREACHABLE(); + } + // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) + void *ptr = malloc(size); + if (ptr == nullptr) { + LOG_ECMA_MEM(FATAL) << "malloc failed"; + UNREACHABLE(); + } + IncreaseNativeMemoryUsage(size); + return ptr; + } + private: NO_COPY_SEMANTIC(RegionFactory); NO_MOVE_SEMANTIC(RegionFactory); diff --git a/ecmascript/mem/space-inl.h b/ecmascript/mem/space-inl.h index c37983e9dc7c739232e284b07959b3aca78ea999..a37e5c7d04ea9b93a8314bfe9250c41af73fda9d 100644 --- a/ecmascript/mem/space-inl.h +++ b/ecmascript/mem/space-inl.h @@ -38,6 +38,32 @@ void Space::EnumerateRegions(const Callback &cb, Region *region) const } } +RememberedSet *Region::CreateRememberedSet() +{ + auto setSize = RememberedSet::GetSizeInByte(GetCapacity()); + auto setAddr = const_cast(space_->GetHeap()->GetRegionFactory())->Allocate(setSize); + uintptr_t setData = ToUintPtr(setAddr); + auto ret = new RememberedSet(ToUintPtr(this), GetCapacity(), setData); + ret->ClearAllBits(); + return ret; +} + +RememberedSet *Region::GetOrCreateCrossRegionRememberedSet() +{ + if (UNLIKELY(crossRegionSet_ == nullptr)) { + crossRegionSet_ = CreateRememberedSet(); + } + return crossRegionSet_; +} + +RememberedSet *Region::GetOrCreateOldToNewRememberedSet() +{ + if (UNLIKELY(oldToNewSet_ == nullptr)) { + oldToNewSet_ = CreateRememberedSet(); + } + return oldToNewSet_; +} + void Region::InsertCrossRegionRememberedSet(uintptr_t addr) { auto set = GetOrCreateCrossRegionRememberedSet(); diff --git a/ecmascript/mem/space.cpp b/ecmascript/mem/space.cpp index cb83b9416ccd5e0552e14a65bf76a0db9880fe05..7a665284bfcfb3637333baf8934c57b159f5dded 100644 --- a/ecmascript/mem/space.cpp +++ b/ecmascript/mem/space.cpp @@ -297,16 +297,6 @@ RangeBitmap *Region::CreateMarkBitmap() return ret; } -RememberedSet *Region::CreateRememberedSet() -{ - auto setSize = RememberedSet::GetSizeInByte(GetCapacity()); - auto setAddr = const_cast(space_->GetHeap()->GetRegionFactory())->Allocate(setSize); - uintptr_t setData = ToUintPtr(setAddr); - auto ret = new RememberedSet(ToUintPtr(this), GetCapacity(), setData); - ret->ClearAllBits(); - return ret; -} - void Space::Destroy() { ReclaimRegions(); diff --git a/ecmascript/stub_module.cpp b/ecmascript/stub_module.cpp index 4dee898c4d6f5d83ade4ab49f51dca6679851268..62e7ce4417b1d528ca2b46693d9da764321de252 100644 --- a/ecmascript/stub_module.cpp +++ b/ecmascript/stub_module.cpp @@ -14,6 +14,7 @@ */ #include "stub_module.h" +#include "ecmascript/object_factory.h" namespace panda::ecmascript { void StubModule::Save(const std::string &filename)