Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Unified Diff: src/mark-compact.cc

Issue 188783003: Make maps in monomorphic IC stubs weak. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add flags: is_weak_stub, is_invalidated_weak_stub Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/mark-compact.h ('k') | src/objects.h » ('j') | src/objects-visiting.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/mark-compact.cc
diff --git a/src/mark-compact.cc b/src/mark-compact.cc
index f04a8bcb9a64105a496b8e4926cc833d06b7bc3a..69021095e30c13903b940e09d3e6fea2ae6b80ce 100644
--- a/src/mark-compact.cc
+++ b/src/mark-compact.cc
@@ -449,7 +449,7 @@ void MarkCompactCollector::CollectGarbage() {
#ifdef VERIFY_HEAP
if (heap()->weak_embedded_objects_verification_enabled()) {
- VerifyWeakEmbeddedObjectsInOptimizedCode();
+ VerifyWeakEmbeddedObjectsInCode();
}
if (FLAG_collect_maps && FLAG_omit_map_checks_for_leaf_maps) {
VerifyOmittedMapChecks();
@@ -510,13 +510,13 @@ void MarkCompactCollector::VerifyMarkbitsAreClean() {
}
-void MarkCompactCollector::VerifyWeakEmbeddedObjectsInOptimizedCode() {
+void MarkCompactCollector::VerifyWeakEmbeddedObjectsInCode() {
HeapObjectIterator code_iterator(heap()->code_space());
for (HeapObject* obj = code_iterator.Next();
obj != NULL;
obj = code_iterator.Next()) {
Code* code = Code::cast(obj);
- if (code->kind() != Code::OPTIMIZED_FUNCTION) continue;
+ if (!code->is_optimized_code() && !code->is_weak_stub()) continue;
if (WillBeDeoptimized(code)) continue;
code->VerifyEmbeddedObjectsDependency();
}
@@ -2582,9 +2582,11 @@ void MarkCompactCollector::ClearNonLiveReferences() {
if (map_mark.Get()) {
ClearNonLiveDependentCode(map->dependent_code());
+ ClearNonLiveDependentIC(map);
} else {
ClearAndDeoptimizeDependentCode(map->dependent_code());
map->set_dependent_code(DependentCode::cast(heap()->empty_fixed_array()));
+ ClearAndInvalidateDependentIC(map);
}
}
@@ -2765,6 +2767,32 @@ void MarkCompactCollector::ClearNonLiveDependentCode(DependentCode* entries) {
}
+void MarkCompactCollector::ClearAndInvalidateDependentIC(Map* map) {
+ Object* current = map->dependent_ic();
+ Object* undefined = heap()->undefined_value();
+ while (current != undefined) {
+ Code* code = Code::cast(current);
+ if (IsMarked(code)) {
+ ASSERT(code->is_weak_stub());
+ IC::InvalidateMaps(code);
+ }
+ current = code->next_code_link();
+ code->set_next_code_link(undefined);
+ }
+ map->set_dependent_ic(undefined);
+}
+
+
+void MarkCompactCollector::ClearNonLiveDependentIC(Map* map) {
+ MarkCompactWeakObjectRetainer retainer;
+ Object* head =
+ VisitWeakList<Code>(heap(), map->dependent_ic(), &retainer, true);
+ map->set_dependent_ic(head);
+ Object** slot = HeapObject::RawField(map, Map::kDependentICOffset);
+ RecordSlot(slot, slot, head);
+}
+
+
void MarkCompactCollector::ProcessWeakCollections() {
GCTracer::Scope gc_scope(tracer_, GCTracer::Scope::MC_WEAKCOLLECTION_PROCESS);
Object* weak_collection_obj = encountered_weak_collections();
@@ -3409,7 +3437,7 @@ void MarkCompactCollector::InvalidateCode(Code* code) {
// Return true if the given code is deoptimized or will be deoptimized.
bool MarkCompactCollector::WillBeDeoptimized(Code* code) {
- return code->marked_for_deoptimization();
+ return code->is_optimized_code() && code->marked_for_deoptimization();
}
« no previous file with comments | « src/mark-compact.h ('k') | src/objects.h » ('j') | src/objects-visiting.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698