OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/snapshot/deserializer.h" | 5 #include "src/snapshot/deserializer.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/assembler-inl.h" | 8 #include "src/assembler-inl.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/deoptimizer.h" | |
10 #include "src/external-reference-table.h" | 11 #include "src/external-reference-table.h" |
11 #include "src/heap/heap-inl.h" | 12 #include "src/heap/heap-inl.h" |
12 #include "src/isolate.h" | 13 #include "src/isolate.h" |
13 #include "src/macro-assembler.h" | 14 #include "src/macro-assembler.h" |
14 #include "src/objects-inl.h" | 15 #include "src/objects-inl.h" |
15 #include "src/snapshot/natives.h" | 16 #include "src/snapshot/natives.h" |
16 #include "src/v8.h" | 17 #include "src/v8.h" |
17 #include "src/v8threads.h" | 18 #include "src/v8threads.h" |
18 | 19 |
19 namespace v8 { | 20 namespace v8 { |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
725 #undef CASE_BODY | 726 #undef CASE_BODY |
726 #undef ALL_SPACES | 727 #undef ALL_SPACES |
727 | 728 |
728 case kSkip: { | 729 case kSkip: { |
729 int size = source_.GetInt(); | 730 int size = source_.GetInt(); |
730 current = reinterpret_cast<Object**>( | 731 current = reinterpret_cast<Object**>( |
731 reinterpret_cast<intptr_t>(current) + size); | 732 reinterpret_cast<intptr_t>(current) + size); |
732 break; | 733 break; |
733 } | 734 } |
734 | 735 |
736 case kDeoptimizerEntryFromCode: | |
737 case kDeoptimizerEntryPlain: { | |
738 int skip = source_.GetInt(); | |
739 current = reinterpret_cast<Object**>( | |
740 reinterpret_cast<Address>(current) + skip); | |
Yang
2017/04/04 07:59:21
Can we cast to intptr_t like everywhere else with
Slava Chigrin
2017/04/04 10:12:24
Done.
| |
741 Deoptimizer::BailoutType bailout_type = | |
742 static_cast<Deoptimizer::BailoutType>(source_.Get()); | |
743 int entry_id = source_.GetInt(); | |
744 HandleScope scope(isolate); | |
Yang
2017/04/04 07:59:21
why do we need a handlescope here?
Slava Chigrin
2017/04/04 10:12:24
Deoptimizer::EnsureCodeForDeoptimizationEntry crea
| |
745 Address address = Deoptimizer::GetDeoptimizationEntry( | |
746 isolate_, entry_id, bailout_type, Deoptimizer::ENSURE_ENTRY_CODE); | |
747 if (data == kDeoptimizerEntryFromCode) { | |
748 Address location_of_branch_data = reinterpret_cast<Address>(current); | |
749 Assembler::deserialization_set_special_target_at( | |
750 isolate, location_of_branch_data, | |
751 Code::cast(HeapObject::FromAddress(current_object_address)), | |
752 address); | |
753 location_of_branch_data += Assembler::kSpecialTargetSize; | |
754 current = reinterpret_cast<Object**>(location_of_branch_data); | |
755 } else { | |
756 Object* new_object = reinterpret_cast<Object*>(address); | |
757 UnalignedCopy(current, &new_object); | |
758 current++; | |
759 } | |
760 break; | |
761 } | |
762 | |
735 case kInternalReferenceEncoded: | 763 case kInternalReferenceEncoded: |
736 case kInternalReference: { | 764 case kInternalReference: { |
737 // Internal reference address is not encoded via skip, but by offset | 765 // Internal reference address is not encoded via skip, but by offset |
738 // from code entry. | 766 // from code entry. |
739 int pc_offset = source_.GetInt(); | 767 int pc_offset = source_.GetInt(); |
740 int target_offset = source_.GetInt(); | 768 int target_offset = source_.GetInt(); |
741 Code* code = | 769 Code* code = |
742 Code::cast(HeapObject::FromAddress(current_object_address)); | 770 Code::cast(HeapObject::FromAddress(current_object_address)); |
743 DCHECK(0 <= pc_offset && pc_offset <= code->instruction_size()); | 771 DCHECK(0 <= pc_offset && pc_offset <= code->instruction_size()); |
744 DCHECK(0 <= target_offset && target_offset <= code->instruction_size()); | 772 DCHECK(0 <= target_offset && target_offset <= code->instruction_size()); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
890 | 918 |
891 default: | 919 default: |
892 CHECK(false); | 920 CHECK(false); |
893 } | 921 } |
894 } | 922 } |
895 CHECK_EQ(limit, current); | 923 CHECK_EQ(limit, current); |
896 return true; | 924 return true; |
897 } | 925 } |
898 } // namespace internal | 926 } // namespace internal |
899 } // namespace v8 | 927 } // namespace v8 |
OLD | NEW |