| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 int page_of_pointee = offset >> kPageSizeBits; | 672 int page_of_pointee = offset >> kPageSizeBits; |
| 673 Address object_address = pages_[space][page_of_pointee] + | 673 Address object_address = pages_[space][page_of_pointee] + |
| 674 (offset & Page::kPageAlignmentMask); | 674 (offset & Page::kPageAlignmentMask); |
| 675 return HeapObject::FromAddress(object_address); | 675 return HeapObject::FromAddress(object_address); |
| 676 } | 676 } |
| 677 | 677 |
| 678 | 678 |
| 679 void Deserializer::Deserialize() { | 679 void Deserializer::Deserialize() { |
| 680 isolate_ = Isolate::Current(); | 680 isolate_ = Isolate::Current(); |
| 681 ASSERT(isolate_ != NULL); | 681 ASSERT(isolate_ != NULL); |
| 682 // Don't GC while deserializing - just expand the heap. | 682 { |
| 683 AlwaysAllocateScope always_allocate; | 683 // Don't GC while deserializing - just expand the heap. |
| 684 // Don't use the free lists while deserializing. | 684 AlwaysAllocateScope always_allocate; |
| 685 LinearAllocationScope allocate_linearly; | 685 // Don't use the free lists while deserializing. |
| 686 // No active threads. | 686 LinearAllocationScope allocate_linearly; |
| 687 ASSERT_EQ(NULL, isolate_->thread_manager()->FirstThreadStateInUse()); | 687 // No active threads. |
| 688 // No active handles. | 688 ASSERT_EQ(NULL, isolate_->thread_manager()->FirstThreadStateInUse()); |
| 689 ASSERT(isolate_->handle_scope_implementer()->blocks()->is_empty()); | 689 // No active handles. |
| 690 ASSERT_EQ(NULL, external_reference_decoder_); | 690 ASSERT(isolate_->handle_scope_implementer()->blocks()->is_empty()); |
| 691 external_reference_decoder_ = new ExternalReferenceDecoder(); | 691 ASSERT_EQ(NULL, external_reference_decoder_); |
| 692 isolate_->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG); | 692 external_reference_decoder_ = new ExternalReferenceDecoder(); |
| 693 isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); | 693 isolate_->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG); |
| 694 isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); |
| 694 | 695 |
| 695 isolate_->heap()->set_native_contexts_list( | 696 isolate_->heap()->set_native_contexts_list( |
| 696 isolate_->heap()->undefined_value()); | 697 isolate_->heap()->undefined_value()); |
| 697 | 698 |
| 698 // Update data pointers to the external strings containing natives sources. | 699 // Update data pointers to the external strings containing natives sources. |
| 699 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { | 700 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { |
| 700 Object* source = isolate_->heap()->natives_source_cache()->get(i); | 701 Object* source = isolate_->heap()->natives_source_cache()->get(i); |
| 701 if (!source->IsUndefined()) { | 702 if (!source->IsUndefined()) { |
| 702 ExternalAsciiString::cast(source)->update_data_cache(); | 703 ExternalAsciiString::cast(source)->update_data_cache(); |
| 704 } |
| 703 } | 705 } |
| 704 } | 706 } |
| 707 |
| 708 // Issue code events for newly deserialized code objects. |
| 709 LOG_CODE_EVENT(isolate_, LogCodeObjects()); |
| 710 LOG_CODE_EVENT(isolate_, LogCompiledFunctions()); |
| 705 } | 711 } |
| 706 | 712 |
| 707 | 713 |
| 708 void Deserializer::DeserializePartial(Object** root) { | 714 void Deserializer::DeserializePartial(Object** root) { |
| 709 isolate_ = Isolate::Current(); | 715 isolate_ = Isolate::Current(); |
| 710 // Don't GC while deserializing - just expand the heap. | 716 // Don't GC while deserializing - just expand the heap. |
| 711 AlwaysAllocateScope always_allocate; | 717 AlwaysAllocateScope always_allocate; |
| 712 // Don't use the free lists while deserializing. | 718 // Don't use the free lists while deserializing. |
| 713 LinearAllocationScope allocate_linearly; | 719 LinearAllocationScope allocate_linearly; |
| 714 if (external_reference_decoder_ == NULL) { | 720 if (external_reference_decoder_ == NULL) { |
| 715 external_reference_decoder_ = new ExternalReferenceDecoder(); | 721 external_reference_decoder_ = new ExternalReferenceDecoder(); |
| 716 } | 722 } |
| 723 |
| 724 // Keep track of the code space start and end pointers in case new |
| 725 // code objects were unserialized |
| 726 OldSpace* code_space = isolate_->heap()->code_space(); |
| 727 Address start_address = code_space->top(); |
| 717 VisitPointer(root); | 728 VisitPointer(root); |
| 729 |
| 730 // There's no code deserialized here. If this assert fires |
| 731 // then that's changed and logging should be added to notify |
| 732 // the profiler et al of the new code. |
| 733 CHECK_EQ(start_address, code_space->top()); |
| 718 } | 734 } |
| 719 | 735 |
| 720 | 736 |
| 721 Deserializer::~Deserializer() { | 737 Deserializer::~Deserializer() { |
| 722 ASSERT(source_->AtEOF()); | 738 ASSERT(source_->AtEOF()); |
| 723 if (external_reference_decoder_) { | 739 if (external_reference_decoder_) { |
| 724 delete external_reference_decoder_; | 740 delete external_reference_decoder_; |
| 725 external_reference_decoder_ = NULL; | 741 external_reference_decoder_ = NULL; |
| 726 } | 742 } |
| 727 } | 743 } |
| (...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1706 int Serializer::SpaceAreaSize(int space) { | 1722 int Serializer::SpaceAreaSize(int space) { |
| 1707 if (space == CODE_SPACE) { | 1723 if (space == CODE_SPACE) { |
| 1708 return isolate_->memory_allocator()->CodePageAreaSize(); | 1724 return isolate_->memory_allocator()->CodePageAreaSize(); |
| 1709 } else { | 1725 } else { |
| 1710 return Page::kPageSize - Page::kObjectStartOffset; | 1726 return Page::kPageSize - Page::kObjectStartOffset; |
| 1711 } | 1727 } |
| 1712 } | 1728 } |
| 1713 | 1729 |
| 1714 | 1730 |
| 1715 } } // namespace v8::internal | 1731 } } // namespace v8::internal |
| OLD | NEW |