Thank you. I should say that I'm not going to be at work until Monday.
At the first glance x64 works fine, but I haven't tested it much yet. From
debugger I didn't notice some arch-specific code, but I can be missing
something.
My main concern is whether I can modify pointer while iterating the heap
(probably I can).

Peter

2012/5/11 Erik Corry <[email protected]>

> I'll take a look tomorrow.
>
> Does it work on 64 bit?
>
> On Thu, May 10, 2012 at 11:20 PM,  <[email protected]> wrote:
> > Reviewers: Erik Corry,
> >
> > Message:
> > Hi Erik
> >
> > Do you think it looks like a fix for
> > http://code.google.com/p/v8/issues/detail?id=915
> > ?
> >
> > Peter
> >
> > Description:
> > Fix for Issue 915
> >
> >
> > Please review this at http://codereview.chromium.org/10332101/
> >
> > SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
> >
> > Affected files:
> >  M src/liveedit.cc
> >
> >
> > Index: src/liveedit.cc
> > diff --git a/src/liveedit.cc b/src/liveedit.cc
> > index
> >
> 22b82501e91f244b7bf16839e30ffb295c51e34d..76da4fc8424a076d703a940a2b7a14f63d03d97c
> > 100644
> > --- a/src/liveedit.cc
> > +++ b/src/liveedit.cc
> > @@ -922,33 +922,37 @@ 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.
> > +// TODO: Will heap iteration tolerate this changes-on-iteration?
> > +// TODO: Do we have to deal with any kind of write barriers here?
> > +class ReplacingVisitor : public ObjectVisitor {
> >  public:
> > -  explicit ReferenceCollectorVisitor(Code* original)
> > -    : original_(original), rvalues_(10), reloc_infos_(10),
> > code_entries_(10) {
> > +  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);
> > +        *p = substitution_;
> >       }
> >     }
> >   }
> >
> >   virtual void VisitCodeEntry(Address entry) {
> >     if (Code::GetObjectFromEntryAddress(entry) == original_) {
> > -      code_entries_.Add(entry);
> > +      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);
> > +      Address substitution_entry = substitution_->instruction_start();
> > +      rinfo->set_target_address(substitution_entry);
> >     }
> >   }
> >
> > @@ -956,27 +960,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_;
> > +  Code* substitution_;
> >  };
> >
> >
> > @@ -984,28 +970,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);
> > +  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);
> >  }
> >
> >
> >
> >
>
>
>
> --
> Erik Corry, Software Engineer
> Google Denmark ApS - Frederiksborggade 20B, 1 sal,
> 1360 København K - Denmark - CVR nr. 28 86 69 84
>

-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to