Chromium Code Reviews| 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.
|
| } |