OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 <iomanip> | 5 #include <iomanip> |
6 #include <sstream> | 6 #include <sstream> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 10745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10756 Object* cell = rinfo->target_cell(); | 10756 Object* cell = rinfo->target_cell(); |
10757 Object* old_cell = cell; | 10757 Object* old_cell = cell; |
10758 VisitPointer(&cell); | 10758 VisitPointer(&cell); |
10759 if (cell != old_cell) { | 10759 if (cell != old_cell) { |
10760 rinfo->set_target_cell(reinterpret_cast<Cell*>(cell)); | 10760 rinfo->set_target_cell(reinterpret_cast<Cell*>(cell)); |
10761 } | 10761 } |
10762 } | 10762 } |
10763 | 10763 |
10764 | 10764 |
10765 void ObjectVisitor::VisitDebugTarget(RelocInfo* rinfo) { | 10765 void ObjectVisitor::VisitDebugTarget(RelocInfo* rinfo) { |
10766 DCHECK((RelocInfo::IsJSReturn(rinfo->rmode()) && | 10766 DCHECK(RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && |
10767 rinfo->IsPatchedReturnSequence()) || | 10767 rinfo->IsPatchedDebugBreakSlotSequence()); |
10768 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && | 10768 Object* target = Code::GetCodeFromTargetAddress(rinfo->debug_call_address()); |
10769 rinfo->IsPatchedDebugBreakSlotSequence())); | |
10770 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address()); | |
10771 Object* old_target = target; | 10769 Object* old_target = target; |
10772 VisitPointer(&target); | 10770 VisitPointer(&target); |
10773 CHECK_EQ(target, old_target); // VisitPointer doesn't change Code* *target. | 10771 CHECK_EQ(target, old_target); // VisitPointer doesn't change Code* *target. |
10774 } | 10772 } |
10775 | 10773 |
10776 | 10774 |
10777 void ObjectVisitor::VisitEmbeddedPointer(RelocInfo* rinfo) { | 10775 void ObjectVisitor::VisitEmbeddedPointer(RelocInfo* rinfo) { |
10778 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); | 10776 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
10779 Object* p = rinfo->target_object(); | 10777 Object* p = rinfo->target_object(); |
10780 VisitPointer(&p); | 10778 VisitPointer(&p); |
(...skipping 23 matching lines...) Expand all Loading... |
10804 it.rinfo()->set_target_object(undefined, SKIP_WRITE_BARRIER); | 10802 it.rinfo()->set_target_object(undefined, SKIP_WRITE_BARRIER); |
10805 } else if (mode == RelocInfo::CELL) { | 10803 } else if (mode == RelocInfo::CELL) { |
10806 it.rinfo()->set_target_cell(undefined_cell, SKIP_WRITE_BARRIER); | 10804 it.rinfo()->set_target_cell(undefined_cell, SKIP_WRITE_BARRIER); |
10807 } | 10805 } |
10808 } | 10806 } |
10809 } | 10807 } |
10810 | 10808 |
10811 | 10809 |
10812 void Code::Relocate(intptr_t delta) { | 10810 void Code::Relocate(intptr_t delta) { |
10813 for (RelocIterator it(this, RelocInfo::kApplyMask); !it.done(); it.next()) { | 10811 for (RelocIterator it(this, RelocInfo::kApplyMask); !it.done(); it.next()) { |
10814 it.rinfo()->apply(delta, SKIP_ICACHE_FLUSH); | 10812 it.rinfo()->apply(delta); |
10815 } | 10813 } |
10816 CpuFeatures::FlushICache(instruction_start(), instruction_size()); | 10814 CpuFeatures::FlushICache(instruction_start(), instruction_size()); |
10817 } | 10815 } |
10818 | 10816 |
10819 | 10817 |
10820 void Code::CopyFrom(const CodeDesc& desc) { | 10818 void Code::CopyFrom(const CodeDesc& desc) { |
10821 DCHECK(Marking::Color(this) == Marking::WHITE_OBJECT); | 10819 DCHECK(Marking::Color(this) == Marking::WHITE_OBJECT); |
10822 | 10820 |
10823 // copy code | 10821 // copy code |
10824 CopyBytes(instruction_start(), desc.buffer, | 10822 CopyBytes(instruction_start(), desc.buffer, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10857 SKIP_ICACHE_FLUSH); | 10855 SKIP_ICACHE_FLUSH); |
10858 } else if (RelocInfo::IsRuntimeEntry(mode)) { | 10856 } else if (RelocInfo::IsRuntimeEntry(mode)) { |
10859 Address p = it.rinfo()->target_runtime_entry(origin); | 10857 Address p = it.rinfo()->target_runtime_entry(origin); |
10860 it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER, | 10858 it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER, |
10861 SKIP_ICACHE_FLUSH); | 10859 SKIP_ICACHE_FLUSH); |
10862 } else if (mode == RelocInfo::CODE_AGE_SEQUENCE) { | 10860 } else if (mode == RelocInfo::CODE_AGE_SEQUENCE) { |
10863 Handle<Object> p = it.rinfo()->code_age_stub_handle(origin); | 10861 Handle<Object> p = it.rinfo()->code_age_stub_handle(origin); |
10864 Code* code = Code::cast(*p); | 10862 Code* code = Code::cast(*p); |
10865 it.rinfo()->set_code_age_stub(code, SKIP_ICACHE_FLUSH); | 10863 it.rinfo()->set_code_age_stub(code, SKIP_ICACHE_FLUSH); |
10866 } else { | 10864 } else { |
10867 it.rinfo()->apply(delta, SKIP_ICACHE_FLUSH); | 10865 it.rinfo()->apply(delta); |
10868 } | 10866 } |
10869 } | 10867 } |
10870 CpuFeatures::FlushICache(instruction_start(), instruction_size()); | 10868 CpuFeatures::FlushICache(instruction_start(), instruction_size()); |
10871 } | 10869 } |
10872 | 10870 |
10873 | 10871 |
10874 // Locate the source position which is closest to the address in the code. This | 10872 // Locate the source position which is closest to the address in the code. This |
10875 // is using the source position information embedded in the relocation info. | 10873 // is using the source position information embedded in the relocation info. |
10876 // The position returned is relative to the beginning of the script where the | 10874 // The position returned is relative to the beginning of the script where the |
10877 // source for this function is found. | 10875 // source for this function is found. |
(...skipping 5242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16120 Handle<Object> new_value) { | 16118 Handle<Object> new_value) { |
16121 if (cell->value() != *new_value) { | 16119 if (cell->value() != *new_value) { |
16122 cell->set_value(*new_value); | 16120 cell->set_value(*new_value); |
16123 Isolate* isolate = cell->GetIsolate(); | 16121 Isolate* isolate = cell->GetIsolate(); |
16124 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16122 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
16125 isolate, DependentCode::kPropertyCellChangedGroup); | 16123 isolate, DependentCode::kPropertyCellChangedGroup); |
16126 } | 16124 } |
16127 } | 16125 } |
16128 } // namespace internal | 16126 } // namespace internal |
16129 } // namespace v8 | 16127 } // namespace v8 |
OLD | NEW |