Bug 969436 - Changed the SafepointReader constructor to properly read safepoints, depending on the size of PackedRegisterMask; r=Nicolas B. Pierron

This commit is contained in:
Ben Hackett 2014-03-24 18:09:00 +01:00
parent d70ccf0d7c
commit c11d131f6b

View File

@ -43,12 +43,20 @@ SafepointWriter::writeOsiCallPointOffset(uint32_t osiCallPointOffset)
static void static void
WriteRegisterMask(CompactBufferWriter &stream, uint32_t bits) WriteRegisterMask(CompactBufferWriter &stream, uint32_t bits)
{ {
if (sizeof(PackedRegisterMask) == 8) if (sizeof(PackedRegisterMask) == 1)
stream.writeByte(bits); stream.writeByte(bits);
else else
stream.writeUnsigned(bits); stream.writeUnsigned(bits);
} }
static int32_t
ReadRegisterMask(CompactBufferReader &stream)
{
if (sizeof(PackedRegisterMask) == 1)
return stream.readByte();
return stream.readUnsigned();
}
void void
SafepointWriter::writeGcRegs(LSafepoint *safepoint) SafepointWriter::writeGcRegs(LSafepoint *safepoint)
{ {
@ -342,20 +350,20 @@ SafepointReader::SafepointReader(IonScript *script, const SafepointIndex *si)
osiCallPointOffset_ = stream_.readUnsigned(); osiCallPointOffset_ = stream_.readUnsigned();
// gcSpills is a subset of allGprSpills. // gcSpills is a subset of allGprSpills.
allGprSpills_ = GeneralRegisterSet(stream_.readUnsigned()); allGprSpills_ = GeneralRegisterSet(ReadRegisterMask(stream_));
if (allGprSpills_.empty()) { if (allGprSpills_.empty()) {
gcSpills_ = allGprSpills_; gcSpills_ = allGprSpills_;
valueSpills_ = allGprSpills_; valueSpills_ = allGprSpills_;
slotsOrElementsSpills_ = allGprSpills_; slotsOrElementsSpills_ = allGprSpills_;
} else { } else {
gcSpills_ = GeneralRegisterSet(stream_.readUnsigned()); gcSpills_ = GeneralRegisterSet(ReadRegisterMask(stream_));
slotsOrElementsSpills_ = GeneralRegisterSet(stream_.readUnsigned()); slotsOrElementsSpills_ = GeneralRegisterSet(ReadRegisterMask(stream_));
#ifdef JS_PUNBOX64 #ifdef JS_PUNBOX64
valueSpills_ = GeneralRegisterSet(stream_.readUnsigned()); valueSpills_ = GeneralRegisterSet(stream_.ReadRegisterMask(stream_));
#endif #endif
} }
allFloatSpills_ = FloatRegisterSet(stream_.readUnsigned()); allFloatSpills_ = FloatRegisterSet(ReadRegisterMask(stream_));
advanceFromGcRegs(); advanceFromGcRegs();
} }