From: peter.rybin@gmail.com Date: Sat, 16 Jun 2012 21:40:35 +0000 (+0000) Subject: Fix for Issue 915 X-Git-Tag: upstream/4.7.83~16521 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a2e9f7c46b264cc4e71a731aeee6e601f20e546a;p=platform%2Fupstream%2Fv8.git Fix for Issue 915 Review URL: https://chromiumcodereview.appspot.com/10332101 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11837 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/liveedit.cc b/src/liveedit.cc index 47208f6..dac6aff 100644 --- a/src/liveedit.cc +++ b/src/liveedit.cc @@ -923,37 +923,35 @@ void LiveEdit::WrapSharedFunctionInfos(Handle 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 rvalues_; - ZoneList reloc_infos_; - ZoneList
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); } diff --git a/test/mjsunit/mjsunit.status b/test/mjsunit/mjsunit.status index da5026d..b526d7f 100644 --- a/test/mjsunit/mjsunit.status +++ b/test/mjsunit/mjsunit.status @@ -59,12 +59,6 @@ array-constructor: PASS || TIMEOUT # Very slow on ARM and MIPS, contains no architecture dependent code. unicode-case-overoptimization: PASS, TIMEOUT if ($arch == arm || $arch == mips) -# Stack manipulations in LiveEdit are buggy - see bug 915 -debug-liveedit-check-stack: SKIP -debug-liveedit-patch-positions-replace: SKIP -debug-liveedit-stack-padding: SKIP -debug-liveedit-restart-frame: SKIP - # Test Crankshaft compilation time. Expected to take too long in debug mode. regress/regress-1969: PASS, SKIP if $mode == debug @@ -127,6 +121,11 @@ regress/regress-3247124: SKIP # should be platform-independent. regress/regress-1132: SKIP +# Stack manipulations in LiveEdit is not implemented for this arch. +debug-liveedit-check-stack: SKIP +debug-liveedit-stack-padding: SKIP +debug-liveedit-restart-frame: SKIP + ############################################################################## [ $arch == mips ] @@ -175,3 +174,9 @@ regress/regress-3247124: SKIP # the test requires too much time to run. However, the problem test covers # should be platform-independent. regress/regress-1132: SKIP + +# Stack manipulations in LiveEdit is not implemented for this arch. +debug-liveedit-check-stack: SKIP +debug-liveedit-stack-padding: SKIP +debug-liveedit-restart-frame: SKIP +