Commit 2b60b358 authored by yangguo's avatar yangguo Committed by Commit bot

[serializer] cosmetic changes to SerializerReference.

R=vogelheim@chromium.org

Review-Url: https://codereview.chromium.org/1991793002
Cr-Commit-Position: refs/heads/master@{#36327}
parent b498f0c9
...@@ -60,9 +60,12 @@ class RootIndexMap : public AddressMapBase { ...@@ -60,9 +60,12 @@ class RootIndexMap : public AddressMapBase {
class SerializerReference { class SerializerReference {
public: public:
explicit SerializerReference(uint32_t bitfield) : bitfield_(bitfield) {}
SerializerReference() : bitfield_(Special(kInvalidValue)) {} SerializerReference() : bitfield_(Special(kInvalidValue)) {}
static SerializerReference FromBitfield(uint32_t bitfield) {
return SerializerReference(bitfield);
}
static SerializerReference BackReference(AllocationSpace space, static SerializerReference BackReference(AllocationSpace space,
uint32_t chunk_index, uint32_t chunk_index,
uint32_t chunk_offset) { uint32_t chunk_offset) {
...@@ -129,13 +132,15 @@ class SerializerReference { ...@@ -129,13 +132,15 @@ class SerializerReference {
} }
private: private:
explicit SerializerReference(uint32_t bitfield) : bitfield_(bitfield) {}
inline static uint32_t Special(int value) { inline static uint32_t Special(int value) {
return SpaceBits::encode(kSpecialValueSpace) | return SpaceBits::encode(kSpecialValueSpace) |
ValueIndexBits::encode(value); ValueIndexBits::encode(value);
} }
// We use the 32-bit bitfield to encode either a back reference, a special // We use the 32-bit bitfield to encode either a back reference, a special
// value, or a attached reference index. // value, or an attached reference index.
// Back reference: // Back reference:
// [ Space index ] [ Chunk index ] [ Chunk offset ] // [ Space index ] [ Chunk index ] [ Chunk offset ]
// [ LO_SPACE ] [ large object index ] // [ LO_SPACE ] [ large object index ]
...@@ -160,6 +165,7 @@ class SerializerReference { ...@@ -160,6 +165,7 @@ class SerializerReference {
class ChunkIndexBits class ChunkIndexBits
: public BitField<uint32_t, ChunkOffsetBits::kNext, kChunkIndexSize> {}; : public BitField<uint32_t, ChunkOffsetBits::kNext, kChunkIndexSize> {};
class ValueIndexBits : public BitField<uint32_t, 0, kValueIndexSize> {}; class ValueIndexBits : public BitField<uint32_t, 0, kValueIndexSize> {};
STATIC_ASSERT(ChunkIndexBits::kNext == ValueIndexBits::kNext);
class SpaceBits : public BitField<int, kValueIndexSize, kSpaceTagSize> {}; class SpaceBits : public BitField<int, kValueIndexSize, kSpaceTagSize> {};
STATIC_ASSERT(SpaceBits::kNext == 32); STATIC_ASSERT(SpaceBits::kNext == 32);
...@@ -174,20 +180,18 @@ class SerializerReferenceMap : public AddressMapBase { ...@@ -174,20 +180,18 @@ class SerializerReferenceMap : public AddressMapBase {
public: public:
SerializerReferenceMap() SerializerReferenceMap()
: no_allocation_(), : no_allocation_(),
map_(new HashMap(HashMap::PointersMatch)), map_(HashMap::PointersMatch),
attached_reference_index_(0) {} attached_reference_index_(0) {}
~SerializerReferenceMap() { delete map_; }
SerializerReference Lookup(HeapObject* obj) { SerializerReference Lookup(HeapObject* obj) {
HashMap::Entry* entry = LookupEntry(map_, obj, false); HashMap::Entry* entry = LookupEntry(&map_, obj, false);
return entry ? SerializerReference(GetValue(entry)) : SerializerReference(); return entry ? SerializerReference(GetValue(entry)) : SerializerReference();
} }
void Add(HeapObject* obj, SerializerReference b) { void Add(HeapObject* obj, SerializerReference b) {
DCHECK(b.is_valid()); DCHECK(b.is_valid());
DCHECK_NULL(LookupEntry(map_, obj, false)); DCHECK_NULL(LookupEntry(&map_, obj, false));
HashMap::Entry* entry = LookupEntry(map_, obj, true); HashMap::Entry* entry = LookupEntry(&map_, obj, true);
SetValue(entry, b.bitfield_); SetValue(entry, b.bitfield_);
} }
...@@ -200,7 +204,7 @@ class SerializerReferenceMap : public AddressMapBase { ...@@ -200,7 +204,7 @@ class SerializerReferenceMap : public AddressMapBase {
private: private:
DisallowHeapAllocation no_allocation_; DisallowHeapAllocation no_allocation_;
HashMap* map_; HashMap map_;
int attached_reference_index_; int attached_reference_index_;
DISALLOW_COPY_AND_ASSIGN(SerializerReferenceMap); DISALLOW_COPY_AND_ASSIGN(SerializerReferenceMap);
}; };
......
...@@ -312,7 +312,8 @@ void Deserializer::CommitPostProcessedObjects(Isolate* isolate) { ...@@ -312,7 +312,8 @@ void Deserializer::CommitPostProcessedObjects(Isolate* isolate) {
HeapObject* Deserializer::GetBackReferencedObject(int space) { HeapObject* Deserializer::GetBackReferencedObject(int space) {
HeapObject* obj; HeapObject* obj;
SerializerReference back_reference(source_.GetInt()); SerializerReference back_reference =
SerializerReference::FromBitfield(source_.GetInt());
if (space == LO_SPACE) { if (space == LO_SPACE) {
CHECK(back_reference.chunk_index() == 0); CHECK(back_reference.chunk_index() == 0);
uint32_t index = back_reference.large_object_index(); uint32_t index = back_reference.large_object_index();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment