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.
 
 | 
| } |