Index: src/serialize.cc |
=================================================================== |
--- src/serialize.cc (revision 9327) |
+++ src/serialize.cc (working copy) |
@@ -300,7 +300,23 @@ |
RUNTIME_ENTRY, |
4, |
"HandleScope::DeleteExtensions"); |
+ Add(ExternalReference:: |
+ incremental_marking_record_write_function(isolate).address(), |
+ RUNTIME_ENTRY, |
+ 5, |
+ "IncrementalMarking::RecordWrite"); |
+ Add(ExternalReference::store_buffer_overflow_function(isolate).address(), |
+ RUNTIME_ENTRY, |
+ 6, |
+ "StoreBuffer::StoreBufferOverflow"); |
+ Add(ExternalReference:: |
+ incremental_evacuation_record_write_function(isolate).address(), |
+ RUNTIME_ENTRY, |
+ 7, |
+ "IncrementalMarking::RecordWrite"); |
+ |
+ |
// Miscellaneous |
Add(ExternalReference::the_hole_value_location(isolate).address(), |
UNCLASSIFIED, |
@@ -351,128 +367,132 @@ |
"Heap::always_allocate_scope_depth()"); |
Add(ExternalReference::new_space_allocation_limit_address(isolate).address(), |
UNCLASSIFIED, |
- 13, |
+ 14, |
"Heap::NewSpaceAllocationLimitAddress()"); |
Add(ExternalReference::new_space_allocation_top_address(isolate).address(), |
UNCLASSIFIED, |
- 14, |
+ 15, |
"Heap::NewSpaceAllocationTopAddress()"); |
#ifdef ENABLE_DEBUGGER_SUPPORT |
Add(ExternalReference::debug_break(isolate).address(), |
UNCLASSIFIED, |
- 15, |
+ 16, |
"Debug::Break()"); |
Add(ExternalReference::debug_step_in_fp_address(isolate).address(), |
UNCLASSIFIED, |
- 16, |
+ 17, |
"Debug::step_in_fp_addr()"); |
#endif |
Add(ExternalReference::double_fp_operation(Token::ADD, isolate).address(), |
UNCLASSIFIED, |
- 17, |
+ 18, |
"add_two_doubles"); |
Add(ExternalReference::double_fp_operation(Token::SUB, isolate).address(), |
UNCLASSIFIED, |
- 18, |
+ 19, |
"sub_two_doubles"); |
Add(ExternalReference::double_fp_operation(Token::MUL, isolate).address(), |
UNCLASSIFIED, |
- 19, |
+ 20, |
"mul_two_doubles"); |
Add(ExternalReference::double_fp_operation(Token::DIV, isolate).address(), |
UNCLASSIFIED, |
- 20, |
+ 21, |
"div_two_doubles"); |
Add(ExternalReference::double_fp_operation(Token::MOD, isolate).address(), |
UNCLASSIFIED, |
- 21, |
+ 22, |
"mod_two_doubles"); |
Add(ExternalReference::compare_doubles(isolate).address(), |
UNCLASSIFIED, |
- 22, |
+ 23, |
"compare_doubles"); |
#ifndef V8_INTERPRETED_REGEXP |
Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(), |
UNCLASSIFIED, |
- 23, |
+ 24, |
"NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()"); |
Add(ExternalReference::re_check_stack_guard_state(isolate).address(), |
UNCLASSIFIED, |
- 24, |
+ 25, |
"RegExpMacroAssembler*::CheckStackGuardState()"); |
Add(ExternalReference::re_grow_stack(isolate).address(), |
UNCLASSIFIED, |
- 25, |
+ 26, |
"NativeRegExpMacroAssembler::GrowStack()"); |
Add(ExternalReference::re_word_character_map().address(), |
UNCLASSIFIED, |
- 26, |
+ 27, |
"NativeRegExpMacroAssembler::word_character_map"); |
#endif // V8_INTERPRETED_REGEXP |
// Keyed lookup cache. |
Add(ExternalReference::keyed_lookup_cache_keys(isolate).address(), |
UNCLASSIFIED, |
- 27, |
+ 28, |
"KeyedLookupCache::keys()"); |
Add(ExternalReference::keyed_lookup_cache_field_offsets(isolate).address(), |
UNCLASSIFIED, |
- 28, |
+ 29, |
"KeyedLookupCache::field_offsets()"); |
Add(ExternalReference::transcendental_cache_array_address(isolate).address(), |
UNCLASSIFIED, |
- 29, |
+ 30, |
"TranscendentalCache::caches()"); |
Add(ExternalReference::handle_scope_next_address().address(), |
UNCLASSIFIED, |
- 30, |
+ 31, |
"HandleScope::next"); |
Add(ExternalReference::handle_scope_limit_address().address(), |
UNCLASSIFIED, |
- 31, |
+ 32, |
"HandleScope::limit"); |
Add(ExternalReference::handle_scope_level_address().address(), |
UNCLASSIFIED, |
- 32, |
+ 33, |
"HandleScope::level"); |
Add(ExternalReference::new_deoptimizer_function(isolate).address(), |
UNCLASSIFIED, |
- 33, |
+ 34, |
"Deoptimizer::New()"); |
Add(ExternalReference::compute_output_frames_function(isolate).address(), |
UNCLASSIFIED, |
- 34, |
+ 35, |
"Deoptimizer::ComputeOutputFrames()"); |
Add(ExternalReference::address_of_min_int().address(), |
UNCLASSIFIED, |
- 35, |
+ 36, |
"LDoubleConstant::min_int"); |
Add(ExternalReference::address_of_one_half().address(), |
UNCLASSIFIED, |
- 36, |
+ 37, |
"LDoubleConstant::one_half"); |
Add(ExternalReference::isolate_address().address(), |
UNCLASSIFIED, |
- 37, |
+ 38, |
"isolate"); |
Add(ExternalReference::address_of_minus_zero().address(), |
UNCLASSIFIED, |
- 38, |
+ 39, |
"LDoubleConstant::minus_zero"); |
Add(ExternalReference::address_of_negative_infinity().address(), |
UNCLASSIFIED, |
- 39, |
+ 40, |
"LDoubleConstant::negative_infinity"); |
Add(ExternalReference::power_double_double_function(isolate).address(), |
UNCLASSIFIED, |
- 40, |
+ 41, |
"power_double_double_function"); |
Add(ExternalReference::power_double_int_function(isolate).address(), |
UNCLASSIFIED, |
- 41, |
+ 42, |
"power_double_int_function"); |
+ Add(ExternalReference::store_buffer_top(isolate).address(), |
+ UNCLASSIFIED, |
+ 43, |
+ "store_buffer_top"); |
Add(ExternalReference::arguments_marker_location(isolate).address(), |
UNCLASSIFIED, |
- 42, |
+ 44, |
"Factory::arguments_marker().location()"); |
} |
@@ -569,6 +589,7 @@ |
maybe_new_allocation = |
reinterpret_cast<PagedSpace*>(space)->AllocateRaw(size); |
} |
+ ASSERT(!maybe_new_allocation->IsFailure()); |
Object* new_allocation = maybe_new_allocation->ToObjectUnchecked(); |
HeapObject* new_object = HeapObject::cast(new_allocation); |
address = new_object->address(); |
@@ -577,14 +598,13 @@ |
ASSERT(SpaceIsLarge(space_index)); |
LargeObjectSpace* lo_space = reinterpret_cast<LargeObjectSpace*>(space); |
Object* new_allocation; |
- if (space_index == kLargeData) { |
- new_allocation = lo_space->AllocateRaw(size)->ToObjectUnchecked(); |
- } else if (space_index == kLargeFixedArray) { |
+ if (space_index == kLargeData || space_index == kLargeFixedArray) { |
new_allocation = |
- lo_space->AllocateRawFixedArray(size)->ToObjectUnchecked(); |
+ lo_space->AllocateRaw(size, NOT_EXECUTABLE)->ToObjectUnchecked(); |
} else { |
ASSERT_EQ(kLargeCode, space_index); |
- new_allocation = lo_space->AllocateRawCode(size)->ToObjectUnchecked(); |
+ new_allocation = |
+ lo_space->AllocateRaw(size, EXECUTABLE)->ToObjectUnchecked(); |
} |
HeapObject* new_object = HeapObject::cast(new_allocation); |
// Record all large objects in the same space. |
@@ -629,6 +649,7 @@ |
void Deserializer::Deserialize() { |
isolate_ = Isolate::Current(); |
+ ASSERT(isolate_ != NULL); |
// Don't GC while deserializing - just expand the heap. |
AlwaysAllocateScope always_allocate; |
// Don't use the free lists while deserializing. |
@@ -685,9 +706,8 @@ |
// This routine writes the new object into the pointer provided and then |
// returns true if the new object was in young space and false otherwise. |
// The reason for this strange interface is that otherwise the object is |
-// written very late, which means the ByteArray map is not set up by the |
-// time we need to use it to mark the space at the end of a page free (by |
-// making it into a byte array). |
+// written very late, which means the FreeSpace map is not set up by the |
+// time we need to use it to mark the space at the end of a page free. |
void Deserializer::ReadObject(int space_number, |
Space* space, |
Object** write_back) { |
@@ -758,8 +778,9 @@ |
if (where == kNewObject && how == kPlain && within == kStartOfObject) {\ |
ASSIGN_DEST_SPACE(space_number) \ |
ReadObject(space_number, dest_space, current); \ |
- emit_write_barrier = \ |
- (space_number == NEW_SPACE && source_space != NEW_SPACE); \ |
+ emit_write_barrier = (space_number == NEW_SPACE && \ |
+ source_space != NEW_SPACE && \ |
+ source_space != CELL_SPACE); \ |
} else { \ |
Object* new_object = NULL; /* May not be a real Object pointer. */ \ |
if (where == kNewObject) { \ |
@@ -778,14 +799,16 @@ |
Decode(reference_id); \ |
new_object = reinterpret_cast<Object*>(address); \ |
} else if (where == kBackref) { \ |
- emit_write_barrier = \ |
- (space_number == NEW_SPACE && source_space != NEW_SPACE); \ |
+ emit_write_barrier = (space_number == NEW_SPACE && \ |
+ source_space != NEW_SPACE && \ |
+ source_space != CELL_SPACE); \ |
new_object = GetAddressFromEnd(data & kSpaceMask); \ |
} else { \ |
ASSERT(where == kFromStart); \ |
if (offset_from_start == kUnknownOffsetFromStart) { \ |
- emit_write_barrier = \ |
- (space_number == NEW_SPACE && source_space != NEW_SPACE); \ |
+ emit_write_barrier = (space_number == NEW_SPACE && \ |
+ source_space != NEW_SPACE && \ |
+ source_space != CELL_SPACE); \ |
new_object = GetAddressFromStart(data & kSpaceMask); \ |
} else { \ |
Address object_address = pages_[space_number][0] + \ |
@@ -973,6 +996,11 @@ |
break; |
} |
+ case kSkip: { |
+ current++; |
+ break; |
+ } |
+ |
case kNativesStringResource: { |
int index = source_->Get(); |
Vector<const char> source_vector = Natives::GetRawScriptSource(index); |
@@ -1097,8 +1125,13 @@ |
void Serializer::VisitPointers(Object** start, Object** end) { |
+ Isolate* isolate = Isolate::Current(); |
+ |
for (Object** current = start; current < end; current++) { |
- if ((*current)->IsSmi()) { |
+ if (reinterpret_cast<Address>(current) == |
+ isolate->heap()->store_buffer()->TopAddress()) { |
+ sink_->Put(kSkip, "Skip"); |
+ } else if ((*current)->IsSmi()) { |
sink_->Put(kRawData, "RawData"); |
sink_->PutInt(kPointerSize, "length"); |
for (int i = 0; i < kPointerSize; i++) { |