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 {
class SerializerReference {
public:
explicit SerializerReference(uint32_t bitfield) : bitfield_(bitfield) {}
SerializerReference() : bitfield_(Special(kInvalidValue)) {}
static SerializerReference FromBitfield(uint32_t bitfield) {
return SerializerReference(bitfield);
}
static SerializerReference BackReference(AllocationSpace space,
uint32_t chunk_index,
uint32_t chunk_offset) {
......@@ -129,13 +132,15 @@ class SerializerReference {
}
private:
explicit SerializerReference(uint32_t bitfield) : bitfield_(bitfield) {}
inline static uint32_t Special(int value) {
return SpaceBits::encode(kSpecialValueSpace) |
ValueIndexBits::encode(value);
}
// 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:
// [ Space index ] [ Chunk index ] [ Chunk offset ]
// [ LO_SPACE ] [ large object index ]
......@@ -160,6 +165,7 @@ class SerializerReference {
class ChunkIndexBits
: public BitField<uint32_t, ChunkOffsetBits::kNext, kChunkIndexSize> {};
class ValueIndexBits : public BitField<uint32_t, 0, kValueIndexSize> {};
STATIC_ASSERT(ChunkIndexBits::kNext == ValueIndexBits::kNext);
class SpaceBits : public BitField<int, kValueIndexSize, kSpaceTagSize> {};
STATIC_ASSERT(SpaceBits::kNext == 32);
......@@ -174,20 +180,18 @@ class SerializerReferenceMap : public AddressMapBase {
public:
SerializerReferenceMap()
: no_allocation_(),
map_(new HashMap(HashMap::PointersMatch)),
map_(HashMap::PointersMatch),
attached_reference_index_(0) {}
~SerializerReferenceMap() { delete map_; }
SerializerReference Lookup(HeapObject* obj) {
HashMap::Entry* entry = LookupEntry(map_, obj, false);
HashMap::Entry* entry = LookupEntry(&map_, obj, false);
return entry ? SerializerReference(GetValue(entry)) : SerializerReference();
}
void Add(HeapObject* obj, SerializerReference b) {
DCHECK(b.is_valid());
DCHECK_NULL(LookupEntry(map_, obj, false));
HashMap::Entry* entry = LookupEntry(map_, obj, true);
DCHECK_NULL(LookupEntry(&map_, obj, false));
HashMap::Entry* entry = LookupEntry(&map_, obj, true);
SetValue(entry, b.bitfield_);
}
......@@ -200,7 +204,7 @@ class SerializerReferenceMap : public AddressMapBase {
private:
DisallowHeapAllocation no_allocation_;
HashMap* map_;
HashMap map_;
int attached_reference_index_;
DISALLOW_COPY_AND_ASSIGN(SerializerReferenceMap);
};
......
......@@ -312,7 +312,8 @@ void Deserializer::CommitPostProcessedObjects(Isolate* isolate) {
HeapObject* Deserializer::GetBackReferencedObject(int space) {
HeapObject* obj;
SerializerReference back_reference(source_.GetInt());
SerializerReference back_reference =
SerializerReference::FromBitfield(source_.GetInt());
if (space == LO_SPACE) {
CHECK(back_reference.chunk_index() == 0);
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