Index: vm/datastream.h |
=================================================================== |
--- vm/datastream.h (revision 9536) |
+++ vm/datastream.h (working copy) |
@@ -18,6 +18,7 @@ |
static const int8_t kMinDataPerByte = -(1 << (kDataBitsPerByte - 1)); |
static const int8_t kMaxDataPerByte = (~kMinDataPerByte & kByteMask); |
static const uint8_t kEndByteMarker = (255 - kMaxDataPerByte); |
+static const uint8_t kEndUnsignedByteMarker = (255 - kMaxUnsignedDataPerByte); |
typedef uint8_t* (*ReAlloc)(uint8_t* ptr, intptr_t old_size, intptr_t new_size); |
@@ -63,18 +64,28 @@ |
} |
}; |
+ // Reads 'len' bytes from the stream. |
void ReadBytes(uint8_t* addr, intptr_t len) { |
ASSERT((end_ - current_) >= len); |
memmove(addr, current_, len); |
current_ += len; |
} |
+ intptr_t ReadUnsigned() { |
+ return Read<intptr_t>(kEndUnsignedByteMarker); |
+ } |
+ |
private: |
template<typename T> |
T Read() { |
+ return Read<T>(kEndByteMarker); |
+ } |
+ |
+ template<typename T> |
+ T Read(uint8_t end_byte_marker) { |
uint8_t b = ReadByte(); |
if (b > kMaxUnsignedDataPerByte) { |
- return static_cast<T>(b) - kEndByteMarker; |
+ return static_cast<T>(b) - end_byte_marker; |
} |
T r = 0; |
uint8_t s = 0; |
@@ -83,7 +94,7 @@ |
s += kDataBitsPerByte; |
b = ReadByte(); |
} while (b <= kMaxUnsignedDataPerByte); |
- return r | ((static_cast<T>(b) - kEndByteMarker) << s); |
+ return r | ((static_cast<T>(b) - end_byte_marker) << s); |
} |
uint8_t ReadByte() { |
@@ -162,6 +173,15 @@ |
} |
}; |
+ void WriteUnsigned(intptr_t value) { |
+ ASSERT((value >= 0) && (value <= kIntptrMax)); |
+ while (value > kMaxUnsignedDataPerByte) { |
+ WriteByte(static_cast<uint8_t>(value & kByteMask)); |
+ value = value >> kDataBitsPerByte; |
+ } |
+ WriteByte(static_cast<uint8_t>(value + kEndUnsignedByteMarker)); |
+ } |
+ |
void WriteBytes(const uint8_t* addr, intptr_t len) { |
if ((end_ - current_) < len) { |
Resize(len); |