| Index: src/serialize.h
|
| diff --git a/src/serialize.h b/src/serialize.h
|
| index 74c5e6d4588c9b473b317ade82b49ee0c9860601..1614ecd45459099ad78de707895cacd0492b75b4 100644
|
| --- a/src/serialize.h
|
| +++ b/src/serialize.h
|
| @@ -303,121 +303,116 @@ class SerializerDeserializer: public ObjectVisitor {
|
| static const int kNumberOfSpaces = LAST_SPACE + 1;
|
|
|
| protected:
|
| + // ---------- byte code range 0x00..0x7f ----------
|
| + // Byte codes in this range represent Where, HowToCode and WhereToPoint.
|
| // Where the pointed-to object can be found:
|
| enum Where {
|
| - kNewObject = 0, // Object is next in snapshot.
|
| - // 1-6 One per space.
|
| - // 0x7, 0x8 Unused.
|
| - kRootArray = 0x9, // Object is found in root array.
|
| - kPartialSnapshotCache = 0xa, // Object is in the cache.
|
| - kExternalReference = 0xb, // Pointer to an external reference.
|
| - kSkip = 0xc, // Skip n bytes.
|
| - kBuiltin = 0xd, // Builtin code object.
|
| - kAttachedReference = 0xe, // Object is described in an attached list.
|
| - // 0xf Used by misc. See below.
|
| - kBackref = 0x10, // Object is described relative to end.
|
| - // 0x11-0x16 One per space.
|
| - // 0x17 Unused.
|
| - kBackrefWithSkip = 0x18, // Object is described relative to end.
|
| - // 0x19-0x1e One per space.
|
| - // 0x1f Unused.
|
| - // 0x20-0x3f Used by misc. See below.
|
| - kPointedToMask = 0x3f
|
| + // 0x00..0x05 Allocate new object, in specified space.
|
| + kNewObject = 0,
|
| + // 0x06 Unused (including 0x26, 0x46, 0x66).
|
| + // 0x07 Unused (including 0x27, 0x47, 0x67).
|
| + // 0x08..0x0d Reference to previous object from space.
|
| + kBackref = 0x08,
|
| + // 0x0e Unused (including 0x2e, 0x4e, 0x6e).
|
| + // 0x0f Unused (including 0x2f, 0x4f, 0x6f).
|
| + // 0x10..0x15 Reference to previous object from space after skip.
|
| + kBackrefWithSkip = 0x10,
|
| + // 0x16 Unused (including 0x36, 0x56, 0x76).
|
| + // 0x17 Unused (including 0x37, 0x57, 0x77).
|
| + // 0x18 Root array item.
|
| + kRootArray = 0x18,
|
| + // 0x19 Object in the partial snapshot cache.
|
| + kPartialSnapshotCache = 0x19,
|
| + // 0x1a External reference referenced by id.
|
| + kExternalReference = 0x1a,
|
| + // 0x1b Object provided in the attached list.
|
| + kAttachedReference = 0x1b,
|
| + // 0x1c Builtin code referenced by index.
|
| + kBuiltin = 0x1c
|
| + // 0x1d..0x1e Misc (including 0x3d..0x3f, 0x5d..0x5f, 0x7d..0x7f)
|
| + // 0x1f Unused (including 0x3f, 0x5f, 0x7f).
|
| };
|
|
|
| + static const int kWhereMask = 0x1f;
|
| + static const int kSpaceMask = 7;
|
| + STATIC_ASSERT(kNumberOfSpaces <= kSpaceMask + 1);
|
| +
|
| // How to code the pointer to the object.
|
| enum HowToCode {
|
| - kPlain = 0, // Straight pointer.
|
| - // What this means depends on the architecture:
|
| - kFromCode = 0x40, // A pointer inlined in code.
|
| - kHowToCodeMask = 0x40
|
| + // Straight pointer.
|
| + kPlain = 0,
|
| + // A pointer inlined in code. What this means depends on the architecture.
|
| + kFromCode = 0x20
|
| };
|
|
|
| - // For kRootArrayConstants
|
| - enum WithSkip {
|
| - kNoSkipDistance = 0,
|
| - kHasSkipDistance = 0x40,
|
| - kWithSkipMask = 0x40
|
| - };
|
| + static const int kHowToCodeMask = 0x20;
|
|
|
| // Where to point within the object.
|
| enum WhereToPoint {
|
| + // Points to start of object
|
| kStartOfObject = 0,
|
| - kInnerPointer = 0x80, // First insn in code object or payload of cell.
|
| - kWhereToPointMask = 0x80
|
| + // Points to instruction in code object or payload of cell.
|
| + kInnerPointer = 0x40
|
| };
|
|
|
| - // Misc.
|
| -
|
| - // 0x48, 0x88 and 0xc8 are unused.
|
| -
|
| - // Raw data to be copied from the snapshot. This byte code does not advance
|
| - // the current pointer, which is used for code objects, where we write the
|
| - // entire code in one memcpy, then fix up stuff with kSkip and other byte
|
| - // codes that overwrite data.
|
| - static const int kRawData = 0x20;
|
| - // Some common raw lengths: 0x21-0x3f.
|
| - // These autoadvance the current pointer.
|
| - static const int kOnePointerRawData = 0x21;
|
| + static const int kWhereToPointMask = 0x40;
|
|
|
| + // ---------- Misc ----------
|
| + // Skip.
|
| + static const int kSkip = 0x1d;
|
| // Internal reference encoded as offsets of pc and target from code entry.
|
| - static const int kInternalReference = 0x08;
|
| -
|
| - static const int kVariableRepeat = 0x60;
|
| - // 0x61-0x6f Repeat last word
|
| - static const int kFixedRepeat = 0x61;
|
| - static const int kFixedRepeatBase = kFixedRepeat - 1;
|
| - static const int kLastFixedRepeat = 0x6f;
|
| - static const int kMaxFixedRepeats = kLastFixedRepeat - kFixedRepeatBase;
|
| - static int CodeForRepeats(int repeats) {
|
| - DCHECK(repeats >= 1 && repeats <= kMaxFixedRepeats);
|
| - return kFixedRepeatBase + repeats;
|
| - }
|
| - static int RepeatsForCode(int byte_code) {
|
| - DCHECK(byte_code > kFixedRepeatBase && byte_code <= kLastFixedRepeat);
|
| - return byte_code - kFixedRepeatBase;
|
| - }
|
| -
|
| - // Hot objects are a small set of recently seen or back-referenced objects.
|
| - // They are represented by a single opcode to save space.
|
| - // We use 0x70..0x77 for 8 hot objects, and 0x78..0x7f to add skip.
|
| - static const int kHotObject = 0x70;
|
| - static const int kMaxHotObjectIndex = 0x77 - kHotObject;
|
| - static const int kHotObjectWithSkip = 0x78;
|
| - STATIC_ASSERT(HotObjectsList::kSize == kMaxHotObjectIndex + 1);
|
| - STATIC_ASSERT(0x7f - kHotObjectWithSkip == kMaxHotObjectIndex);
|
| - static const int kHotObjectIndexMask = 0x7;
|
| -
|
| - static const int kRootArrayConstants = 0xa0;
|
| - // 0xa0-0xbf Things from the first 32 elements of the root array.
|
| - static const int kRootArrayNumberOfConstantEncodings = 0x20;
|
| - static int RootArrayConstantFromByteCode(int byte_code) {
|
| - return byte_code & 0x1f;
|
| - }
|
| -
|
| + static const int kInternalReference = 0x1e;
|
| // Do nothing, used for padding.
|
| - static const int kNop = 0xf;
|
| -
|
| + static const int kNop = 0x3d;
|
| // Move to next reserved chunk.
|
| - static const int kNextChunk = 0x4f;
|
| -
|
| + static const int kNextChunk = 0x3e;
|
| // A tag emitted at strategic points in the snapshot to delineate sections.
|
| // If the deserializer does not find these at the expected moments then it
|
| // is an indication that the snapshot and the VM do not fit together.
|
| // Examine the build process for architecture, version or configuration
|
| // mismatches.
|
| - static const int kSynchronize = 0x8f;
|
| -
|
| + static const int kSynchronize = 0x5d;
|
| // Used for the source code of the natives, which is in the executable, but
|
| // is referred to from external strings in the snapshot.
|
| - static const int kNativesStringResource = 0xcf;
|
| -
|
| + static const int kNativesStringResource = 0x5e;
|
| + // Raw data of variable length.
|
| + static const int kVariableRawData = 0x7d;
|
| + // Repeats of variable length.
|
| + static const int kVariableRepeat = 0x7e;
|
| +
|
| + // ---------- byte code range 0x80..0xff ----------
|
| + // First 32 root array items.
|
| + static const int kNumberOfRootArrayConstants = 0x20;
|
| + // 0x80..0x9f
|
| + static const int kRootArrayConstants = 0x80;
|
| + // 0xa0..0xbf
|
| + static const int kRootArrayConstantsWithSkip = 0xa0;
|
| + static const int kRootArrayConstantsMask = 0x1f;
|
| +
|
| + // 8 hot (recently seen or back-referenced) objects with optional skip.
|
| + static const int kNumberOfHotObjects = 0x08;
|
| + // 0xc0..0xc7
|
| + static const int kHotObject = 0xc0;
|
| + // 0xc8..0xcf
|
| + static const int kHotObjectWithSkip = 0xc8;
|
| + static const int kHotObjectMask = 0x07;
|
| +
|
| + // 32 common raw data lengths.
|
| + static const int kNumberOfFixedRawData = 0x20;
|
| + // 0xd0..0xef
|
| + static const int kFixedRawData = 0xd0;
|
| + static const int kOnePointerRawData = kFixedRawData;
|
| + static const int kFixedRawDataStart = kFixedRawData - 1;
|
| +
|
| + // 16 repeats lengths.
|
| + static const int kNumberOfFixedRepeat = 0x10;
|
| + // 0xf0..0xff
|
| + static const int kFixedRepeat = 0xf0;
|
| + static const int kFixedRepeatStart = kFixedRepeat - 1;
|
| +
|
| + // ---------- special values ----------
|
| static const int kAnyOldSpace = -1;
|
|
|
| - // A bitmask for getting the space out of an instruction.
|
| - static const int kSpaceMask = 7;
|
| - STATIC_ASSERT(kNumberOfSpaces <= kSpaceMask + 1);
|
| -
|
| // Sentinel after a new object to indicate that double alignment is needed.
|
| static const int kDoubleAlignmentSentinel = 0;
|
|
|
| @@ -427,6 +422,7 @@ class SerializerDeserializer: public ObjectVisitor {
|
| // Used as index for the attached reference representing the global proxy.
|
| static const int kGlobalProxyReference = 0;
|
|
|
| + // ---------- member variable ----------
|
| HotObjectsList hot_objects_;
|
| };
|
|
|
|
|