Reviewers: mvstanton, Yang,

Description:
Add a CHECK to make sure we don't accidentally serialize type feedback

BUG=chromium:440984
[email protected],[email protected]
LOG=n

Please review this at https://codereview.chromium.org/803063002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+50, -9 lines):
  M src/serialize.h
  M src/serialize.cc
  M src/type-feedback-vector.h
  M src/type-feedback-vector.cc


Index: src/serialize.cc
diff --git a/src/serialize.cc b/src/serialize.cc
index 01c55a1226efedc5cca0d8bc1f80ad99dede6ba4..d58d8e200f04abd7c74abb20a2ecc7a10736a490 100644
--- a/src/serialize.cc
+++ b/src/serialize.cc
@@ -1307,14 +1307,16 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
 }


-Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink)
+Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink,
+                       bool allow_type_feedback)
     : isolate_(isolate),
       sink_(sink),
       external_reference_encoder_(new ExternalReferenceEncoder(isolate)),
       root_index_map_(isolate),
       code_address_map_(NULL),
       large_objects_total_size_(0),
-      seen_large_objects_index_(0) {
+      seen_large_objects_index_(0),
+      allow_type_feedback_(allow_type_feedback) {
// The serializer is meant to be used only to generate initial heap images
   // from a context in which there is only one isolate.
   for (int i = 0; i < kNumberOfPreallocatedSpaces; i++) {
@@ -1768,6 +1770,12 @@ void Serializer::ObjectSerializer::Serialize() {
     }
   }

+ if (object_->IsSharedFunctionInfo() && !serializer_->allow_type_feedback_) {
+    CHECK(SharedFunctionInfo::cast(object_)
+              ->feedback_vector()
+              ->CanBeSerialized());
+  }
+
   int size = object_->Size();
   Map* map = object_->map();
   SerializePrologue(Serializer::SpaceOfObject(object_), size, map);
Index: src/serialize.h
diff --git a/src/serialize.h b/src/serialize.h
index bd0c423a6aa8281838806e682afdabd7723b641e..aa9fc8073e7776498c23f2603c92783b2a53c14e 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -593,7 +593,8 @@ class CodeAddressMap;
 // There can be only one serializer per V8 process.
 class Serializer : public SerializerDeserializer {
  public:
-  Serializer(Isolate* isolate, SnapshotByteSink* sink);
+  Serializer(Isolate* isolate, SnapshotByteSink* sink,
+             bool allow_type_feedback);
   ~Serializer();
   void VisitPointers(Object** start, Object** end) OVERRIDE;

@@ -725,6 +726,7 @@ class Serializer : public SerializerDeserializer {
   // We map serialized large objects to indexes for back-referencing.
   uint32_t large_objects_total_size_;
   uint32_t seen_large_objects_index_;
+  bool allow_type_feedback_;

   DISALLOW_COPY_AND_ASSIGN(Serializer);
 };
@@ -732,11 +734,10 @@ class Serializer : public SerializerDeserializer {

 class PartialSerializer : public Serializer {
  public:
-  PartialSerializer(Isolate* isolate,
-                    Serializer* startup_snapshot_serializer,
+ PartialSerializer(Isolate* isolate, Serializer* startup_snapshot_serializer,
                     SnapshotByteSink* sink)
-    : Serializer(isolate, sink),
-      startup_serializer_(startup_snapshot_serializer) {
+      : Serializer(isolate, sink, true),
+        startup_serializer_(startup_snapshot_serializer) {
     InitializeCodeAddressMap();
   }

@@ -769,7 +770,7 @@ class PartialSerializer : public Serializer {
 class StartupSerializer : public Serializer {
  public:
   StartupSerializer(Isolate* isolate, SnapshotByteSink* sink)
-      : Serializer(isolate, sink), root_index_wave_front_(0) {
+      : Serializer(isolate, sink, true), root_index_wave_front_(0) {
     // Clear the cache of objects used by the partial snapshot.  After the
     // strong roots have been serialized we can create a partial snapshot
     // which will repopulate the cache with objects needed by that partial
@@ -827,7 +828,7 @@ class CodeSerializer : public Serializer {
  private:
   CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source,
                  Code* main_code)
-      : Serializer(isolate, sink),
+      : Serializer(isolate, sink, false),
         source_(source),
         main_code_(main_code),
         num_internalized_strings_(0) {
Index: src/type-feedback-vector.cc
diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc
index 45028b87879f7bbe2984179c111f586ce6f9025e..00d2252256cb142fee159f80e1e321bce901fd4e 100644
--- a/src/type-feedback-vector.cc
+++ b/src/type-feedback-vector.cc
@@ -207,6 +207,35 @@ void TypeFeedbackVector::ClearSlots(SharedFunctionInfo* shared) {
 }


+bool TypeFeedbackVector::CanBeSerialized() {
+  int slots = Slots();
+  Isolate* isolate = GetIsolate();
+  Object* uninitialized_sentinel =
+      TypeFeedbackVector::RawUninitializedSentinel(isolate->heap());
+
+  for (int i = 0; i < slots; i++) {
+    FeedbackVectorSlot slot(i);
+    Object* obj = Get(slot);
+    if (obj->IsHeapObject() && obj != uninitialized_sentinel) {
+      return false;
+    }
+  }
+
+  slots = ICSlots();
+  if (slots == 0) return true;
+
+  // Now check vector-based ICs.
+  for (int i = 0; i < slots; i++) {
+    FeedbackVectorICSlot slot(i);
+    Object* obj = Get(slot);
+    if (obj != uninitialized_sentinel) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
 Handle<FixedArray> FeedbackNexus::EnsureArrayOfSize(int length) {
   Isolate* isolate = GetIsolate();
   Handle<Object> feedback = handle(GetFeedback(), isolate);
Index: src/type-feedback-vector.h
diff --git a/src/type-feedback-vector.h b/src/type-feedback-vector.h
index 864f336f90cb733f3e2ce28d875383bc25782231..39946fd4a83bd576b0660fb3ae29e96ab1231d1d 100644
--- a/src/type-feedback-vector.h
+++ b/src/type-feedback-vector.h
@@ -166,6 +166,9 @@ class TypeFeedbackVector : public FixedArray {
   // Clears the vector slots and the vector ic slots.
   void ClearSlots(SharedFunctionInfo* shared);

+  // Returns true if all slots are clear.
+  bool CanBeSerialized();
+
   // The object that indicates an uninitialized cache.
   static inline Handle<Object> UninitializedSentinel(Isolate* isolate);



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to