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

Unified Diff: runtime/vm/raw_object_snapshot.cc

Issue 1337083004: - Turn on writing of ic_data_array so that we have that information for script snapshots that would… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review-comments Created 5 years, 3 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
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/raw_object_snapshot.cc
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 06dce1270cfcef8cc55dd362cd12161f0f4d19eb..aa515cd5e9391e6ab3ce0399c84bfa91a77cae9d 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -505,10 +505,7 @@ RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader,
// Set all the object fields.
READ_OBJECT_FIELDS(cls, cls.raw()->from(), cls.raw()->to(), kAsReference);
- ASSERT(((kind == Snapshot::kScript) &&
- !Class::IsInFullSnapshot(cls.source_class())) ||
- (kind == Snapshot::kFull));
-
+ ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
return cls.raw();
}
@@ -632,37 +629,45 @@ RawFunction* Function::ReadFrom(SnapshotReader* reader,
ASSERT(reader != NULL);
ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
- // Allocate function object.
- Function& func = Function::ZoneHandle(
- reader->zone(), NEW_OBJECT(Function));
- reader->AddBackRef(object_id, &func, kIsDeserialized);
-
- // Set all the non object fields.
- func.set_token_pos(reader->Read<int32_t>());
- func.set_end_token_pos(reader->Read<int32_t>());
- func.set_usage_counter(reader->Read<int32_t>());
- func.set_num_fixed_parameters(reader->Read<int16_t>());
- func.set_num_optional_parameters(reader->Read<int16_t>());
- func.set_deoptimization_counter(reader->Read<int16_t>());
- func.set_kind_tag(reader->Read<uint32_t>());
- func.set_optimized_instruction_count(reader->Read<uint16_t>());
- func.set_optimized_call_site_count(reader->Read<uint16_t>());
-
- // Set all the object fields.
- READ_OBJECT_FIELDS(func,
- func.raw()->from(),
- reader->snapshot_code() ? func.raw()->to()
- : func.raw()->to_snapshot(),
- kAsReference);
+ bool is_in_fullsnapshot = reader->Read<bool>();
+ if ((kind == Snapshot::kFull) || !is_in_fullsnapshot) {
+ // Allocate function object.
+ Function& func = Function::ZoneHandle(
+ reader->zone(), NEW_OBJECT(Function));
+ reader->AddBackRef(object_id, &func, kIsDeserialized);
+
+ // Set all the non object fields.
+ func.set_token_pos(reader->Read<int32_t>());
+ func.set_end_token_pos(reader->Read<int32_t>());
+ func.set_usage_counter(reader->Read<int32_t>());
+ func.set_num_fixed_parameters(reader->Read<int16_t>());
+ func.set_num_optional_parameters(reader->Read<int16_t>());
+ func.set_deoptimization_counter(reader->Read<int16_t>());
+ func.set_kind_tag(reader->Read<uint32_t>());
+ func.set_optimized_instruction_count(reader->Read<uint16_t>());
+ func.set_optimized_call_site_count(reader->Read<uint16_t>());
- if (!reader->snapshot_code()) {
- // Initialize all fields that are not part of the snapshot.
- func.ClearICDataArray();
- func.ClearCode();
+ // Set all the object fields.
+ bool is_optimized = func.usage_counter() != 0;
+ RawObject** toobj = reader->snapshot_code() ? func.raw()->to() :
+ (is_optimized ? func.raw()->to_optimized_snapshot() :
+ func.raw()->to_snapshot());
+ READ_OBJECT_FIELDS(func,
+ func.raw()->from(), toobj,
+ kAsReference);
+ if (!reader->snapshot_code()) {
+ // Initialize all fields that are not part of the snapshot.
+ if (!is_optimized) {
+ func.ClearICDataArray();
+ }
+ func.ClearCode();
+ } else {
+ // TODO(rmacnak): Fix entry_point_.
+ }
+ return func.raw();
} else {
- // TODO(rmacnak): Fix entry_point_.
+ return reader->ReadFunctionId(object_id);
}
- return func.raw();
}
@@ -671,6 +676,17 @@ void RawFunction::WriteTo(SnapshotWriter* writer,
Snapshot::Kind kind) {
ASSERT(writer != NULL);
ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
+ bool is_in_fullsnapshot = false;
+ bool owner_is_class = false;
+ if (kind == Snapshot::kScript) {
+ intptr_t tags = writer->GetObjectTags(ptr()->owner_);
+ intptr_t cid = ClassIdTag::decode(tags);
+ owner_is_class = (cid == kClassCid);
+ is_in_fullsnapshot = owner_is_class ?
+ Class::IsInFullSnapshot(reinterpret_cast<RawClass*>(ptr()->owner_)) :
+ PatchClass::IsInFullSnapshot(
+ reinterpret_cast<RawPatchClass*>(ptr()->owner_));
+ }
// Write out the serialization header value for this object.
writer->WriteInlinedObjectHeader(object_id);
@@ -679,25 +695,38 @@ void RawFunction::WriteTo(SnapshotWriter* writer,
writer->WriteVMIsolateObject(kFunctionCid);
writer->WriteTags(writer->GetObjectTags(this));
- // Write out all the non object fields.
- writer->Write<int32_t>(ptr()->token_pos_);
- writer->Write<int32_t>(ptr()->end_token_pos_);
- if (Code::IsOptimized(ptr()->instructions_->ptr()->code_)) {
- writer->Write<int32_t>(FLAG_optimization_counter_threshold);
+ // Write out the boolean is_in_fullsnapshot first as this will
+ // help the reader decide how the rest of the information needs
+ // to be interpreted.
+ writer->Write<bool>(is_in_fullsnapshot);
+
+ if (kind == Snapshot::kFull || !is_in_fullsnapshot) {
+ bool is_optimized = Code::IsOptimized(ptr()->instructions_->ptr()->code_);
+
+ // Write out all the non object fields.
+ writer->Write<int32_t>(ptr()->token_pos_);
+ writer->Write<int32_t>(ptr()->end_token_pos_);
+ if (is_optimized) {
+ writer->Write<int32_t>(FLAG_optimization_counter_threshold);
+ } else {
+ writer->Write<int32_t>(0);
+ }
+ writer->Write<int16_t>(ptr()->num_fixed_parameters_);
+ writer->Write<int16_t>(ptr()->num_optional_parameters_);
+ writer->Write<int16_t>(ptr()->deoptimization_counter_);
+ writer->Write<uint32_t>(ptr()->kind_tag_);
+ writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
+ writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
+
+ // Write out all the object pointer fields.
+ RawObject** toobj =
+ writer->snapshot_code() ? to() :
+ (is_optimized ? to_optimized_snapshot() : to_snapshot());
+ SnapshotWriterVisitor visitor(writer);
+ visitor.VisitPointers(from(), toobj);
} else {
- writer->Write<int32_t>(0);
+ writer->WriteFunctionId(this, owner_is_class);
}
- writer->Write<int16_t>(ptr()->num_fixed_parameters_);
- writer->Write<int16_t>(ptr()->num_optional_parameters_);
- writer->Write<int16_t>(ptr()->deoptimization_counter_);
- writer->Write<uint32_t>(ptr()->kind_tag_);
- writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
- writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
-
- // Write out all the object pointer fields.
- SnapshotWriterVisitor visitor(writer);
- visitor.VisitPointers(from(), writer->snapshot_code() ? to()
- : to_snapshot());
}
@@ -1679,8 +1708,7 @@ RawICData* ICData::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
Snapshot::Kind kind) {
- ASSERT(reader->snapshot_code());
- ASSERT(kind == Snapshot::kFull);
+ ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
ICData& result = ICData::ZoneHandle(reader->zone(), NEW_OBJECT(ICData));
reader->AddBackRef(object_id, &result, kIsDeserialized);
@@ -1700,8 +1728,7 @@ RawICData* ICData::ReadFrom(SnapshotReader* reader,
void RawICData::WriteTo(SnapshotWriter* writer,
intptr_t object_id,
Snapshot::Kind kind) {
- ASSERT(writer->snapshot_code());
- ASSERT(kind == Snapshot::kFull);
+ ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
// Write out the serialization header value for this object.
writer->WriteInlinedObjectHeader(object_id);
« no previous file with comments | « runtime/vm/raw_object.h ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698