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

Unified Diff: runtime/vm/raw_object_snapshot.cc

Issue 12473002: Complete implementation of bounds checking in the vm, by introducing a vm object (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 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.cc ('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
===================================================================
--- runtime/vm/raw_object_snapshot.cc (revision 19513)
+++ runtime/vm/raw_object_snapshot.cc (working copy)
@@ -115,28 +115,13 @@
}
-static const char* RawOneByteStringToCString(RawOneByteString* str) {
- const char* start = reinterpret_cast<char*>(str) - kHeapObjectTag +
- OneByteString::data_offset();
- const int len = Smi::Value(*reinterpret_cast<RawSmi**>(
- reinterpret_cast<uword>(str) - kHeapObjectTag + String::length_offset()));
- char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
- memmove(chars, start, len);
- chars[len] = '\0';
- return chars;
-}
-
-
RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
Snapshot::Kind kind) {
ASSERT(reader != NULL);
- // Only resolved and finalized types should be written to a snapshot.
- // TODO(regis): Replace this code by an UNREACHABLE().
-
- // Allocate parameterized type object.
+ // Allocate unresolved class object.
UnresolvedClass& unresolved_class = UnresolvedClass::ZoneHandle(
reader->isolate(), NEW_OBJECT(UnresolvedClass));
reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
@@ -165,19 +150,6 @@
Snapshot::Kind kind) {
ASSERT(writer != NULL);
- // Only resolved and finalized types should be written to a snapshot.
- // TODO(regis): Replace this code by an UNREACHABLE().
- if (FLAG_error_on_malformed_type) {
- // Print the name of the unresolved class, as well as the token location
- // from where it is referred to, making sure not to allocate any handles.
- // Unfortunately, we cannot print the script name.
- OS::Print("Snapshotting unresolved class '%s' at token pos %"Pd"\n",
- RawOneByteStringToCString(
- reinterpret_cast<RawOneByteString*>(ptr()->ident_)),
- ptr()->token_pos_);
- UNREACHABLE();
- }
-
// Write out the serialization header value for this object.
writer->WriteInlinedObjectHeader(object_id);
@@ -245,13 +217,25 @@
}
+static const char* RawOneByteStringToCString(RawOneByteString* str) {
+ const char* start = reinterpret_cast<char*>(str) - kHeapObjectTag +
+ OneByteString::data_offset();
+ const int len = Smi::Value(*reinterpret_cast<RawSmi**>(
+ reinterpret_cast<uword>(str) - kHeapObjectTag + String::length_offset()));
+ char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
+ memmove(chars, start, len);
+ chars[len] = '\0';
+ return chars;
+}
+
+
void RawType::WriteTo(SnapshotWriter* writer,
intptr_t object_id,
Snapshot::Kind kind) {
ASSERT(writer != NULL);
// Only resolved and finalized types should be written to a snapshot.
- // TODO(regis): Replace the test below by an ASSERT().
+ // TODO(regis): Replace the test below by an ASSERT() or remove the flag test.
if (FLAG_error_on_malformed_type &&
(ptr()->type_state_ != RawType::kFinalizedInstantiated) &&
(ptr()->type_state_ != RawType::kFinalizedUninstantiated)) {
@@ -336,7 +320,7 @@
ASSERT(writer != NULL);
// Only finalized type parameters should be written to a snapshot.
- // TODO(regis): Replace the test below by an ASSERT().
+ // TODO(regis): Replace the test below by an ASSERT() or remove the flag test.
if (FLAG_error_on_malformed_type &&
(ptr()->type_state_ != RawTypeParameter::kFinalizedUninstantiated)) {
// Print the name of the unfinalized type parameter, the name of the class
@@ -373,6 +357,54 @@
}
+RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind) {
+ ASSERT(reader != NULL);
+
+ // Allocate bounded type object.
+ BoundedType& bounded_type = BoundedType::ZoneHandle(
+ reader->isolate(), NEW_OBJECT(BoundedType));
+ reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
+
+ // Set the object tags.
+ bounded_type.set_tags(tags);
+
+ // Set all the object fields.
+ // TODO(5411462): Need to assert No GC can happen here, even though
+ // allocations may happen.
+ intptr_t num_flds = (bounded_type.raw()->to() -
+ bounded_type.raw()->from());
+ for (intptr_t i = 0; i <= num_flds; i++) {
+ bounded_type.StorePointer((bounded_type.raw()->from() + i),
+ reader->ReadObjectRef());
+ }
+
+ bounded_type.set_is_being_checked(false);
+
+ return bounded_type.raw();
+}
+
+
+void RawBoundedType::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind) {
+ ASSERT(writer != NULL);
+
+ // Write out the serialization header value for this object.
+ writer->WriteInlinedObjectHeader(object_id);
+
+ // Write out the class and tags information.
+ writer->WriteIndexedObject(kBoundedTypeCid);
+ writer->WriteIntptrValue(writer->GetObjectTags(this));
+
+ // Write out all the object pointer fields.
+ SnapshotWriterVisitor visitor(writer);
+ visitor.VisitPointers(from(), to());
+}
+
+
RawAbstractTypeArguments* AbstractTypeArguments::ReadFrom(
SnapshotReader* reader,
intptr_t object_id,
« no previous file with comments | « runtime/vm/raw_object.cc ('k') | runtime/vm/snapshot.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698