Revision: 2932
Author: [email protected]
Date: Fri Sep 18 03:50:08 2009
Log: Don't convert jump and call targets to code object pointers when  
(de)serializing.
Review URL: http://codereview.chromium.org/207012
http://code.google.com/p/v8/source/detail?r=2932

Modified:
  /branches/bleeding_edge/src/serialize.cc
  /branches/bleeding_edge/src/serialize.h

=======================================
--- /branches/bleeding_edge/src/serialize.cc    Wed Sep  9 02:35:34 2009
+++ /branches/bleeding_edge/src/serialize.cc    Fri Sep 18 03:50:08 2009
@@ -934,6 +934,19 @@
        }
      }
    }
+
+  // Do not assert that code targets have been converted to object  
pointers.
+  virtual void BeginCodeIteration(Code* code) {
+  }
+
+  virtual void VisitCodeTarget(RelocInfo* rinfo) {
+    ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+    Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+    Address encoded_target = serializer_->GetSavedAddress(target);
+    offsets_.Add(rinfo->target_address_address() - obj_address_);
+    addresses_.Add(encoded_target);
+  }
+

    virtual void VisitExternalReferences(Address* start, Address* end) {
      for (Address* p = start; p < end; ++p) {
@@ -1091,6 +1104,14 @@
    }
    root_ = root;
  }
+
+
+void Serializer::VisitCodeTarget(RelocInfo* rinfo) {
+  ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+  Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+  bool serialized;
+  Encode(target, &serialized);
+}


  class GlobalHandlesRetriever: public ObjectVisitor {
@@ -1255,10 +1276,7 @@
    SaveAddress(obj, addr);

    if (type == CODE_TYPE) {
-    Code* code = Code::cast(obj);
-    // Ensure Code objects contain Object pointers, not Addresses.
-    code->ConvertICTargetsFromAddressToObject();
-    LOG(CodeMoveEvent(code->address(), addr));
+    LOG(CodeMoveEvent(obj->address(), addr));
    }

    // Write out the object prologue: type, size, and simulated address of  
obj.
@@ -1290,12 +1308,6 @@
    }
  #endif

-  if (type == CODE_TYPE) {
-    Code* code = Code::cast(obj);
-    // Convert relocations from Object* to Address in Code objects
-    code->ConvertICTargetsFromObjectToAddress();
-  }
-
    objects_++;
    return addr;
  }
@@ -1420,6 +1432,14 @@
    }
    root_ = root;
  }
+
+
+void Deserializer::VisitCodeTarget(RelocInfo* rinfo) {
+  ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+  Address encoded_address =  
reinterpret_cast<Address>(rinfo->target_object());
+  Code* target_object = reinterpret_cast<Code*>(Resolve(encoded_address));
+  rinfo->set_target_address(target_object->instruction_start());
+}


  void Deserializer::VisitExternalReferences(Address* start, Address* end) {
@@ -1617,8 +1637,6 @@

    if (type == CODE_TYPE) {
      Code* code = Code::cast(obj);
-    // Convert relocations from Object* to Address in Code objects
-    code->ConvertICTargetsFromObjectToAddress();
      LOG(CodeMoveEvent(a, code->address()));
    }
    objects_++;
=======================================
--- /branches/bleeding_edge/src/serialize.h     Wed Sep  9 02:35:34 2009
+++ /branches/bleeding_edge/src/serialize.h     Fri Sep 18 03:50:08 2009
@@ -154,8 +154,9 @@
   private:
    friend class ReferenceUpdater;

+  virtual void BeginCodeIteration(Code* code) { }
    virtual void VisitPointers(Object** start, Object** end);
-
+  virtual void VisitCodeTarget(RelocInfo* rinfo);
    bool IsVisited(HeapObject* obj);

    Address GetSavedAddress(HeapObject* obj);
@@ -289,6 +290,8 @@

   private:
    virtual void VisitPointers(Object** start, Object** end);
+  virtual void BeginCodeIteration(Code* code) { }
+  virtual void VisitCodeTarget(RelocInfo* rinfo);
    virtual void VisitExternalReferences(Address* start, Address* end);
    virtual void VisitRuntimeEntry(RelocInfo* rinfo);


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

Reply via email to