Chromium Code Reviews

Unified Diff: src/heap/heap.cc

Issue 2045263002: [heap] Avoid the use of cells to point from code to new-space objects. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index f830b4dd1bcfaf26a5a743a250f9bdef2ed3c522..55f76dff72b8e56d972ee6e8d1d96715334d706b 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -1471,38 +1471,6 @@ void Heap::MarkCompactPrologue() {
}
-#ifdef VERIFY_HEAP
-// Visitor class to verify pointers in code or data space do not point into
-// new space.
-class VerifyNonPointerSpacePointersVisitor : public ObjectVisitor {
- public:
- explicit VerifyNonPointerSpacePointersVisitor(Heap* heap) : heap_(heap) {}
-
- void VisitPointers(Object** start, Object** end) override {
- for (Object** current = start; current < end; current++) {
- if ((*current)->IsHeapObject()) {
- CHECK(!heap_->InNewSpace(HeapObject::cast(*current)));
- }
- }
- }
-
- private:
- Heap* heap_;
-};
-
-
-static void VerifyNonPointerSpacePointers(Heap* heap) {
- // Verify that there are no pointers to new space in spaces where we
- // do not expect them.
- VerifyNonPointerSpacePointersVisitor v(heap);
- HeapObjectIterator code_it(heap->code_space());
- for (HeapObject* object = code_it.Next(); object != NULL;
- object = code_it.Next())
- object->Iterate(&v);
-}
-#endif // VERIFY_HEAP
-
-
void Heap::CheckNewSpaceExpansionCriteria() {
if (FLAG_experimental_new_space_growth_heuristic) {
if (new_space_.TotalCapacity() < new_space_.MaximumCapacity() &&
@@ -1613,10 +1581,6 @@ void Heap::Scavenge() {
// Pause the inline allocation steps.
PauseAllocationObserversScope pause_observers(this);
-#ifdef VERIFY_HEAP
- if (FLAG_verify_heap) VerifyNonPointerSpacePointers(this);
-#endif
-
gc_state_ = SCAVENGE;
// Implements Cheney's copying algorithm
@@ -2859,6 +2823,10 @@ void Heap::CreateInitialObjects() {
*WeakHashTable::New(isolate(), 16, USE_DEFAULT_MINIMUM_CAPACITY,
TENURED));
+ set_weak_code_to_new_space_ref_list(
+ ArrayList::cast(*(factory->NewFixedArray(16, TENURED))));
+ weak_code_to_new_space_ref_list()->SetLength(0);
+
set_script_list(Smi::FromInt(0));
Handle<SeededNumberDictionary> slow_element_dictionary =
@@ -2915,7 +2883,6 @@ void Heap::CreateInitialObjects() {
CreateFixedStubs();
}
-
bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
switch (root_index) {
case kNumberStringCacheRootIndex:
@@ -2930,6 +2897,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) {
case kMicrotaskQueueRootIndex:
case kDetachedContextsRootIndex:
case kWeakObjectToCodeTableRootIndex:
+ case kWeakCodeToNewSpaceRefListRootIndex:
case kRetainedMapsRootIndex:
case kNoScriptSharedFunctionInfosRootIndex:
case kWeakStackTraceListRootIndex:
@@ -5592,6 +5560,18 @@ void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) {
}
// TODO(ishell): Find a better place for this.
+void Heap::RecordWeakCodeToNewSpaceReference(Handle<HeapObject> obj,
+ Handle<WeakCell> code) {
+ DCHECK(InNewSpace(*obj));
+ DCHECK(!InNewSpace(*code));
+ Handle<ArrayList> list(weak_code_to_new_space_ref_list(), isolate());
+ list = ArrayList::Add(list, isolate()->factory()->NewWeakCell(obj), code);
+ if (*list != weak_code_to_new_space_ref_list()) {
+ set_weak_code_to_new_space_ref_list(*list);
+ }
+}
+
+// TODO(ishell): Find a better place for this.
void Heap::AddWeakObjectToCodeDependency(Handle<HeapObject> obj,
Handle<DependentCode> dep) {
DCHECK(!InNewSpace(*obj));

Powered by Google App Engine