Index: src/mark-compact.cc |
diff --git a/src/mark-compact.cc b/src/mark-compact.cc |
index bfb4031f3e42831d0c381efa05f542f2117c56e9..c018f9930bbfd6dde0c17ff7d3bf2e2d5aedeec5 100644 |
--- a/src/mark-compact.cc |
+++ b/src/mark-compact.cc |
@@ -85,7 +85,7 @@ class VerifyMarkingVisitor: public ObjectVisitor { |
void VisitEmbeddedPointer(RelocInfo* rinfo) { |
ASSERT(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
- if (!FLAG_weak_embedded_maps_in_optimized_code || |
+ if (!FLAG_weak_embedded_maps_in_optimized_code || !FLAG_collect_maps || |
rinfo->host()->kind() != Code::OPTIMIZED_FUNCTION || |
!rinfo->target_object()->IsMap() || |
!Map::cast(rinfo->target_object())->CanTransition()) { |
@@ -833,6 +833,20 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) { |
#endif |
} |
+#ifdef VERIFY_HEAP |
+static void VerifyWeakEmbeddedMapsInOptimizedCode(Heap* heap) { |
Michael Starzinger
2013/01/31 14:27:50
Move this function up to the other verifiers at th
ulan
2013/02/04 09:54:06
Done.
|
+ 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->marked_for_deoptimization()) continue; |
+ code->VerifyEmbeddedMaps(); |
+ } |
+} |
+#endif |
+ |
class DeoptimizeMarkedCodeFilter : public OptimizedFunctionFilter { |
public: |
virtual bool TakeFunction(JSFunction* function) { |
@@ -852,6 +866,13 @@ void MarkCompactCollector::Finish() { |
// objects (empty string, illegal builtin). |
heap()->isolate()->stub_cache()->Clear(); |
+#ifdef VERIFY_HEAP |
+ if (FLAG_collect_maps && FLAG_weak_embedded_maps_in_optimized_code && |
Michael Starzinger
2013/01/31 14:27:50
Move this call into MarkCompactCollector::CollectG
ulan
2013/02/04 09:54:06
Done.
|
+ heap()->weak_embedded_maps_verification_enabled()) { |
+ VerifyWeakEmbeddedMapsInOptimizedCode(heap()); |
+ } |
+#endif |
+ |
DeoptimizeMarkedCodeFilter filter; |
Deoptimizer::DeoptimizeAllFunctionsWith(&filter); |
} |
@@ -2310,16 +2331,17 @@ void MarkCompactCollector::ClearNonLiveDependentCodes(Map* map) { |
if (IsMarked(code) && !code->marked_for_deoptimization()) { |
if (new_number_of_codes != i) { |
codes->set_code_at(new_number_of_codes, code); |
- Object** slot = codes->code_slot_at(new_number_of_codes); |
- RecordSlot(slot, slot, code); |
- new_number_of_codes++; |
} |
+ Object** slot = codes->code_slot_at(new_number_of_codes); |
ulan
2013/01/29 15:02:58
This was the bug that lead to crashes.
Michael Starzinger
2013/01/31 14:27:50
Ouch, nice catch, I should have seen that in my in
|
+ RecordSlot(slot, slot, code); |
+ new_number_of_codes++; |
} |
} |
for (int i = new_number_of_codes; i < number_of_codes; i++) { |
codes->clear_code_at(i); |
} |
codes->set_number_of_codes(new_number_of_codes); |
+ number_of_codes = codes->number_of_codes(); |
Michael Starzinger
2013/01/31 14:27:50
This call seems to be obsolete.
ulan
2013/02/04 09:54:06
Done.
|
} |