mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:19:48 +00:00
[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:
parent
288e524abe
commit
c870932e45
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue