Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Unified Diff: src/serialize.cc

Issue 376223002: Refactor ScriptData class for cached compile data. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/serialize.cc
diff --git a/src/serialize.cc b/src/serialize.cc
index ca7adcbaa1a0910f371b4918b10949ba79cd7c91..14640fe08977639dfe372c57bf1c0f23217f0b9b 100644
--- a/src/serialize.cc
+++ b/src/serialize.cc
@@ -1797,13 +1797,12 @@ int Serializer::SpaceAreaSize(int space) {
}
-void Serializer::PadByte() { sink_->Put(kNop, "Padding"); }
-
-
void Serializer::Pad() {
// The non-branching GetInt will read up to 3 bytes too far, so we need
// to pad the snapshot to make sure we don't read over the end.
- for (unsigned i = 0; i < sizeof(int32_t) - 1; i++) PadByte();
+ for (unsigned i = 0; i < sizeof(int32_t) - 1; i++) {
+ sink_->Put(kNop, "Padding");
+ }
}
@@ -1815,33 +1814,16 @@ void Serializer::InitializeCodeAddressMap() {
ScriptData* CodeSerializer::Serialize(Handle<SharedFunctionInfo> info) {
// Serialize code object.
- List<char> payload;
- ListSnapshotSink listsink(&payload);
- CodeSerializer ser(info->GetIsolate(), &listsink);
+ List<byte> payload;
+ ListSnapshotSink list_sink(&payload);
+ CodeSerializer cs(info->GetIsolate(), &list_sink);
DisallowHeapAllocation no_gc;
Object** location = Handle<Object>::cast(info).location();
- ser.VisitPointer(location);
- ser.Pad();
-
- // Allocate storage. The payload length may not be aligned. Round up.
- // TODO(yangguo) replace ScriptData with a more generic super class.
- int payload_length = payload.length();
- int raw_length = payload_length / sizeof(unsigned) + kHeaderSize;
- if (!IsAligned(payload_length, sizeof(unsigned))) raw_length++;
- unsigned* raw_data = i::NewArray<unsigned>(raw_length);
- char* payload_data = reinterpret_cast<char*>(raw_data + kHeaderSize);
-
- // Write header.
- raw_data[kVersionHashOffset] = Version::Hash();
- raw_data[kPayloadLengthOffset] = payload_length;
- STATIC_ASSERT(NEW_SPACE == 0);
- for (int i = NEW_SPACE; i <= PROPERTY_CELL_SPACE; i++) {
- raw_data[kReservationsOffset + i] = ser.CurrentAllocationAddress(i);
- }
+ cs.VisitPointer(location);
+ cs.Pad();
- CopyBytes(payload_data, payload.begin(), static_cast<size_t>(payload_length));
-
- return new ScriptData(Vector<unsigned>(raw_data, raw_length), true);
+ SerializedCodeData data(&payload, &cs);
+ return data.GetScriptData();
}
@@ -1890,20 +1872,13 @@ void CodeSerializer::SerializeObject(Object* o, HowToCode how_to_code,
Object* CodeSerializer::Deserialize(Isolate* isolate, ScriptData* data) {
- const unsigned* raw_data = reinterpret_cast<const unsigned*>(data->Data());
- CHECK_EQ(Version::Hash(), raw_data[kVersionHashOffset]);
- int payload_length = raw_data[kPayloadLengthOffset];
- const byte* payload_data =
- reinterpret_cast<const byte*>(raw_data + kHeaderSize);
- ASSERT_LE(payload_length, data->Length() - kHeaderSize);
-
- SnapshotByteSource payload(payload_data, payload_length);
+ SerializedCodeData scd(data);
+ SnapshotByteSource payload(scd.Payload(), scd.PayloadLength());
Deserializer deserializer(&payload);
STATIC_ASSERT(NEW_SPACE == 0);
// TODO(yangguo) what happens if remaining new space is too small?
for (int i = NEW_SPACE; i <= PROPERTY_CELL_SPACE; i++) {
- deserializer.set_reservation(
- i, raw_data[CodeSerializer::kReservationsOffset + i]);
+ deserializer.set_reservation(i, scd.GetReservation(i));
}
Object* root;
deserializer.DeserializePartial(isolate, &root);
@@ -1911,4 +1886,27 @@ Object* CodeSerializer::Deserialize(Isolate* isolate, ScriptData* data) {
ASSERT(root->IsSharedFunctionInfo());
return root;
}
+
+
+SerializedCodeData::SerializedCodeData(List<byte>* payload, CodeSerializer* cs)
+ : owns_script_data_(true) {
+ int data_length = payload->length() + kHeaderEntries * kIntSize;
+ byte* data = NewArray<byte>(data_length);
+ ASSERT(IsAligned(reinterpret_cast<intptr_t>(data), kPointerAlignment));
+ CopyBytes(data + kHeaderEntries * kIntSize, payload->begin(),
+ static_cast<size_t>(payload->length()));
+ script_data_ = new ScriptData(data, data_length);
+ script_data_->AcquireDataOwnership();
+ SetHeaderValue(kVersionHashOffset, Version::Hash());
+ STATIC_ASSERT(NEW_SPACE == 0);
+ for (int i = NEW_SPACE; i <= PROPERTY_CELL_SPACE; i++) {
+ SetHeaderValue(kReservationsOffset + i, cs->CurrentAllocationAddress(i));
+ }
+}
+
+
+bool SerializedCodeData::IsSane() {
+ return GetHeaderValue(kVersionHashOffset) == Version::Hash() &&
+ PayloadLength() >= SharedFunctionInfo::kSize;
+}
} } // namespace v8::internal
« src/preparse-data.h ('K') | « src/serialize.h ('k') | src/snapshot-source-sink.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698