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

Unified Diff: src/serialize.h

Issue 982773003: Serializer: simplify external reference encoding. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 5 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 | « src/disassembler.cc ('k') | src/serialize.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/serialize.h
diff --git a/src/serialize.h b/src/serialize.h
index 06ed9fc4f257a7e8ee3892d6e5b1ced110935b06..ca748a7e339aa2fd8f8d916e589e1ac8d72e4b9f 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -15,30 +15,7 @@ namespace internal {
class ScriptData;
-// A TypeCode is used to distinguish different kinds of external reference.
-// It is a single bit to make testing for types easy.
-enum TypeCode {
- UNCLASSIFIED, // One-of-a-kind references.
- C_BUILTIN,
- BUILTIN,
- RUNTIME_FUNCTION,
- IC_UTILITY,
- STATS_COUNTER,
- TOP_ADDRESS,
- ACCESSOR_CODE,
- STUB_CACHE_TABLE,
- RUNTIME_ENTRY,
- LAZY_DEOPTIMIZATION
-};
-
-const int kTypeCodeCount = LAZY_DEOPTIMIZATION + 1;
-const int kFirstTypeCode = UNCLASSIFIED;
-
-const int kReferenceIdBits = 16;
-const int kReferenceIdMask = (1 << kReferenceIdBits) - 1;
-const int kReferenceTypeShift = kReferenceIdBits;
-
-const int kDeoptTableSerializeEntryCount = 64;
+static const int kDeoptTableSerializeEntryCount = 64;
// ExternalReferenceTable is a helper class that defines the relationship
// between external references and their encodings. It is used to build
@@ -47,46 +24,28 @@ class ExternalReferenceTable {
public:
static ExternalReferenceTable* instance(Isolate* isolate);
- ~ExternalReferenceTable() { }
-
int size() const { return refs_.length(); }
-
Address address(int i) { return refs_[i].address; }
-
- uint32_t code(int i) { return refs_[i].code; }
-
const char* name(int i) { return refs_[i].name; }
- int max_id(int code) { return max_id_[code]; }
+ inline static Address NotAvailable() { return NULL; }
private:
- explicit ExternalReferenceTable(Isolate* isolate) : refs_(64) {
- PopulateTable(isolate);
- }
-
struct ExternalReferenceEntry {
Address address;
- uint32_t code;
const char* name;
};
- void PopulateTable(Isolate* isolate);
-
- // For a few types of references, we can get their address from their id.
- void AddFromId(TypeCode type,
- uint16_t id,
- const char* name,
- Isolate* isolate);
-
- // For other types of references, the caller will figure out the address.
- void Add(Address address, TypeCode type, uint16_t id, const char* name);
+ explicit ExternalReferenceTable(Isolate* isolate);
void Add(Address address, const char* name) {
- Add(address, UNCLASSIFIED, ++max_id_[UNCLASSIFIED], name);
+ ExternalReferenceEntry entry = {address, name};
+ refs_.Add(entry);
}
List<ExternalReferenceEntry> refs_;
- uint16_t max_id_[kTypeCodeCount];
+
+ DISALLOW_COPY_AND_ASSIGN(ExternalReferenceTable);
};
@@ -96,47 +55,17 @@ class ExternalReferenceEncoder {
uint32_t Encode(Address key) const;
- const char* NameOfAddress(Address key) const;
+ const char* NameOfAddress(Isolate* isolate, Address address) const;
private:
- HashMap encodings_;
static uint32_t Hash(Address key) {
- return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key) >> 2);
+ return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key) >>
+ kPointerSizeLog2);
}
- int IndexOf(Address key) const;
-
- void Put(Address key, int index);
-
- Isolate* isolate_;
-};
-
-
-class ExternalReferenceDecoder {
- public:
- explicit ExternalReferenceDecoder(Isolate* isolate);
- ~ExternalReferenceDecoder();
-
- Address Decode(uint32_t key) const {
- if (key == 0) return NULL;
- return *Lookup(key);
- }
-
- private:
- Address** encodings_;
-
- Address* Lookup(uint32_t key) const {
- int type = key >> kReferenceTypeShift;
- DCHECK(kFirstTypeCode <= type && type < kTypeCodeCount);
- int id = key & kReferenceIdMask;
- return &encodings_[type][id];
- }
-
- void Put(uint32_t key, Address value) {
- *Lookup(key) = value;
- }
+ HashMap map_;
- Isolate* isolate_;
+ DISALLOW_COPY_AND_ASSIGN(ExternalReferenceEncoder);
};
@@ -170,17 +99,16 @@ class RootIndexMap : public AddressMapBase {
public:
explicit RootIndexMap(Isolate* isolate);
- ~RootIndexMap() { delete map_; }
-
static const int kInvalidRootIndex = -1;
+
int Lookup(HeapObject* obj) {
- HashMap::Entry* entry = LookupEntry(map_, obj, false);
+ HashMap::Entry* entry = LookupEntry(&map_, obj, false);
if (entry) return GetValue(entry);
return kInvalidRootIndex;
}
private:
- HashMap* map_;
+ HashMap map_;
DISALLOW_COPY_AND_ASSIGN(RootIndexMap);
};
@@ -519,9 +447,16 @@ class SerializedData {
if (owns_data_) DeleteArray<byte>(data_);
}
+ uint32_t GetMagicNumber() const { return GetHeaderValue(kMagicNumberOffset); }
+
class ChunkSizeBits : public BitField<uint32_t, 0, 31> {};
class IsLastChunkBits : public BitField<bool, 31, 1> {};
+ static uint32_t ComputeMagicNumber(ExternalReferenceTable* table) {
+ uint32_t external_refs = table->size();
+ return 0xC0DE0000 ^ external_refs;
+ }
+
protected:
void SetHeaderValue(int offset, uint32_t value) {
uint32_t* address = reinterpret_cast<uint32_t*>(data_ + offset);
@@ -536,6 +471,16 @@ class SerializedData {
void AllocateData(int size);
+ static uint32_t ComputeMagicNumber(Isolate* isolate) {
+ return ComputeMagicNumber(ExternalReferenceTable::instance(isolate));
+ }
+
+ void SetMagicNumber(Isolate* isolate) {
+ SetHeaderValue(kMagicNumberOffset, ComputeMagicNumber(isolate));
+ }
+
+ static const int kMagicNumberOffset = 0;
+
byte* data_;
int size_;
bool owns_data_;
@@ -550,7 +495,8 @@ class Deserializer: public SerializerDeserializer {
explicit Deserializer(Data* data)
: isolate_(NULL),
source_(data->Payload()),
- external_reference_decoder_(NULL),
+ magic_number_(data->GetMagicNumber()),
+ external_reference_table_(NULL),
deserialized_large_objects_(0),
deserializing_user_code_(false) {
DecodeReservation(data->Reservations());
@@ -624,6 +570,8 @@ class Deserializer: public SerializerDeserializer {
Vector<Handle<Object> > attached_objects_;
SnapshotByteSource source_;
+ uint32_t magic_number_;
+
// The address of the next object that will be allocated in each space.
// Each space has a number of chunks reserved by the GC, with each chunk
// fitting into a page. Deserialized objects are allocated into the
@@ -632,7 +580,7 @@ class Deserializer: public SerializerDeserializer {
uint32_t current_chunk_[kNumberOfPreallocatedSpaces];
Address high_water_[kNumberOfPreallocatedSpaces];
- ExternalReferenceDecoder* external_reference_decoder_;
+ ExternalReferenceTable* external_reference_table_;
List<HeapObject*> deserialized_large_objects_;
@@ -945,13 +893,15 @@ class SnapshotData : public SerializedData {
private:
bool IsSane();
+
// The data header consists of uint32_t-sized entries:
- // [0] version hash
- // [1] number of reservation size entries
- // [2] payload length
+ // [0] magic number and external reference count
+ // [1] version hash
+ // [2] number of reservation size entries
+ // [3] payload length
// ... reservations
// ... serialized payload
- static const int kCheckSumOffset = 0;
+ static const int kCheckSumOffset = kMagicNumberOffset + kInt32Size;
static const int kNumReservationsOffset = kCheckSumOffset + kInt32Size;
static const int kPayloadLengthOffset = kNumReservationsOffset + kInt32Size;
static const int kHeaderSize = kPayloadLengthOffset + kInt32Size;
@@ -962,7 +912,8 @@ class SnapshotData : public SerializedData {
class SerializedCodeData : public SerializedData {
public:
// Used when consuming.
- static SerializedCodeData* FromCachedData(ScriptData* cached_data,
+ static SerializedCodeData* FromCachedData(Isolate* isolate,
+ ScriptData* cached_data,
String* source);
// Used when producing.
@@ -990,14 +941,12 @@ class SerializedCodeData : public SerializedData {
CHECKSUM_MISMATCH = 6
};
- SanityCheckResult SanityCheck(String* source) const;
+ SanityCheckResult SanityCheck(Isolate* isolate, String* source) const;
uint32_t SourceHash(String* source) const { return source->length(); }
- static const uint32_t kMagicNumber = 0xC0D1F1ED;
-
// The data header consists of uint32_t-sized entries:
- // [ 0] magic number
+ // [ 0] magic number and external reference count
// [ 1] version hash
// [ 2] source hash
// [ 3] cpu features
@@ -1011,7 +960,6 @@ class SerializedCodeData : public SerializedData {
// ... reservations
// ... code stub keys
// ... serialized payload
- static const int kMagicNumberOffset = 0;
static const int kVersionHashOffset = kMagicNumberOffset + kInt32Size;
static const int kSourceHashOffset = kVersionHashOffset + kInt32Size;
static const int kCpuFeaturesOffset = kSourceHashOffset + kInt32Size;
« no previous file with comments | « src/disassembler.cc ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698