Reviewers: ulan, Michael Lippautz,
Description:
AdjustLiveBytes and friends takes a heap object pointer instead of an
address.
That makes going to the page safe. Addresses can be in arbitrary locations
of an
object, e.g. in a large object but not on the first 1M page.
BUG=
Please review this at https://codereview.chromium.org/1256203004/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+32, -36 lines):
M src/factory.cc
M src/heap/heap.h
M src/heap/heap.cc
M src/heap/incremental-marking.cc
M src/heap/incremental-marking-inl.h
M src/heap/mark-compact.h
M src/heap/mark-compact.cc
M src/heap/mark-compact-inl.h
M src/heap/spaces.h
M src/heap/spaces.cc
M src/objects.cc
M src/runtime/runtime-regexp.cc
Index: src/factory.cc
diff --git a/src/factory.cc b/src/factory.cc
index
1d594d3eb5a6eda62470d908f7669c9b30028cbe..ff577652d734eda9376b73d9ea7db2b081ebe94e
100644
--- a/src/factory.cc
+++ b/src/factory.cc
@@ -2025,7 +2025,7 @@ void Factory::ReinitializeJSProxy(Handle<JSProxy>
proxy, InstanceType type,
if (size_difference > 0) {
Address address = proxy->address();
heap->CreateFillerObjectAt(address + map->instance_size(),
size_difference);
- heap->AdjustLiveBytes(address, -size_difference,
+ heap->AdjustLiveBytes(*proxy, -size_difference,
Heap::CONCURRENT_TO_SWEEPER);
}
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index
f28d17a9b68fab830756085901e3308d53db4896..f1814d363848ce8335310269d6ca9921a42de2be
100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -2360,7 +2360,7 @@ class ScavengingVisitor : public StaticVisitorBase {
if (marks_handling == TRANSFER_MARKS) {
if (Marking::TransferColor(source, target)) {
- MemoryChunk::IncrementLiveBytesFromGC(target->address(), size);
+ MemoryChunk::IncrementLiveBytesFromGC(target, size);
}
}
}
@@ -3821,13 +3821,13 @@ bool Heap::CanMoveObjectStart(HeapObject* object) {
}
-void Heap::AdjustLiveBytes(Address address, int by, InvocationMode mode) {
+void Heap::AdjustLiveBytes(HeapObject* object, int by, InvocationMode
mode) {
if (incremental_marking()->IsMarking() &&
- Marking::IsBlack(Marking::MarkBitFrom(address))) {
+ Marking::IsBlack(Marking::MarkBitFrom(object->address()))) {
if (mode == SEQUENTIAL_TO_SWEEPER) {
- MemoryChunk::IncrementLiveBytesFromGC(address, by);
+ MemoryChunk::IncrementLiveBytesFromGC(object, by);
} else {
- MemoryChunk::IncrementLiveBytesFromMutator(address, by);
+ MemoryChunk::IncrementLiveBytesFromMutator(object, by);
}
}
}
@@ -3874,7 +3874,7 @@ FixedArrayBase*
Heap::LeftTrimFixedArray(FixedArrayBase* object,
// Maintain consistency of live bytes during incremental marking
marking()->TransferMark(object->address(), new_start);
- AdjustLiveBytes(new_start, -bytes_to_trim, Heap::CONCURRENT_TO_SWEEPER);
+ AdjustLiveBytes(new_object, -bytes_to_trim, Heap::CONCURRENT_TO_SWEEPER);
// Notify the heap profiler of change in object layout.
OnMoveEvent(new_object, object, new_object->Size());
@@ -3935,7 +3935,7 @@ void Heap::RightTrimFixedArray(FixedArrayBase*
object, int elements_to_trim) {
object->synchronized_set_length(len - elements_to_trim);
// Maintain consistency of live bytes during incremental marking
- AdjustLiveBytes(object->address(), -bytes_to_trim, mode);
+ AdjustLiveBytes(object, -bytes_to_trim, mode);
// Notify the heap profiler of change in object layout. The array may
not be
// moved during GC, and size has to be adjusted nevertheless.
Index: src/heap/heap.h
diff --git a/src/heap/heap.h b/src/heap/heap.h
index
15577ee02390be901caa9e71bd30cfca41fe2889..db5540fc93af89a26a30f3f7fd82bf6e6e6072ae
100644
--- a/src/heap/heap.h
+++ b/src/heap/heap.h
@@ -772,7 +772,7 @@ class Heap {
enum InvocationMode { SEQUENTIAL_TO_SWEEPER, CONCURRENT_TO_SWEEPER };
// Maintain consistency of live bytes during incremental marking.
- void AdjustLiveBytes(Address address, int by, InvocationMode mode);
+ void AdjustLiveBytes(HeapObject* object, int by, InvocationMode mode);
// Trim the given array from the left. Note that this relocates the
object
// start and hence is only valid if there is only a single reference to
it.
Index: src/heap/incremental-marking-inl.h
diff --git a/src/heap/incremental-marking-inl.h
b/src/heap/incremental-marking-inl.h
index
42b3dcb127da27fc1ebd937912c43580735dd596..d523841a872e36e8247b7dd4d89df0d78260748c
100644
--- a/src/heap/incremental-marking-inl.h
+++ b/src/heap/incremental-marking-inl.h
@@ -85,7 +85,7 @@ void
IncrementalMarking::BlackToGreyAndUnshift(HeapObject* obj,
DCHECK(IsMarking());
Marking::BlackToGrey(mark_bit);
int obj_size = obj->Size();
- MemoryChunk::IncrementLiveBytesFromGC(obj->address(), -obj_size);
+ MemoryChunk::IncrementLiveBytesFromGC(obj, -obj_size);
bytes_scanned_ -= obj_size;
int64_t old_bytes_rescanned = bytes_rescanned_;
bytes_rescanned_ = old_bytes_rescanned + obj_size;
Index: src/heap/incremental-marking.cc
diff --git a/src/heap/incremental-marking.cc
b/src/heap/incremental-marking.cc
index
22051eaab2d5793681dbd6ba3df3ccfd1495dfec..947c961af8993d6efc959d4d1c7765a1c2e352a1
100644
--- a/src/heap/incremental-marking.cc
+++ b/src/heap/incremental-marking.cc
@@ -127,8 +127,7 @@ static void MarkObjectGreyDoNotEnqueue(Object* obj) {
HeapObject* heap_obj = HeapObject::cast(obj);
MarkBit mark_bit = Marking::MarkBitFrom(HeapObject::cast(obj));
if (Marking::IsBlack(mark_bit)) {
- MemoryChunk::IncrementLiveBytesFromGC(heap_obj->address(),
- -heap_obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(heap_obj, -heap_obj->Size());
}
Marking::AnyToGrey(mark_bit);
}
@@ -140,7 +139,7 @@ static inline void MarkBlackOrKeepBlack(HeapObject*
heap_object,
DCHECK(!Marking::IsImpossible(mark_bit));
if (Marking::IsBlack(mark_bit)) return;
Marking::MarkBlack(mark_bit);
- MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(), size);
+ MemoryChunk::IncrementLiveBytesFromGC(heap_object, size);
}
@@ -256,8 +255,7 @@ class IncrementalMarkingMarkingVisitor
MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
if (Marking::IsWhite(mark_bit)) {
Marking::MarkBlack(mark_bit);
- MemoryChunk::IncrementLiveBytesFromGC(heap_object->address(),
- heap_object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(heap_object,
heap_object->Size());
return true;
}
return false;
@@ -720,7 +718,7 @@ void IncrementalMarking::Hurry() {
if (FLAG_cleanup_code_caches_at_gc) {
PolymorphicCodeCache* poly_cache = heap_->polymorphic_code_cache();
Marking::GreyToBlack(Marking::MarkBitFrom(poly_cache));
- MemoryChunk::IncrementLiveBytesFromGC(poly_cache->address(),
+ MemoryChunk::IncrementLiveBytesFromGC(poly_cache,
PolymorphicCodeCache::kSize);
}
@@ -734,7 +732,7 @@ void IncrementalMarking::Hurry() {
MarkBit mark_bit = Marking::MarkBitFrom(cache);
if (Marking::IsGrey(mark_bit)) {
Marking::GreyToBlack(mark_bit);
- MemoryChunk::IncrementLiveBytesFromGC(cache->address(),
cache->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(cache, cache->Size());
}
}
context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK);
Index: src/heap/mark-compact-inl.h
diff --git a/src/heap/mark-compact-inl.h b/src/heap/mark-compact-inl.h
index
1ac9a5973a36ad4b5ddb2ce607e0ec8a264aa1b8..de8df3d77acdfe94c83b4cb98796a327d2024f9c
100644
--- a/src/heap/mark-compact-inl.h
+++ b/src/heap/mark-compact-inl.h
@@ -33,7 +33,7 @@ void MarkCompactCollector::MarkObject(HeapObject* obj,
MarkBit mark_bit) {
DCHECK(Marking::MarkBitFrom(obj) == mark_bit);
if (Marking::IsWhite(mark_bit)) {
Marking::WhiteToBlack(mark_bit);
- MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(obj, obj->Size());
DCHECK(obj->GetIsolate()->heap()->Contains(obj));
marking_deque_.PushBlack(obj);
}
@@ -44,7 +44,7 @@ void MarkCompactCollector::SetMark(HeapObject* obj,
MarkBit mark_bit) {
DCHECK(Marking::IsWhite(mark_bit));
DCHECK(Marking::MarkBitFrom(obj) == mark_bit);
Marking::WhiteToBlack(mark_bit);
- MemoryChunk::IncrementLiveBytesFromGC(obj->address(), obj->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(obj, obj->Size());
}
Index: src/heap/mark-compact.cc
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
index
6d3ceff7cb27567d1710c4e5c7b73553b6fb030b..526718e1ee72475e2225e114d45f3adcafa2f991
100644
--- a/src/heap/mark-compact.cc
+++ b/src/heap/mark-compact.cc
@@ -1752,7 +1752,7 @@ static void DiscoverGreyObjectsWithIterator(Heap*
heap,
MarkBit markbit = Marking::MarkBitFrom(object);
if ((object->map() != filler_map) && Marking::IsGrey(markbit)) {
Marking::GreyToBlack(markbit);
- MemoryChunk::IncrementLiveBytesFromGC(object->address(),
object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object, object->Size());
marking_deque->PushBlack(object);
if (marking_deque->IsFull()) return;
}
@@ -1797,7 +1797,7 @@ static void DiscoverGreyObjectsOnPage(MarkingDeque*
marking_deque,
Marking::GreyToBlack(markbit);
Address addr = cell_base + offset * kPointerSize;
HeapObject* object = HeapObject::FromAddress(addr);
- MemoryChunk::IncrementLiveBytesFromGC(object->address(),
object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object, object->Size());
marking_deque->PushBlack(object);
if (marking_deque->IsFull()) return;
offset += 2;
Index: src/heap/mark-compact.h
diff --git a/src/heap/mark-compact.h b/src/heap/mark-compact.h
index
b4a4fe7fda2c423c6450ee513d3d127472c0b63e..77aa452f8ada50582eb1658c5dd44e3573e1d394
100644
--- a/src/heap/mark-compact.h
+++ b/src/heap/mark-compact.h
@@ -211,7 +211,7 @@ class MarkingDeque {
DCHECK(object->IsHeapObject());
if (IsFull()) {
Marking::BlackToGrey(object);
- MemoryChunk::IncrementLiveBytesFromGC(object->address(),
-object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object, -object->Size());
SetOverflowed();
} else {
array_[top_] = object;
@@ -252,7 +252,7 @@ class MarkingDeque {
DCHECK(Marking::IsBlack(Marking::MarkBitFrom(object)));
if (IsFull()) {
Marking::BlackToGrey(object);
- MemoryChunk::IncrementLiveBytesFromGC(object->address(),
-object->Size());
+ MemoryChunk::IncrementLiveBytesFromGC(object, -object->Size());
SetOverflowed();
} else {
bottom_ = ((bottom_ - 1) & mask_);
Index: src/heap/spaces.cc
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc
index
f19821070b7efcc2dbe9aef861b5154d86525ef5..6abd188ad408a25a4ead0dc382754d18027ddec8
100644
--- a/src/heap/spaces.cc
+++ b/src/heap/spaces.cc
@@ -920,8 +920,8 @@ bool
MemoryAllocator::CommitExecutableMemory(base::VirtualMemory* vm,
//
-----------------------------------------------------------------------------
// MemoryChunk implementation
-void MemoryChunk::IncrementLiveBytesFromMutator(Address address, int by) {
- MemoryChunk* chunk = MemoryChunk::FromAddress(address);
+void MemoryChunk::IncrementLiveBytesFromMutator(HeapObject* object, int
by) {
+ MemoryChunk* chunk = MemoryChunk::FromAddress(object->address());
if (!chunk->InNewSpace() && !static_cast<Page*>(chunk)->WasSwept()) {
static_cast<PagedSpace*>(chunk->owner())->IncrementUnsweptFreeBytes(-by);
}
Index: src/heap/spaces.h
diff --git a/src/heap/spaces.h b/src/heap/spaces.h
index
f592796ec59d499f1d76434da72aec795277b8d5..d92f228a2531758c18cf55eba3b61efdf2f0032e
100644
--- a/src/heap/spaces.h
+++ b/src/heap/spaces.h
@@ -522,11 +522,11 @@ class MemoryChunk {
progress_bar();
}
- static void IncrementLiveBytesFromGC(Address address, int by) {
- MemoryChunk::FromAddress(address)->IncrementLiveBytes(by);
+ static void IncrementLiveBytesFromGC(HeapObject* object, int by) {
+ MemoryChunk::FromAddress(object->address())->IncrementLiveBytes(by);
}
- static void IncrementLiveBytesFromMutator(Address address, int by);
+ static void IncrementLiveBytesFromMutator(HeapObject* object, int by);
static const intptr_t kAlignment =
(static_cast<uintptr_t>(1) << kPageSizeBits);
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
3df88e300c3ad8f53028e452dc8f0a5a24976b73..f51d22560b5f0c88c9b95b832da4ac83ed7891d8
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -885,8 +885,7 @@ bool
String::MakeExternal(v8::String::ExternalStringResource* resource) {
self->set_resource(resource);
if (is_internalized) self->Hash(); // Force regeneration of the hash
value.
- heap->AdjustLiveBytes(this->address(), new_size - size,
- Heap::CONCURRENT_TO_SWEEPER);
+ heap->AdjustLiveBytes(this, new_size - size,
Heap::CONCURRENT_TO_SWEEPER);
return true;
}
@@ -946,8 +945,7 @@ bool
String::MakeExternal(v8::String::ExternalOneByteStringResource* resource) {
self->set_resource(resource);
if (is_internalized) self->Hash(); // Force regeneration of the hash
value.
- heap->AdjustLiveBytes(this->address(), new_size - size,
- Heap::CONCURRENT_TO_SWEEPER);
+ heap->AdjustLiveBytes(this, new_size - size,
Heap::CONCURRENT_TO_SWEEPER);
return true;
}
@@ -2045,7 +2043,7 @@ void JSObject::MigrateFastToFast(Handle<JSObject>
object, Handle<Map> new_map) {
Address address = object->address();
heap->CreateFillerObjectAt(
address + new_instance_size, instance_size_delta);
- heap->AdjustLiveBytes(address, -instance_size_delta,
+ heap->AdjustLiveBytes(*object, -instance_size_delta,
Heap::CONCURRENT_TO_SWEEPER);
}
@@ -4577,7 +4575,7 @@ void JSObject::MigrateFastToSlow(Handle<JSObject>
object,
Heap* heap = isolate->heap();
heap->CreateFillerObjectAt(object->address() + new_instance_size,
instance_size_delta);
- heap->AdjustLiveBytes(object->address(), -instance_size_delta,
+ heap->AdjustLiveBytes(*object, -instance_size_delta,
Heap::CONCURRENT_TO_SWEEPER);
}
@@ -9124,7 +9122,7 @@ Handle<String> SeqString::Truncate(Handle<SeqString>
string, int new_length) {
// that are a multiple of pointer size.
heap->CreateFillerObjectAt(start_of_string + new_size, delta);
}
- heap->AdjustLiveBytes(start_of_string, -delta,
Heap::CONCURRENT_TO_SWEEPER);
+ heap->AdjustLiveBytes(*string, -delta, Heap::CONCURRENT_TO_SWEEPER);
// We are storing the new length using release store after creating a
filler
// for the left-over space to avoid races with the sweeper thread.
Index: src/runtime/runtime-regexp.cc
diff --git a/src/runtime/runtime-regexp.cc b/src/runtime/runtime-regexp.cc
index
67e1384ff0068fc9aa043b26bc0dff6971e36e9b..e742d64ca1d2e3f1b65c1be4c763bb5485bc89cd
100644
--- a/src/runtime/runtime-regexp.cc
+++ b/src/runtime/runtime-regexp.cc
@@ -643,7 +643,7 @@ MUST_USE_RESULT static Object*
StringReplaceGlobalRegExpWithEmptyString(
if (!heap->lo_space()->Contains(*answer)) {
heap->CreateFillerObjectAt(end_of_string, delta);
}
- heap->AdjustLiveBytes(answer->address(), -delta,
Heap::CONCURRENT_TO_SWEEPER);
+ heap->AdjustLiveBytes(*answer, -delta, Heap::CONCURRENT_TO_SWEEPER);
return *answer;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.