| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 VerifyEvacuation(heap, heap->property_cell_space()); | 220 VerifyEvacuation(heap, heap->property_cell_space()); |
| 221 VerifyEvacuation(heap, heap->map_space()); | 221 VerifyEvacuation(heap, heap->map_space()); |
| 222 VerifyEvacuation(heap->new_space()); | 222 VerifyEvacuation(heap->new_space()); |
| 223 | 223 |
| 224 VerifyEvacuationVisitor visitor; | 224 VerifyEvacuationVisitor visitor; |
| 225 heap->IterateStrongRoots(&visitor, VISIT_ALL); | 225 heap->IterateStrongRoots(&visitor, VISIT_ALL); |
| 226 } | 226 } |
| 227 #endif // VERIFY_HEAP | 227 #endif // VERIFY_HEAP |
| 228 | 228 |
| 229 | 229 |
| 230 #ifdef DEBUG | |
| 231 class VerifyNativeContextSeparationVisitor : public ObjectVisitor { | |
| 232 public: | |
| 233 VerifyNativeContextSeparationVisitor() : current_native_context_(NULL) {} | |
| 234 | |
| 235 void VisitPointers(Object** start, Object** end) { | |
| 236 for (Object** current = start; current < end; current++) { | |
| 237 if ((*current)->IsHeapObject()) { | |
| 238 HeapObject* object = HeapObject::cast(*current); | |
| 239 if (object->IsString()) continue; | |
| 240 switch (object->map()->instance_type()) { | |
| 241 case JS_FUNCTION_TYPE: | |
| 242 CheckContext(JSFunction::cast(object)->context()); | |
| 243 break; | |
| 244 case JS_GLOBAL_PROXY_TYPE: | |
| 245 CheckContext(JSGlobalProxy::cast(object)->native_context()); | |
| 246 break; | |
| 247 case JS_GLOBAL_OBJECT_TYPE: | |
| 248 case JS_BUILTINS_OBJECT_TYPE: | |
| 249 CheckContext(GlobalObject::cast(object)->native_context()); | |
| 250 break; | |
| 251 case JS_ARRAY_TYPE: | |
| 252 case JS_DATE_TYPE: | |
| 253 case JS_OBJECT_TYPE: | |
| 254 case JS_REGEXP_TYPE: | |
| 255 VisitPointer(HeapObject::RawField(object, JSObject::kMapOffset)); | |
| 256 break; | |
| 257 case MAP_TYPE: | |
| 258 VisitPointer(HeapObject::RawField(object, Map::kPrototypeOffset)); | |
| 259 VisitPointer(HeapObject::RawField(object, Map::kConstructorOffset)); | |
| 260 break; | |
| 261 case FIXED_ARRAY_TYPE: | |
| 262 if (object->IsContext()) { | |
| 263 CheckContext(object); | |
| 264 } else { | |
| 265 FixedArray* array = FixedArray::cast(object); | |
| 266 int length = array->length(); | |
| 267 // Set array length to zero to prevent cycles while iterating | |
| 268 // over array bodies, this is easier than intrusive marking. | |
| 269 array->set_length(0); | |
| 270 array->IterateBody(FIXED_ARRAY_TYPE, FixedArray::SizeFor(length), | |
| 271 this); | |
| 272 array->set_length(length); | |
| 273 } | |
| 274 break; | |
| 275 case CELL_TYPE: | |
| 276 case JS_PROXY_TYPE: | |
| 277 case JS_VALUE_TYPE: | |
| 278 case TYPE_FEEDBACK_INFO_TYPE: | |
| 279 object->Iterate(this); | |
| 280 break; | |
| 281 case DECLARED_ACCESSOR_INFO_TYPE: | |
| 282 case EXECUTABLE_ACCESSOR_INFO_TYPE: | |
| 283 case BYTE_ARRAY_TYPE: | |
| 284 case CALL_HANDLER_INFO_TYPE: | |
| 285 case CODE_TYPE: | |
| 286 case FIXED_DOUBLE_ARRAY_TYPE: | |
| 287 case HEAP_NUMBER_TYPE: | |
| 288 case MUTABLE_HEAP_NUMBER_TYPE: | |
| 289 case INTERCEPTOR_INFO_TYPE: | |
| 290 case ODDBALL_TYPE: | |
| 291 case SCRIPT_TYPE: | |
| 292 case SHARED_FUNCTION_INFO_TYPE: | |
| 293 break; | |
| 294 default: | |
| 295 UNREACHABLE(); | |
| 296 } | |
| 297 } | |
| 298 } | |
| 299 } | |
| 300 | |
| 301 private: | |
| 302 void CheckContext(Object* context) { | |
| 303 if (!context->IsContext()) return; | |
| 304 Context* native_context = Context::cast(context)->native_context(); | |
| 305 if (current_native_context_ == NULL) { | |
| 306 current_native_context_ = native_context; | |
| 307 } else { | |
| 308 CHECK_EQ(current_native_context_, native_context); | |
| 309 } | |
| 310 } | |
| 311 | |
| 312 Context* current_native_context_; | |
| 313 }; | |
| 314 | |
| 315 | |
| 316 static void VerifyNativeContextSeparation(Heap* heap) { | |
| 317 HeapObjectIterator it(heap->code_space()); | |
| 318 | |
| 319 for (Object* object = it.Next(); object != NULL; object = it.Next()) { | |
| 320 VerifyNativeContextSeparationVisitor visitor; | |
| 321 Code::cast(object)->CodeIterateBody(&visitor); | |
| 322 } | |
| 323 } | |
| 324 #endif | |
| 325 | |
| 326 | |
| 327 void MarkCompactCollector::SetUp() { | 230 void MarkCompactCollector::SetUp() { |
| 328 free_list_old_data_space_.Reset(new FreeList(heap_->old_data_space())); | 231 free_list_old_data_space_.Reset(new FreeList(heap_->old_data_space())); |
| 329 free_list_old_pointer_space_.Reset(new FreeList(heap_->old_pointer_space())); | 232 free_list_old_pointer_space_.Reset(new FreeList(heap_->old_pointer_space())); |
| 330 } | 233 } |
| 331 | 234 |
| 332 | 235 |
| 333 void MarkCompactCollector::TearDown() { AbortCompaction(); } | 236 void MarkCompactCollector::TearDown() { AbortCompaction(); } |
| 334 | 237 |
| 335 | 238 |
| 336 void MarkCompactCollector::AddEvacuationCandidate(Page* p) { | 239 void MarkCompactCollector::AddEvacuationCandidate(Page* p) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 ClearWeakCollections(); | 301 ClearWeakCollections(); |
| 399 | 302 |
| 400 #ifdef VERIFY_HEAP | 303 #ifdef VERIFY_HEAP |
| 401 if (FLAG_verify_heap) { | 304 if (FLAG_verify_heap) { |
| 402 VerifyMarking(heap_); | 305 VerifyMarking(heap_); |
| 403 } | 306 } |
| 404 #endif | 307 #endif |
| 405 | 308 |
| 406 SweepSpaces(); | 309 SweepSpaces(); |
| 407 | 310 |
| 408 #ifdef DEBUG | |
| 409 if (FLAG_verify_native_context_separation) { | |
| 410 VerifyNativeContextSeparation(heap_); | |
| 411 } | |
| 412 #endif | |
| 413 | |
| 414 #ifdef VERIFY_HEAP | 311 #ifdef VERIFY_HEAP |
| 415 if (heap()->weak_embedded_objects_verification_enabled()) { | 312 if (heap()->weak_embedded_objects_verification_enabled()) { |
| 416 VerifyWeakEmbeddedObjectsInCode(); | 313 VerifyWeakEmbeddedObjectsInCode(); |
| 417 } | 314 } |
| 418 if (FLAG_collect_maps && FLAG_omit_map_checks_for_leaf_maps) { | 315 if (FLAG_collect_maps && FLAG_omit_map_checks_for_leaf_maps) { |
| 419 VerifyOmittedMapChecks(); | 316 VerifyOmittedMapChecks(); |
| 420 } | 317 } |
| 421 #endif | 318 #endif |
| 422 | 319 |
| 423 Finish(); | 320 Finish(); |
| (...skipping 4081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4505 SlotsBuffer* buffer = *buffer_address; | 4402 SlotsBuffer* buffer = *buffer_address; |
| 4506 while (buffer != NULL) { | 4403 while (buffer != NULL) { |
| 4507 SlotsBuffer* next_buffer = buffer->next(); | 4404 SlotsBuffer* next_buffer = buffer->next(); |
| 4508 DeallocateBuffer(buffer); | 4405 DeallocateBuffer(buffer); |
| 4509 buffer = next_buffer; | 4406 buffer = next_buffer; |
| 4510 } | 4407 } |
| 4511 *buffer_address = NULL; | 4408 *buffer_address = NULL; |
| 4512 } | 4409 } |
| 4513 } | 4410 } |
| 4514 } // namespace v8::internal | 4411 } // namespace v8::internal |
| OLD | NEW |