Fix bug in double-far creation and add StructListUpgradeDoubleFar test.

This commit is contained in:
David Renshaw 2017-02-27 18:42:38 -05:00
parent 1fa0e7a806
commit 14237610fb
2 changed files with 48 additions and 2 deletions

View file

@ -180,6 +180,51 @@ class EncodingSuite extends FunSuite {
}
}
test("StructListUpgradeDoubleFar") {
val bytes = Array[Byte](
1,0,0,0,0x1f,0,0,0, // list, inline composite, 3 words
4, 0, 0, 0, 1, 0, 2, 0, // struct tag. 1 element, 1 word data, 2 pointers.
91,0,0,0,0,0,0,0, // data: 91
0x05,0,0,0, 0x42,0,0,0, // list pointer, offset 1, type = BYTE, length 8.
0,0,0,0,0,0,0,0, // null pointer
0x68,0x65,0x6c,0x6c,0x6f,0x21,0x21,0) // "hello!!"
val segment = java.nio.ByteBuffer.wrap(bytes)
segment.order(java.nio.ByteOrder.LITTLE_ENDIAN)
val messageReader = new MessageReader(Array(segment), ReaderOptions.DEFAULT_READER_OPTIONS)
val oldFactory = new StructList.Factory(TestOldVersion.factory)
val oldVersion = messageReader.getRoot(oldFactory)
oldVersion.size() should equal (1)
oldVersion.get(0).getOld1() should equal (91)
oldVersion.get(0).getOld2().toString() should equal ("hello!!")
// Make the first segment exactly large enough to fit the original message.
// This leaves no room for a far pointer landing pad in the first segment.
val message = new MessageBuilder(6)
message.setRoot(oldFactory, oldVersion)
val segments = message.getSegmentsForOutput()
segments.length should equal (1)
segments(0).limit() should equal (6 * 8)
val newVersion = message.getRoot(new StructList.Factory(TestNewVersion.factory))
newVersion.size() should equal (1)
newVersion.get(0).getOld1() should equal (91)
newVersion.get(0).getOld2().toString() should equal ("hello!!")
Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
message)
val segments1 = message.getSegmentsForOutput()
segments(0).limit() should equal (6 * 8)
for (ii <- 8 to (5 * 8) - 1) {
// Check the the old list, including the tag, was zeroed.
segments(0).get(ii) should equal (0)
}
}
test("Generics") {
val message = new MessageBuilder()
val factory = TestGenerics.newFactory(TestAllTypes.factory, Text.factory)

View file

@ -363,7 +363,7 @@ final class WireHelpers {
FarPointer.setSegmentId(farSegment.buffer, landingPadOffset, srcSegment.id);
WirePointer.setKindWithZeroOffset(farSegment.buffer, landingPadOffset + 1,
WirePointer.kind(srcTarget));
WirePointer.kind(src));
farSegment.buffer.putInt((landingPadOffset + 1) * Constants.BYTES_PER_WORD + 4,
srcSegment.buffer.getInt(srcOffset * Constants.BYTES_PER_WORD + 4));
@ -659,8 +659,9 @@ final class WireHelpers {
}
//# Zero out old location. See explanation in getWritableStructPointer().
//# Make sure to include the tag word.
memset(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD,
(byte)0, oldStep * elementCount * Constants.BYTES_PER_WORD);
(byte)0, (1 + oldStep * elementCount) * Constants.BYTES_PER_WORD);
return factory.constructBuilder(allocation.segment, newPtr * Constants.BYTES_PER_WORD,
elementCount,