Chromium Code Reviews| Index: vm/snapshot.cc |
| =================================================================== |
| --- vm/snapshot.cc (revision 15432) |
| +++ vm/snapshot.cc (working copy) |
| @@ -131,7 +131,7 @@ |
| RawSmi* BaseReader::ReadAsSmi() { |
| intptr_t value = ReadIntptrValue(); |
| - ASSERT((value & kSmiTagMask) == 0); |
| + ASSERT((value & kSmiTagMask) == kSmiTag); |
| return reinterpret_cast<RawSmi*>(value); |
| } |
| @@ -179,7 +179,7 @@ |
| ASSERT(kind_ != Snapshot::kFull); |
| // Read the class header information and lookup the class. |
| intptr_t class_header = ReadIntptrValue(); |
| - ASSERT((class_header & kSmiTagMask) != 0); |
| + ASSERT((class_header & kSmiTagMask) != kSmiTag); |
| Class& cls = Class::ZoneHandle(isolate(), Class::null()); |
| cls = LookupInternalClass(class_header); |
| AddBackRef(object_id, &cls, kIsDeserialized); |
| @@ -198,8 +198,8 @@ |
| RawObject* SnapshotReader::ReadObjectImpl() { |
| int64_t value = Read<int64_t>(); |
| - if ((value & kSmiTagMask) == 0) { |
| - return Integer::New((value >> kSmiTagShift), HEAP_SPACE(kind_)); |
| + if ((value & kSmiTagMask) == kSmiTag) { |
| + return NewInteger(value); |
| } |
| return ReadObjectImpl(value); |
| } |
| @@ -221,8 +221,8 @@ |
| RawObject* SnapshotReader::ReadObjectRef() { |
| int64_t header_value = Read<int64_t>(); |
| - if ((header_value & kSmiTagMask) == 0) { |
| - return Integer::New((header_value >> kSmiTagShift), HEAP_SPACE(kind_)); |
| + if ((header_value & kSmiTagMask) == kSmiTag) { |
| + return NewInteger(header_value); |
| } |
| ASSERT((header_value <= kIntptrMax) && (header_value >= kIntptrMin)); |
| if (IsVMIsolateObject(header_value)) { |
| @@ -255,7 +255,7 @@ |
| } |
| return result.raw(); |
| } |
| - ASSERT((class_header & kSmiTagMask) != 0); |
| + ASSERT((class_header & kSmiTagMask) != kSmiTag); |
| cls_ = LookupInternalClass(class_header); |
| ASSERT(!cls_.IsNull()); |
| @@ -574,6 +574,19 @@ |
| } |
| +RawObject* SnapshotReader::NewInteger(int64_t value) { |
| + ASSERT((value & kSmiTagMask) == kSmiTag); |
| + value = value >> kSmiTagShift; |
| + if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) { |
| + return Smi::New(value); |
| + } |
| + if (kind_ == Snapshot::kFull) { |
| + return NewMint(value); |
| + } |
| + return Mint::NewCanonical(value); |
| +} |
| + |
| + |
| RawClass* SnapshotReader::LookupInternalClass(intptr_t class_header) { |
| // If the header is an object Id, lookup singleton VM classes or classes |
| // stored in the object store. |
| @@ -704,7 +717,7 @@ |
| } |
| return result->raw(); |
| } |
| - ASSERT((class_header & kSmiTagMask) != 0); |
| + ASSERT((class_header & kSmiTagMask) != kSmiTag); |
| cls_ = LookupInternalClass(class_header); |
| ASSERT(!cls_.IsNull()); |
| switch (cls_.id()) { |
| @@ -1020,6 +1033,17 @@ |
| return true; |
| } |
| + if (rawobj->GetClassId() == kMintCid) { |
| + int64_t value = reinterpret_cast<RawMint*>(rawobj)->ptr()->value_; |
| + const intptr_t kBits = 62; |
|
srdjan
2012/11/29 00:49:22
Should this be kMintBits, defined at similar place
siva
2012/11/29 03:08:20
Strictly speaking this not kMintBits as you repres
|
| + const int64_t kMax = (static_cast<int64_t>(1) << kBits) - 1; |
| + const int64_t kMin = -(static_cast<int64_t>(1) << kBits); |
|
srdjan
2012/11/29 00:49:22
ditto for min and max (see class Smi).
|
| + if (value <= kMax && value >= kMin) { |
| + Write<int64_t>((value << kSmiTagShift) | kSmiTag); |
| + return true; |
| + } |
| + } |
| + |
| // Check if it is a code object in that case just write a Null object |
| // as we do not want code objects in the snapshot. |
| if (rawobj->GetClassId() == kCodeCid) { |
| @@ -1089,7 +1113,8 @@ |
| Isolate::Current()->long_jump_base()->Jump(1, *ErrorHandle()); |
| } |
| // Object is regular dart instance. |
| - intptr_t instance_size = cls->ptr()->instance_size_; |
| + intptr_t instance_size = |
| + cls->ptr()->instance_size_in_words_ << kWordSizeLog2; |
| ASSERT(instance_size != 0); |
| // Write out the serialization header value for this object. |