Index: src/incremental-marking.cc |
=================================================================== |
--- src/incremental-marking.cc (revision 9808) |
+++ src/incremental-marking.cc (working copy) |
@@ -50,7 +50,8 @@ |
steps_took_since_last_gc_(0), |
should_hurry_(false), |
allocation_marking_factor_(0), |
- allocated_(0) { |
+ allocated_(0), |
+ no_marking_scope_depth_(0) { |
} |
@@ -87,6 +88,16 @@ |
} |
+void IncrementalMarking::RecordCodeTargetPatch(Code* host, |
+ Address pc, |
+ HeapObject* value) { |
+ if (IsMarking()) { |
+ RelocInfo rinfo(pc, RelocInfo::CODE_TARGET, 0, host); |
+ RecordWriteIntoCode(host, &rinfo, value); |
+ } |
+} |
+ |
+ |
void IncrementalMarking::RecordCodeTargetPatch(Address pc, HeapObject* value) { |
if (IsMarking()) { |
Code* host = heap_->isolate()->inner_pointer_to_code_cache()-> |
@@ -343,7 +354,8 @@ |
static const intptr_t kActivationThreshold = 0; |
#endif |
- return FLAG_incremental_marking && |
+ return !FLAG_expose_gc && |
+ FLAG_incremental_marking && |
!Serializer::enabled() && |
heap_->PromotedSpaceSize() > kActivationThreshold; |
} |
@@ -461,7 +473,9 @@ |
#ifdef DEBUG |
// Marking bits are cleared by the sweeper. |
- heap_->mark_compact_collector()->VerifyMarkbitsAreClean(); |
+ if (FLAG_verify_heap) { |
+ heap_->mark_compact_collector()->VerifyMarkbitsAreClean(); |
+ } |
#endif |
heap_->CompletelyClearInstanceofCache(); |
@@ -692,6 +706,8 @@ |
if (allocated_ < kAllocatedThreshold) return; |
+ if (state_ == MARKING && no_marking_scope_depth_ > 0) return; |
+ |
intptr_t bytes_to_process = allocated_ * allocation_marking_factor_; |
double start = 0; |
@@ -739,8 +755,8 @@ |
} |
MarkBit obj_mark_bit = Marking::MarkBitFrom(obj); |
- ASSERT(Marking::IsGrey(obj_mark_bit) || |
- (obj->IsFiller() && Marking::IsWhite(obj_mark_bit))); |
+ SLOW_ASSERT(Marking::IsGrey(obj_mark_bit) || |
+ (obj->IsFiller() && Marking::IsWhite(obj_mark_bit))); |
Marking::MarkBlack(obj_mark_bit); |
MemoryChunk::IncrementLiveBytes(obj->address(), size); |
} |