[vm, gc] Assert the whole object is in to-space, not just its beginning.

TEST=ci
Bug: https://github.com/dart-lang/sdk/issues/50564
Change-Id: I60e7637600a1a7a99d546e8c674901175a119ba5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/272863
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
This commit is contained in:
Ryan Macnak 2022-11-30 22:42:16 +00:00 committed by Commit Queue
parent 288e524abe
commit c870932e45
6 changed files with 18 additions and 12 deletions

View file

@ -72,7 +72,9 @@ class Page {
uword start() const { return memory_->start(); }
uword end() const { return memory_->end(); }
bool Contains(uword addr) const { return memory_->Contains(addr); }
bool Contains(uword addr, intptr_t size = 1) const {
return memory_->Contains(addr, size);
}
intptr_t AliasOffset() const { return memory_->AliasOffset(); }
uword object_start() const {

View file

@ -711,9 +711,9 @@ Page* SemiSpace::TryAllocatePageLocked(bool link) {
return page;
}
bool SemiSpace::Contains(uword addr) const {
bool SemiSpace::Contains(uword addr, intptr_t size) const {
for (Page* page = head_; page != nullptr; page = page->next()) {
if (page->Contains(addr)) return true;
if (page->Contains(addr, size)) return true;
}
return false;
}

View file

@ -37,7 +37,7 @@ class SemiSpace {
Page* TryAllocatePageLocked(bool link);
bool Contains(uword addr) const;
bool Contains(uword addr, intptr_t size = 1) const;
void WriteProtect(bool read_only);
intptr_t used_in_words() const {
@ -128,7 +128,9 @@ class Scavenger {
// During scavenging both the to and from spaces contain "legal" objects.
// During a scavenge this function only returns true for addresses that will
// be part of the surviving objects.
bool Contains(uword addr) const { return to_->Contains(addr); }
bool Contains(uword addr, intptr_t size = 1) const {
return to_->Contains(addr, size);
}
ObjectPtr FindObject(FindObjectVisitor* visitor);
@ -255,7 +257,7 @@ class Scavenger {
if (UNLIKELY(remaining < size)) {
return 0;
}
ASSERT(to_->Contains(result));
ASSERT(to_->Contains(result, size));
ASSERT((result & kObjectAlignmentMask) == kNewObjectAlignmentOffset);
thread->set_top(result + size);
return result;

View file

@ -53,8 +53,8 @@ class MemoryRegion : public ValueObject {
return ComputeInternalPointer<T>(offset);
}
bool Contains(uword address) const {
return (address >= start()) && (address < end());
bool Contains(uword address, intptr_t size = 1) const {
return (address >= start()) && (address <= (end() - size));
}
void CopyFrom(uword offset, const MemoryRegion& from) const;

View file

@ -37,9 +37,11 @@ class VirtualMemory {
// Returns true if dual mapping is enabled.
static bool DualMappingEnabled();
bool Contains(uword addr) const { return region_.Contains(addr); }
bool ContainsAlias(uword addr) const {
return (AliasOffset() != 0) && alias_.Contains(addr);
bool Contains(uword addr, intptr_t size = 1) const {
return region_.Contains(addr, size);
}
bool ContainsAlias(uword addr, intptr_t size = 1) const {
return (AliasOffset() != 0) && alias_.Contains(addr, size);
}
// Changes the protection of the virtual memory area.

View file

@ -47,7 +47,7 @@ class VirtualMemoryCompressedHeap : public AllStatic {
static void Free(void* address, intptr_t size);
// Returns whether the address is within the compressed heap.
static bool Contains(void* address);
static bool Contains(void* address, intptr_t size = 1);
// Returns a pointer to the compressed heap region.
static void* GetRegion();