Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/src/snapshot/partial-serializer.cc b/src/snapshot/partial-serializer.cc
index 34defb4..b46f675 100644
--- a/src/snapshot/partial-serializer.cc
+++ b/src/snapshot/partial-serializer.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "src/snapshot/partial-serializer.h"
+#include "src/snapshot/startup-serializer.h"
#include "src/objects-inl.h"
@@ -10,11 +11,8 @@
namespace internal {
PartialSerializer::PartialSerializer(Isolate* isolate,
- Serializer* startup_snapshot_serializer,
- SnapshotByteSink* sink)
- : Serializer(isolate, sink),
- startup_serializer_(startup_snapshot_serializer),
- next_partial_cache_index_(0) {
+ StartupSerializer* startup_serializer)
+ : Serializer(isolate), startup_serializer_(startup_serializer) {
InitializeCodeAddressMap();
}
@@ -34,7 +32,7 @@
if (context->IsNativeContext()) {
context->set(Context::NEXT_CONTEXT_LINK,
isolate_->heap()->undefined_value());
- DCHECK(!context->global_object()->IsUndefined());
+ DCHECK(!context->global_object()->IsUndefined(context->GetIsolate()));
}
}
VisitPointer(o);
@@ -53,19 +51,23 @@
// Replace typed arrays by undefined.
if (obj->IsJSTypedArray()) obj = isolate_->heap()->undefined_value();
+ if (SerializeHotObject(obj, how_to_code, where_to_point, skip)) return;
+
int root_index = root_index_map_.Lookup(obj);
if (root_index != RootIndexMap::kInvalidRootIndex) {
PutRoot(root_index, obj, how_to_code, where_to_point, skip);
return;
}
+ if (SerializeBackReference(obj, how_to_code, where_to_point, skip)) return;
+
if (ShouldBeInThePartialSnapshotCache(obj)) {
FlushSkip(skip);
- int cache_index = PartialSnapshotCacheIndex(obj);
- sink_->Put(kPartialSnapshotCache + how_to_code + where_to_point,
- "PartialSnapshotCache");
- sink_->PutInt(cache_index, "partial_snapshot_cache_index");
+ int cache_index = startup_serializer_->PartialSnapshotCacheIndex(obj);
+ sink_.Put(kPartialSnapshotCache + how_to_code + where_to_point,
+ "PartialSnapshotCache");
+ sink_.PutInt(cache_index, "partial_snapshot_cache_index");
return;
}
@@ -76,35 +78,26 @@
// All the internalized strings that the partial snapshot needs should be
// either in the root table or in the partial snapshot cache.
DCHECK(!obj->IsInternalizedString());
-
- if (SerializeKnownObject(obj, how_to_code, where_to_point, skip)) return;
+ // Function and object templates are not context specific.
+ DCHECK(!obj->IsTemplateInfo());
FlushSkip(skip);
// Clear literal boilerplates.
if (obj->IsJSFunction()) {
- FixedArray* literals = JSFunction::cast(obj)->literals();
- for (int i = 0; i < literals->length(); i++) literals->set_undefined(i);
+ JSFunction* function = JSFunction::cast(obj);
+ LiteralsArray* literals = function->literals();
+ for (int i = 0; i < literals->literals_count(); i++) {
+ literals->set_literal_undefined(i);
+ }
+ function->ClearTypeFeedbackInfo();
}
// Object has not yet been serialized. Serialize it here.
- ObjectSerializer serializer(this, obj, sink_, how_to_code, where_to_point);
+ ObjectSerializer serializer(this, obj, &sink_, how_to_code, where_to_point);
serializer.Serialize();
}
-int PartialSerializer::PartialSnapshotCacheIndex(HeapObject* heap_object) {
- int index = partial_cache_index_map_.LookupOrInsert(
- heap_object, next_partial_cache_index_);
- if (index == PartialCacheIndexMap::kInvalidIndex) {
- // This object is not part of the partial snapshot cache yet. Add it to the
- // startup snapshot so we can refer to it via partial snapshot index from
- // the partial snapshot.
- startup_serializer_->VisitPointer(reinterpret_cast<Object**>(&heap_object));
- return next_partial_cache_index_++;
- }
- return index;
-}
-
bool PartialSerializer::ShouldBeInThePartialSnapshotCache(HeapObject* o) {
// Scripts should be referred only through shared function infos. We can't
// allow them to be part of the partial snapshot because they contain a