Index: src/liveedit.cc |
diff --git a/src/liveedit.cc b/src/liveedit.cc |
index 47208f660c54f93e4aff452ff118d0a492e66f8f..dac6aff156952cdc259f1a9aa17178cc4301ec9c 100644 |
--- a/src/liveedit.cc |
+++ b/src/liveedit.cc |
@@ -923,37 +923,35 @@ void LiveEdit::WrapSharedFunctionInfos(Handle<JSArray> array) { |
} |
-// Visitor that collects all references to a particular code object, |
-// including "CODE_TARGET" references in other code objects. |
-// It works in context of ZoneScope. |
-class ReferenceCollectorVisitor : public ObjectVisitor { |
+// Visitor that finds all references to a particular code object, |
+// including "CODE_TARGET" references in other code objects and replaces |
+// them on the fly. |
+class ReplacingVisitor : public ObjectVisitor { |
public: |
- ReferenceCollectorVisitor(Code* original, Zone* zone) |
- : original_(original), |
- rvalues_(10, zone), |
- reloc_infos_(10, zone), |
- code_entries_(10, zone), |
- zone_(zone) { |
+ explicit ReplacingVisitor(Code* original, Code* substitution) |
+ : original_(original), substitution_(substitution) { |
} |
virtual void VisitPointers(Object** start, Object** end) { |
for (Object** p = start; p < end; p++) { |
if (*p == original_) { |
- rvalues_.Add(p, zone_); |
+ *p = substitution_; |
} |
} |
} |
virtual void VisitCodeEntry(Address entry) { |
if (Code::GetObjectFromEntryAddress(entry) == original_) { |
- code_entries_.Add(entry, zone_); |
+ Address substitution_entry = substitution_->instruction_start(); |
+ Memory::Address_at(entry) = substitution_entry; |
} |
} |
virtual void VisitCodeTarget(RelocInfo* rinfo) { |
if (RelocInfo::IsCodeTarget(rinfo->rmode()) && |
Code::GetCodeFromTargetAddress(rinfo->target_address()) == original_) { |
- reloc_infos_.Add(*rinfo, zone_); |
+ Address substitution_entry = substitution_->instruction_start(); |
+ rinfo->set_target_address(substitution_entry); |
} |
} |
@@ -961,28 +959,9 @@ class ReferenceCollectorVisitor : public ObjectVisitor { |
VisitCodeTarget(rinfo); |
} |
- // Post-visiting method that iterates over all collected references and |
- // modifies them. |
- void Replace(Code* substitution) { |
- for (int i = 0; i < rvalues_.length(); i++) { |
- *(rvalues_[i]) = substitution; |
- } |
- Address substitution_entry = substitution->instruction_start(); |
- for (int i = 0; i < reloc_infos_.length(); i++) { |
- reloc_infos_[i].set_target_address(substitution_entry); |
- } |
- for (int i = 0; i < code_entries_.length(); i++) { |
- Address entry = code_entries_[i]; |
- Memory::Address_at(entry) = substitution_entry; |
- } |
- } |
- |
private: |
Code* original_; |
- ZoneList<Object**> rvalues_; |
- ZoneList<RelocInfo> reloc_infos_; |
- ZoneList<Address> code_entries_; |
- Zone* zone_; |
+ Code* substitution_; |
}; |
@@ -990,28 +969,21 @@ class ReferenceCollectorVisitor : public ObjectVisitor { |
static void ReplaceCodeObject(Code* original, Code* substitution) { |
ASSERT(!HEAP->InNewSpace(substitution)); |
- HeapIterator iterator; |
AssertNoAllocation no_allocations_please; |
- // A zone scope for ReferenceCollectorVisitor. |
- ZoneScope scope(Isolate::Current(), DELETE_ON_EXIT); |
- |
- ReferenceCollectorVisitor visitor(original, Isolate::Current()->zone()); |
+ ReplacingVisitor visitor(original, substitution); |
// Iterate over all roots. Stack frames may have pointer into original code, |
// so temporary replace the pointers with offset numbers |
// in prologue/epilogue. |
- { |
- HEAP->IterateStrongRoots(&visitor, VISIT_ALL); |
- } |
+ HEAP->IterateRoots(&visitor, VISIT_ALL); |
// Now iterate over all pointers of all objects, including code_target |
// implicit pointers. |
+ HeapIterator iterator; |
for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
obj->Iterate(&visitor); |
} |
- |
- visitor.Replace(substitution); |
} |