Fixed bug spotted by danielr

This commit is contained in:
Jon Skeet 2009-09-06 20:22:34 +01:00
parent ad74853e0c
commit 1872d080f7
3 changed files with 48 additions and 28 deletions

View File

@ -155,8 +155,9 @@ namespace Google.ProtocolBuffers.ProtoGen {
writer.WriteLine("size += dataSize;");
int tagSize = CodedOutputStream.ComputeTagSize(Descriptor.FieldNumber);
if (Descriptor.IsPacked) {
writer.WriteLine("size += {0};", tagSize);
writer.WriteLine("size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);");
writer.WriteLine("if ({0}_.Count != 0) {{", Name);
writer.WriteLine(" size += {0} + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);", tagSize);
writer.WriteLine("}");
} else {
writer.WriteLine("size += {0} * {1}_.Count;", tagSize, Name);
}

View File

@ -452,5 +452,11 @@ namespace Google.ProtocolBuffers {
Assert.AreEqual(UnitTestProtoFile.RepeatedNestedMessageExtensionFieldNumber, 48);
Assert.AreEqual(UnitTestProtoFile.RepeatedNestedEnumExtensionFieldNumber, 51);
}
[Test]
public void EmptyPackedValue() {
TestPackedTypes empty = new TestPackedTypes.Builder().Build();
Assert.AreEqual(0, empty.SerializedSize);
}
}
}

View File

@ -12765,8 +12765,9 @@ namespace Google.ProtocolBuffers.TestProtos {
dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
}
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedInt32_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedInt32MemoizedSerializedSize = dataSize;
}
{
@ -12775,8 +12776,9 @@ namespace Google.ProtocolBuffers.TestProtos {
dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
}
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedInt64_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedInt64MemoizedSerializedSize = dataSize;
}
{
@ -12785,8 +12787,9 @@ namespace Google.ProtocolBuffers.TestProtos {
dataSize += pb::CodedOutputStream.ComputeUInt32SizeNoTag(element);
}
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedUint32_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedUint32MemoizedSerializedSize = dataSize;
}
{
@ -12795,8 +12798,9 @@ namespace Google.ProtocolBuffers.TestProtos {
dataSize += pb::CodedOutputStream.ComputeUInt64SizeNoTag(element);
}
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedUint64_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedUint64MemoizedSerializedSize = dataSize;
}
{
@ -12805,8 +12809,9 @@ namespace Google.ProtocolBuffers.TestProtos {
dataSize += pb::CodedOutputStream.ComputeSInt32SizeNoTag(element);
}
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedSint32_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedSint32MemoizedSerializedSize = dataSize;
}
{
@ -12815,64 +12820,72 @@ namespace Google.ProtocolBuffers.TestProtos {
dataSize += pb::CodedOutputStream.ComputeSInt64SizeNoTag(element);
}
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedSint64_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedSint64MemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 4 * packedFixed32_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedFixed32_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedFixed32MemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 8 * packedFixed64_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedFixed64_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedFixed64MemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 4 * packedSfixed32_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedSfixed32_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedSfixed32MemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 8 * packedSfixed64_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedSfixed64_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedSfixed64MemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 4 * packedFloat_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedFloat_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedFloatMemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 8 * packedDouble_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedDouble_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedDoubleMemoizedSerializedSize = dataSize;
}
{
int dataSize = 0;
dataSize = 1 * packedBool_.Count;
size += dataSize;
size += 2;
size += pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
if (packedBool_.Count != 0) {
size += 2 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
}
packedBoolMemoizedSerializedSize = dataSize;
}
{