Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: src/serialize.cc

Issue 8139027: Version 3.6.5 (Closed) Base URL: http://v8.googlecode.com/svn/trunk/
Patch Set: '' Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/serialize.h ('k') | src/spaces.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 2, 293 2,
294 "V8::FillHeapNumberWithRandom"); 294 "V8::FillHeapNumberWithRandom");
295 Add(ExternalReference::random_uint32_function(isolate).address(), 295 Add(ExternalReference::random_uint32_function(isolate).address(),
296 RUNTIME_ENTRY, 296 RUNTIME_ENTRY,
297 3, 297 3,
298 "V8::Random"); 298 "V8::Random");
299 Add(ExternalReference::delete_handle_scope_extensions(isolate).address(), 299 Add(ExternalReference::delete_handle_scope_extensions(isolate).address(),
300 RUNTIME_ENTRY, 300 RUNTIME_ENTRY,
301 4, 301 4,
302 "HandleScope::DeleteExtensions"); 302 "HandleScope::DeleteExtensions");
303 Add(ExternalReference::
304 incremental_marking_record_write_function(isolate).address(),
305 RUNTIME_ENTRY,
306 5,
307 "IncrementalMarking::RecordWrite");
308 Add(ExternalReference::store_buffer_overflow_function(isolate).address(),
309 RUNTIME_ENTRY,
310 6,
311 "StoreBuffer::StoreBufferOverflow");
312 Add(ExternalReference::
313 incremental_evacuation_record_write_function(isolate).address(),
314 RUNTIME_ENTRY,
315 7,
316 "IncrementalMarking::RecordWrite");
317
318
303 319
304 // Miscellaneous 320 // Miscellaneous
305 Add(ExternalReference::the_hole_value_location(isolate).address(),
306 UNCLASSIFIED,
307 2,
308 "Factory::the_hole_value().location()");
309 Add(ExternalReference::roots_address(isolate).address(), 321 Add(ExternalReference::roots_address(isolate).address(),
310 UNCLASSIFIED, 322 UNCLASSIFIED,
311 3, 323 3,
312 "Heap::roots_address()"); 324 "Heap::roots_address()");
313 Add(ExternalReference::address_of_stack_limit(isolate).address(), 325 Add(ExternalReference::address_of_stack_limit(isolate).address(),
314 UNCLASSIFIED, 326 UNCLASSIFIED,
315 4, 327 4,
316 "StackGuard::address_of_jslimit()"); 328 "StackGuard::address_of_jslimit()");
317 Add(ExternalReference::address_of_real_stack_limit(isolate).address(), 329 Add(ExternalReference::address_of_real_stack_limit(isolate).address(),
318 UNCLASSIFIED, 330 UNCLASSIFIED,
(...skipping 25 matching lines...) Expand all
344 Add(ExternalReference::new_space_mask(isolate).address(), 356 Add(ExternalReference::new_space_mask(isolate).address(),
345 UNCLASSIFIED, 357 UNCLASSIFIED,
346 11, 358 11,
347 "Heap::NewSpaceMask()"); 359 "Heap::NewSpaceMask()");
348 Add(ExternalReference::heap_always_allocate_scope_depth(isolate).address(), 360 Add(ExternalReference::heap_always_allocate_scope_depth(isolate).address(),
349 UNCLASSIFIED, 361 UNCLASSIFIED,
350 12, 362 12,
351 "Heap::always_allocate_scope_depth()"); 363 "Heap::always_allocate_scope_depth()");
352 Add(ExternalReference::new_space_allocation_limit_address(isolate).address(), 364 Add(ExternalReference::new_space_allocation_limit_address(isolate).address(),
353 UNCLASSIFIED, 365 UNCLASSIFIED,
354 13, 366 14,
355 "Heap::NewSpaceAllocationLimitAddress()"); 367 "Heap::NewSpaceAllocationLimitAddress()");
356 Add(ExternalReference::new_space_allocation_top_address(isolate).address(), 368 Add(ExternalReference::new_space_allocation_top_address(isolate).address(),
357 UNCLASSIFIED, 369 UNCLASSIFIED,
358 14, 370 15,
359 "Heap::NewSpaceAllocationTopAddress()"); 371 "Heap::NewSpaceAllocationTopAddress()");
360 #ifdef ENABLE_DEBUGGER_SUPPORT 372 #ifdef ENABLE_DEBUGGER_SUPPORT
361 Add(ExternalReference::debug_break(isolate).address(), 373 Add(ExternalReference::debug_break(isolate).address(),
362 UNCLASSIFIED, 374 UNCLASSIFIED,
363 15, 375 16,
364 "Debug::Break()"); 376 "Debug::Break()");
365 Add(ExternalReference::debug_step_in_fp_address(isolate).address(), 377 Add(ExternalReference::debug_step_in_fp_address(isolate).address(),
366 UNCLASSIFIED, 378 UNCLASSIFIED,
367 16, 379 17,
368 "Debug::step_in_fp_addr()"); 380 "Debug::step_in_fp_addr()");
369 #endif 381 #endif
370 Add(ExternalReference::double_fp_operation(Token::ADD, isolate).address(), 382 Add(ExternalReference::double_fp_operation(Token::ADD, isolate).address(),
371 UNCLASSIFIED, 383 UNCLASSIFIED,
372 17, 384 18,
373 "add_two_doubles"); 385 "add_two_doubles");
374 Add(ExternalReference::double_fp_operation(Token::SUB, isolate).address(), 386 Add(ExternalReference::double_fp_operation(Token::SUB, isolate).address(),
375 UNCLASSIFIED, 387 UNCLASSIFIED,
376 18, 388 19,
377 "sub_two_doubles"); 389 "sub_two_doubles");
378 Add(ExternalReference::double_fp_operation(Token::MUL, isolate).address(), 390 Add(ExternalReference::double_fp_operation(Token::MUL, isolate).address(),
379 UNCLASSIFIED, 391 UNCLASSIFIED,
380 19, 392 20,
381 "mul_two_doubles"); 393 "mul_two_doubles");
382 Add(ExternalReference::double_fp_operation(Token::DIV, isolate).address(), 394 Add(ExternalReference::double_fp_operation(Token::DIV, isolate).address(),
383 UNCLASSIFIED, 395 UNCLASSIFIED,
384 20, 396 21,
385 "div_two_doubles"); 397 "div_two_doubles");
386 Add(ExternalReference::double_fp_operation(Token::MOD, isolate).address(), 398 Add(ExternalReference::double_fp_operation(Token::MOD, isolate).address(),
387 UNCLASSIFIED, 399 UNCLASSIFIED,
388 21, 400 22,
389 "mod_two_doubles"); 401 "mod_two_doubles");
390 Add(ExternalReference::compare_doubles(isolate).address(), 402 Add(ExternalReference::compare_doubles(isolate).address(),
391 UNCLASSIFIED, 403 UNCLASSIFIED,
392 22, 404 23,
393 "compare_doubles"); 405 "compare_doubles");
394 #ifndef V8_INTERPRETED_REGEXP 406 #ifndef V8_INTERPRETED_REGEXP
395 Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(), 407 Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(),
396 UNCLASSIFIED, 408 UNCLASSIFIED,
397 23, 409 24,
398 "NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()"); 410 "NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()");
399 Add(ExternalReference::re_check_stack_guard_state(isolate).address(), 411 Add(ExternalReference::re_check_stack_guard_state(isolate).address(),
400 UNCLASSIFIED, 412 UNCLASSIFIED,
401 24, 413 25,
402 "RegExpMacroAssembler*::CheckStackGuardState()"); 414 "RegExpMacroAssembler*::CheckStackGuardState()");
403 Add(ExternalReference::re_grow_stack(isolate).address(), 415 Add(ExternalReference::re_grow_stack(isolate).address(),
404 UNCLASSIFIED, 416 UNCLASSIFIED,
405 25, 417 26,
406 "NativeRegExpMacroAssembler::GrowStack()"); 418 "NativeRegExpMacroAssembler::GrowStack()");
407 Add(ExternalReference::re_word_character_map().address(), 419 Add(ExternalReference::re_word_character_map().address(),
408 UNCLASSIFIED, 420 UNCLASSIFIED,
409 26, 421 27,
410 "NativeRegExpMacroAssembler::word_character_map"); 422 "NativeRegExpMacroAssembler::word_character_map");
411 #endif // V8_INTERPRETED_REGEXP 423 #endif // V8_INTERPRETED_REGEXP
412 // Keyed lookup cache. 424 // Keyed lookup cache.
413 Add(ExternalReference::keyed_lookup_cache_keys(isolate).address(), 425 Add(ExternalReference::keyed_lookup_cache_keys(isolate).address(),
414 UNCLASSIFIED, 426 UNCLASSIFIED,
415 27, 427 28,
416 "KeyedLookupCache::keys()"); 428 "KeyedLookupCache::keys()");
417 Add(ExternalReference::keyed_lookup_cache_field_offsets(isolate).address(), 429 Add(ExternalReference::keyed_lookup_cache_field_offsets(isolate).address(),
418 UNCLASSIFIED, 430 UNCLASSIFIED,
419 28, 431 29,
420 "KeyedLookupCache::field_offsets()"); 432 "KeyedLookupCache::field_offsets()");
421 Add(ExternalReference::transcendental_cache_array_address(isolate).address(), 433 Add(ExternalReference::transcendental_cache_array_address(isolate).address(),
422 UNCLASSIFIED, 434 UNCLASSIFIED,
423 29, 435 30,
424 "TranscendentalCache::caches()"); 436 "TranscendentalCache::caches()");
425 Add(ExternalReference::handle_scope_next_address().address(), 437 Add(ExternalReference::handle_scope_next_address().address(),
426 UNCLASSIFIED, 438 UNCLASSIFIED,
427 30, 439 31,
428 "HandleScope::next"); 440 "HandleScope::next");
429 Add(ExternalReference::handle_scope_limit_address().address(), 441 Add(ExternalReference::handle_scope_limit_address().address(),
430 UNCLASSIFIED, 442 UNCLASSIFIED,
431 31, 443 32,
432 "HandleScope::limit"); 444 "HandleScope::limit");
433 Add(ExternalReference::handle_scope_level_address().address(), 445 Add(ExternalReference::handle_scope_level_address().address(),
434 UNCLASSIFIED, 446 UNCLASSIFIED,
435 32, 447 33,
436 "HandleScope::level"); 448 "HandleScope::level");
437 Add(ExternalReference::new_deoptimizer_function(isolate).address(), 449 Add(ExternalReference::new_deoptimizer_function(isolate).address(),
438 UNCLASSIFIED, 450 UNCLASSIFIED,
439 33, 451 34,
440 "Deoptimizer::New()"); 452 "Deoptimizer::New()");
441 Add(ExternalReference::compute_output_frames_function(isolate).address(), 453 Add(ExternalReference::compute_output_frames_function(isolate).address(),
442 UNCLASSIFIED, 454 UNCLASSIFIED,
443 34, 455 35,
444 "Deoptimizer::ComputeOutputFrames()"); 456 "Deoptimizer::ComputeOutputFrames()");
445 Add(ExternalReference::address_of_min_int().address(), 457 Add(ExternalReference::address_of_min_int().address(),
446 UNCLASSIFIED, 458 UNCLASSIFIED,
447 35, 459 36,
448 "LDoubleConstant::min_int"); 460 "LDoubleConstant::min_int");
449 Add(ExternalReference::address_of_one_half().address(), 461 Add(ExternalReference::address_of_one_half().address(),
450 UNCLASSIFIED, 462 UNCLASSIFIED,
451 36, 463 37,
452 "LDoubleConstant::one_half"); 464 "LDoubleConstant::one_half");
453 Add(ExternalReference::isolate_address().address(), 465 Add(ExternalReference::isolate_address().address(),
454 UNCLASSIFIED, 466 UNCLASSIFIED,
455 37, 467 38,
456 "isolate"); 468 "isolate");
457 Add(ExternalReference::address_of_minus_zero().address(), 469 Add(ExternalReference::address_of_minus_zero().address(),
458 UNCLASSIFIED, 470 UNCLASSIFIED,
459 38, 471 39,
460 "LDoubleConstant::minus_zero"); 472 "LDoubleConstant::minus_zero");
461 Add(ExternalReference::address_of_negative_infinity().address(), 473 Add(ExternalReference::address_of_negative_infinity().address(),
462 UNCLASSIFIED, 474 UNCLASSIFIED,
463 39, 475 40,
464 "LDoubleConstant::negative_infinity"); 476 "LDoubleConstant::negative_infinity");
465 Add(ExternalReference::power_double_double_function(isolate).address(), 477 Add(ExternalReference::power_double_double_function(isolate).address(),
466 UNCLASSIFIED, 478 UNCLASSIFIED,
467 40, 479 41,
468 "power_double_double_function"); 480 "power_double_double_function");
469 Add(ExternalReference::power_double_int_function(isolate).address(), 481 Add(ExternalReference::power_double_int_function(isolate).address(),
470 UNCLASSIFIED, 482 UNCLASSIFIED,
471 41, 483 42,
472 "power_double_int_function"); 484 "power_double_int_function");
473 Add(ExternalReference::arguments_marker_location(isolate).address(), 485 Add(ExternalReference::store_buffer_top(isolate).address(),
474 UNCLASSIFIED, 486 UNCLASSIFIED,
475 42, 487 43,
476 "Factory::arguments_marker().location()"); 488 "store_buffer_top");
489 Add(ExternalReference::address_of_canonical_non_hole_nan().address(),
490 UNCLASSIFIED,
491 44,
492 "canonical_nan");
477 } 493 }
478 494
479 495
480 ExternalReferenceEncoder::ExternalReferenceEncoder() 496 ExternalReferenceEncoder::ExternalReferenceEncoder()
481 : encodings_(Match), 497 : encodings_(Match),
482 isolate_(Isolate::Current()) { 498 isolate_(Isolate::Current()) {
483 ExternalReferenceTable* external_references = 499 ExternalReferenceTable* external_references =
484 ExternalReferenceTable::instance(isolate_); 500 ExternalReferenceTable::instance(isolate_);
485 for (int i = 0; i < external_references->size(); ++i) { 501 for (int i = 0; i < external_references->size(); ++i) {
486 Put(external_references->address(i), i); 502 Put(external_references->address(i), i);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 ASSERT(!SpaceIsPaged(space_index) || 578 ASSERT(!SpaceIsPaged(space_index) ||
563 size <= Page::kPageSize - Page::kObjectStartOffset); 579 size <= Page::kPageSize - Page::kObjectStartOffset);
564 MaybeObject* maybe_new_allocation; 580 MaybeObject* maybe_new_allocation;
565 if (space_index == NEW_SPACE) { 581 if (space_index == NEW_SPACE) {
566 maybe_new_allocation = 582 maybe_new_allocation =
567 reinterpret_cast<NewSpace*>(space)->AllocateRaw(size); 583 reinterpret_cast<NewSpace*>(space)->AllocateRaw(size);
568 } else { 584 } else {
569 maybe_new_allocation = 585 maybe_new_allocation =
570 reinterpret_cast<PagedSpace*>(space)->AllocateRaw(size); 586 reinterpret_cast<PagedSpace*>(space)->AllocateRaw(size);
571 } 587 }
588 ASSERT(!maybe_new_allocation->IsFailure());
572 Object* new_allocation = maybe_new_allocation->ToObjectUnchecked(); 589 Object* new_allocation = maybe_new_allocation->ToObjectUnchecked();
573 HeapObject* new_object = HeapObject::cast(new_allocation); 590 HeapObject* new_object = HeapObject::cast(new_allocation);
574 address = new_object->address(); 591 address = new_object->address();
575 high_water_[space_index] = address + size; 592 high_water_[space_index] = address + size;
576 } else { 593 } else {
577 ASSERT(SpaceIsLarge(space_index)); 594 ASSERT(SpaceIsLarge(space_index));
578 LargeObjectSpace* lo_space = reinterpret_cast<LargeObjectSpace*>(space); 595 LargeObjectSpace* lo_space = reinterpret_cast<LargeObjectSpace*>(space);
579 Object* new_allocation; 596 Object* new_allocation;
580 if (space_index == kLargeData) { 597 if (space_index == kLargeData || space_index == kLargeFixedArray) {
581 new_allocation = lo_space->AllocateRaw(size)->ToObjectUnchecked();
582 } else if (space_index == kLargeFixedArray) {
583 new_allocation = 598 new_allocation =
584 lo_space->AllocateRawFixedArray(size)->ToObjectUnchecked(); 599 lo_space->AllocateRaw(size, NOT_EXECUTABLE)->ToObjectUnchecked();
585 } else { 600 } else {
586 ASSERT_EQ(kLargeCode, space_index); 601 ASSERT_EQ(kLargeCode, space_index);
587 new_allocation = lo_space->AllocateRawCode(size)->ToObjectUnchecked(); 602 new_allocation =
603 lo_space->AllocateRaw(size, EXECUTABLE)->ToObjectUnchecked();
588 } 604 }
589 HeapObject* new_object = HeapObject::cast(new_allocation); 605 HeapObject* new_object = HeapObject::cast(new_allocation);
590 // Record all large objects in the same space. 606 // Record all large objects in the same space.
591 address = new_object->address(); 607 address = new_object->address();
592 pages_[LO_SPACE].Add(address); 608 pages_[LO_SPACE].Add(address);
593 } 609 }
594 last_object_address_ = address; 610 last_object_address_ = address;
595 return address; 611 return address;
596 } 612 }
597 613
(...skipping 24 matching lines...) Expand all
622 ASSERT(SpaceIsPaged(space)); 638 ASSERT(SpaceIsPaged(space));
623 int page_of_pointee = offset >> kPageSizeBits; 639 int page_of_pointee = offset >> kPageSizeBits;
624 Address object_address = pages_[space][page_of_pointee] + 640 Address object_address = pages_[space][page_of_pointee] +
625 (offset & Page::kPageAlignmentMask); 641 (offset & Page::kPageAlignmentMask);
626 return HeapObject::FromAddress(object_address); 642 return HeapObject::FromAddress(object_address);
627 } 643 }
628 644
629 645
630 void Deserializer::Deserialize() { 646 void Deserializer::Deserialize() {
631 isolate_ = Isolate::Current(); 647 isolate_ = Isolate::Current();
648 ASSERT(isolate_ != NULL);
632 // Don't GC while deserializing - just expand the heap. 649 // Don't GC while deserializing - just expand the heap.
633 AlwaysAllocateScope always_allocate; 650 AlwaysAllocateScope always_allocate;
634 // Don't use the free lists while deserializing. 651 // Don't use the free lists while deserializing.
635 LinearAllocationScope allocate_linearly; 652 LinearAllocationScope allocate_linearly;
636 // No active threads. 653 // No active threads.
637 ASSERT_EQ(NULL, isolate_->thread_manager()->FirstThreadStateInUse()); 654 ASSERT_EQ(NULL, isolate_->thread_manager()->FirstThreadStateInUse());
638 // No active handles. 655 // No active handles.
639 ASSERT(isolate_->handle_scope_implementer()->blocks()->is_empty()); 656 ASSERT(isolate_->handle_scope_implementer()->blocks()->is_empty());
640 // Make sure the entire partial snapshot cache is traversed, filling it with 657 // Make sure the entire partial snapshot cache is traversed, filling it with
641 // valid object pointers. 658 // valid object pointers.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 void Deserializer::VisitPointers(Object** start, Object** end) { 695 void Deserializer::VisitPointers(Object** start, Object** end) {
679 // The space must be new space. Any other space would cause ReadChunk to try 696 // The space must be new space. Any other space would cause ReadChunk to try
680 // to update the remembered using NULL as the address. 697 // to update the remembered using NULL as the address.
681 ReadChunk(start, end, NEW_SPACE, NULL); 698 ReadChunk(start, end, NEW_SPACE, NULL);
682 } 699 }
683 700
684 701
685 // This routine writes the new object into the pointer provided and then 702 // This routine writes the new object into the pointer provided and then
686 // returns true if the new object was in young space and false otherwise. 703 // returns true if the new object was in young space and false otherwise.
687 // The reason for this strange interface is that otherwise the object is 704 // The reason for this strange interface is that otherwise the object is
688 // written very late, which means the ByteArray map is not set up by the 705 // written very late, which means the FreeSpace map is not set up by the
689 // time we need to use it to mark the space at the end of a page free (by 706 // time we need to use it to mark the space at the end of a page free.
690 // making it into a byte array).
691 void Deserializer::ReadObject(int space_number, 707 void Deserializer::ReadObject(int space_number,
692 Space* space, 708 Space* space,
693 Object** write_back) { 709 Object** write_back) {
694 int size = source_->GetInt() << kObjectAlignmentBits; 710 int size = source_->GetInt() << kObjectAlignmentBits;
695 Address address = Allocate(space_number, space, size); 711 Address address = Allocate(space_number, space, size);
696 *write_back = HeapObject::FromAddress(address); 712 *write_back = HeapObject::FromAddress(address);
697 Object** current = reinterpret_cast<Object**>(address); 713 Object** current = reinterpret_cast<Object**>(address);
698 Object** limit = current + (size >> kPointerSizeLog2); 714 Object** limit = current + (size >> kPointerSizeLog2);
699 if (FLAG_log_snapshot_positions) { 715 if (FLAG_log_snapshot_positions) {
700 LOG(isolate_, SnapshotPositionEvent(address, source_->position())); 716 LOG(isolate_, SnapshotPositionEvent(address, source_->position()));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 767
752 #define CASE_BODY(where, how, within, space_number_if_any, offset_from_start) \ 768 #define CASE_BODY(where, how, within, space_number_if_any, offset_from_start) \
753 { \ 769 { \
754 bool emit_write_barrier = false; \ 770 bool emit_write_barrier = false; \
755 bool current_was_incremented = false; \ 771 bool current_was_incremented = false; \
756 int space_number = space_number_if_any == kAnyOldSpace ? \ 772 int space_number = space_number_if_any == kAnyOldSpace ? \
757 (data & kSpaceMask) : space_number_if_any; \ 773 (data & kSpaceMask) : space_number_if_any; \
758 if (where == kNewObject && how == kPlain && within == kStartOfObject) {\ 774 if (where == kNewObject && how == kPlain && within == kStartOfObject) {\
759 ASSIGN_DEST_SPACE(space_number) \ 775 ASSIGN_DEST_SPACE(space_number) \
760 ReadObject(space_number, dest_space, current); \ 776 ReadObject(space_number, dest_space, current); \
761 emit_write_barrier = \ 777 emit_write_barrier = (space_number == NEW_SPACE && \
762 (space_number == NEW_SPACE && source_space != NEW_SPACE); \ 778 source_space != NEW_SPACE && \
779 source_space != CELL_SPACE); \
763 } else { \ 780 } else { \
764 Object* new_object = NULL; /* May not be a real Object pointer. */ \ 781 Object* new_object = NULL; /* May not be a real Object pointer. */ \
765 if (where == kNewObject) { \ 782 if (where == kNewObject) { \
766 ASSIGN_DEST_SPACE(space_number) \ 783 ASSIGN_DEST_SPACE(space_number) \
767 ReadObject(space_number, dest_space, &new_object); \ 784 ReadObject(space_number, dest_space, &new_object); \
768 } else if (where == kRootArray) { \ 785 } else if (where == kRootArray) { \
769 int root_id = source_->GetInt(); \ 786 int root_id = source_->GetInt(); \
770 new_object = isolate->heap()->roots_address()[root_id]; \ 787 new_object = isolate->heap()->roots_address()[root_id]; \
771 } else if (where == kPartialSnapshotCache) { \ 788 } else if (where == kPartialSnapshotCache) { \
772 int cache_index = source_->GetInt(); \ 789 int cache_index = source_->GetInt(); \
773 new_object = isolate->serialize_partial_snapshot_cache() \ 790 new_object = isolate->serialize_partial_snapshot_cache() \
774 [cache_index]; \ 791 [cache_index]; \
775 } else if (where == kExternalReference) { \ 792 } else if (where == kExternalReference) { \
776 int reference_id = source_->GetInt(); \ 793 int reference_id = source_->GetInt(); \
777 Address address = external_reference_decoder_-> \ 794 Address address = external_reference_decoder_-> \
778 Decode(reference_id); \ 795 Decode(reference_id); \
779 new_object = reinterpret_cast<Object*>(address); \ 796 new_object = reinterpret_cast<Object*>(address); \
780 } else if (where == kBackref) { \ 797 } else if (where == kBackref) { \
781 emit_write_barrier = \ 798 emit_write_barrier = (space_number == NEW_SPACE && \
782 (space_number == NEW_SPACE && source_space != NEW_SPACE); \ 799 source_space != NEW_SPACE && \
800 source_space != CELL_SPACE); \
783 new_object = GetAddressFromEnd(data & kSpaceMask); \ 801 new_object = GetAddressFromEnd(data & kSpaceMask); \
784 } else { \ 802 } else { \
785 ASSERT(where == kFromStart); \ 803 ASSERT(where == kFromStart); \
786 if (offset_from_start == kUnknownOffsetFromStart) { \ 804 if (offset_from_start == kUnknownOffsetFromStart) { \
787 emit_write_barrier = \ 805 emit_write_barrier = (space_number == NEW_SPACE && \
788 (space_number == NEW_SPACE && source_space != NEW_SPACE); \ 806 source_space != NEW_SPACE && \
807 source_space != CELL_SPACE); \
789 new_object = GetAddressFromStart(data & kSpaceMask); \ 808 new_object = GetAddressFromStart(data & kSpaceMask); \
790 } else { \ 809 } else { \
791 Address object_address = pages_[space_number][0] + \ 810 Address object_address = pages_[space_number][0] + \
792 (offset_from_start << kObjectAlignmentBits); \ 811 (offset_from_start << kObjectAlignmentBits); \
793 new_object = HeapObject::FromAddress(object_address); \ 812 new_object = HeapObject::FromAddress(object_address); \
794 } \ 813 } \
795 } \ 814 } \
796 if (within == kFirstInstruction) { \ 815 if (within == kFirstInstruction) { \
797 Code* new_code_object = reinterpret_cast<Code*>(new_object); \ 816 Code* new_code_object = reinterpret_cast<Code*>(new_object); \
798 new_object = reinterpret_cast<Object*>( \ 817 new_object = reinterpret_cast<Object*>( \
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 985
967 case kNewPage: { 986 case kNewPage: {
968 int space = source_->Get(); 987 int space = source_->Get();
969 pages_[space].Add(last_object_address_); 988 pages_[space].Add(last_object_address_);
970 if (space == CODE_SPACE) { 989 if (space == CODE_SPACE) {
971 CPU::FlushICache(last_object_address_, Page::kPageSize); 990 CPU::FlushICache(last_object_address_, Page::kPageSize);
972 } 991 }
973 break; 992 break;
974 } 993 }
975 994
995 case kSkip: {
996 current++;
997 break;
998 }
999
976 case kNativesStringResource: { 1000 case kNativesStringResource: {
977 int index = source_->Get(); 1001 int index = source_->Get();
978 Vector<const char> source_vector = Natives::GetRawScriptSource(index); 1002 Vector<const char> source_vector = Natives::GetRawScriptSource(index);
979 NativesExternalStringResource* resource = 1003 NativesExternalStringResource* resource =
980 new NativesExternalStringResource(isolate->bootstrapper(), 1004 new NativesExternalStringResource(isolate->bootstrapper(),
981 source_vector.start(), 1005 source_vector.start(),
982 source_vector.length()); 1006 source_vector.length());
983 *current++ = reinterpret_cast<Object*>(resource); 1007 *current++ = reinterpret_cast<Object*>(resource);
984 break; 1008 break;
985 } 1009 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 isolate->heap()->undefined_value(); 1114 isolate->heap()->undefined_value();
1091 startup_serializer_->VisitPointer( 1115 startup_serializer_->VisitPointer(
1092 &isolate->serialize_partial_snapshot_cache()[index]); 1116 &isolate->serialize_partial_snapshot_cache()[index]);
1093 } 1117 }
1094 isolate->set_serialize_partial_snapshot_cache_length( 1118 isolate->set_serialize_partial_snapshot_cache_length(
1095 Isolate::kPartialSnapshotCacheCapacity); 1119 Isolate::kPartialSnapshotCacheCapacity);
1096 } 1120 }
1097 1121
1098 1122
1099 void Serializer::VisitPointers(Object** start, Object** end) { 1123 void Serializer::VisitPointers(Object** start, Object** end) {
1124 Isolate* isolate = Isolate::Current();
1125
1100 for (Object** current = start; current < end; current++) { 1126 for (Object** current = start; current < end; current++) {
1101 if ((*current)->IsSmi()) { 1127 if (reinterpret_cast<Address>(current) ==
1128 isolate->heap()->store_buffer()->TopAddress()) {
1129 sink_->Put(kSkip, "Skip");
1130 } else if ((*current)->IsSmi()) {
1102 sink_->Put(kRawData, "RawData"); 1131 sink_->Put(kRawData, "RawData");
1103 sink_->PutInt(kPointerSize, "length"); 1132 sink_->PutInt(kPointerSize, "length");
1104 for (int i = 0; i < kPointerSize; i++) { 1133 for (int i = 0; i < kPointerSize; i++) {
1105 sink_->Put(reinterpret_cast<byte*>(current)[i], "Byte"); 1134 sink_->Put(reinterpret_cast<byte*>(current)[i], "Byte");
1106 } 1135 }
1107 } else { 1136 } else {
1108 SerializeObject(*current, kPlain, kStartOfObject); 1137 SerializeObject(*current, kPlain, kStartOfObject);
1109 } 1138 }
1110 } 1139 }
1111 } 1140 }
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1413 1442
1414 void Serializer::ObjectSerializer::VisitExternalAsciiString( 1443 void Serializer::ObjectSerializer::VisitExternalAsciiString(
1415 v8::String::ExternalAsciiStringResource** resource_pointer) { 1444 v8::String::ExternalAsciiStringResource** resource_pointer) {
1416 Address references_start = reinterpret_cast<Address>(resource_pointer); 1445 Address references_start = reinterpret_cast<Address>(resource_pointer);
1417 OutputRawData(references_start); 1446 OutputRawData(references_start);
1418 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { 1447 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) {
1419 Object* source = HEAP->natives_source_cache()->get(i); 1448 Object* source = HEAP->natives_source_cache()->get(i);
1420 if (!source->IsUndefined()) { 1449 if (!source->IsUndefined()) {
1421 ExternalAsciiString* string = ExternalAsciiString::cast(source); 1450 ExternalAsciiString* string = ExternalAsciiString::cast(source);
1422 typedef v8::String::ExternalAsciiStringResource Resource; 1451 typedef v8::String::ExternalAsciiStringResource Resource;
1423 Resource* resource = string->resource(); 1452 const Resource* resource = string->resource();
1424 if (resource == *resource_pointer) { 1453 if (resource == *resource_pointer) {
1425 sink_->Put(kNativesStringResource, "NativesStringResource"); 1454 sink_->Put(kNativesStringResource, "NativesStringResource");
1426 sink_->PutSection(i, "NativesStringResourceEnd"); 1455 sink_->PutSection(i, "NativesStringResourceEnd");
1427 bytes_processed_so_far_ += sizeof(resource); 1456 bytes_processed_so_far_ += sizeof(resource);
1428 return; 1457 return;
1429 } 1458 }
1430 } 1459 }
1431 } 1460 }
1432 // One of the strings in the natives cache should match the resource. We 1461 // One of the strings in the natives cache should match the resource. We
1433 // can't serialize any other kinds of external strings. 1462 // can't serialize any other kinds of external strings.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1524 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); 1553 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize);
1525 } 1554 }
1526 } 1555 }
1527 int allocation_address = fullness_[space]; 1556 int allocation_address = fullness_[space];
1528 fullness_[space] = allocation_address + size; 1557 fullness_[space] = allocation_address + size;
1529 return allocation_address; 1558 return allocation_address;
1530 } 1559 }
1531 1560
1532 1561
1533 } } // namespace v8::internal 1562 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/serialize.h ('k') | src/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698