private static void EndSubItem(SubItemToken token, ProtoWriter writer, PrefixStyle style) { if (writer.wireType != WireType.None) { throw CreateException(writer); } int value = token.value; if (writer.depth <= 0) throw CreateException(writer); if (writer.depth-- > RecursionCheckDepth) { writer.PopRecursionStack(); } writer.packedFieldNumber = 0; // ending the sub-item always wipes packed encoding if (value < 0) { // group - very simple append WriteHeaderCore(-value, WireType.EndGroup, writer); writer.wireType = WireType.None; return; } // so we're backfilling the length into an existing sequence int len; switch(style) { case PrefixStyle.Fixed32: len = (int)((writer.ioIndex - value) - 4); ProtoWriter.WriteInt32ToBuffer(len, writer.ioBuffer, value); break; case PrefixStyle.Fixed32BigEndian: len = (int)((writer.ioIndex - value) - 4); byte[] buffer = writer.ioBuffer; ProtoWriter.WriteInt32ToBuffer(len, buffer, value); // and swap the byte order byte b = buffer[value]; buffer[value] = buffer[value + 3]; buffer[value + 3] = b; b = buffer[value + 1]; buffer[value + 1] = buffer[value + 2]; buffer[value + 2] = b; break; case PrefixStyle.Base128: // string - complicated because we only reserved one byte; // if the prefix turns out to need more than this then // we need to shuffle the existing data len = (int)((writer.ioIndex - value) - 1); int offset = 0; uint tmp = (uint)len; while ((tmp >>= 7) != 0) offset++; if (offset == 0) { writer.ioBuffer[value] = (byte)(len & 0x7F); } else { DemandSpace(offset, writer); byte[] blob = writer.ioBuffer; Helpers.BlockCopy(blob, value + 1, blob, value + 1 + offset, len); tmp = (uint)len; do { blob[value++] = (byte)((tmp & 0x7F) | 0x80); } while ((tmp >>= 7) != 0); blob[value - 1] = (byte)(blob[value - 1] & ~0x80); writer.position += offset; writer.ioIndex += offset; } break; default: throw new ArgumentOutOfRangeException("style"); } // and this object is no longer a blockage writer.flushLock--; }
private static void EndSubItem(SubItemToken token, ProtoWriter writer, PrefixStyle style) { if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.wireType != WireType.None) { throw CreateException(writer); } int value = token.value; if (writer.depth <= 0) { throw CreateException(writer); } if (writer.depth-- > RecursionCheckDepth) { writer.PopRecursionStack(); } writer.packedFieldNumber = 0; // ending the sub-item always wipes packed encoding if (value < 0) { // group - very simple append WriteHeaderCore(-value, WireType.EndGroup, writer); writer.wireType = WireType.None; return; } // so we're backfilling the length into an existing sequence int len; switch (style) { case PrefixStyle.Fixed32: len = (int)((writer.ioIndex - value) - 4); ProtoWriter.WriteInt32ToBuffer(len, writer.ioBuffer, value); break; case PrefixStyle.Fixed32BigEndian: len = (int)((writer.ioIndex - value) - 4); byte[] buffer = writer.ioBuffer; ProtoWriter.WriteInt32ToBuffer(len, buffer, value); // and swap the byte order byte b = buffer[value]; buffer[value] = buffer[value + 3]; buffer[value + 3] = b; b = buffer[value + 1]; buffer[value + 1] = buffer[value + 2]; buffer[value + 2] = b; break; case PrefixStyle.Base128: // string - complicated because we only reserved one byte; // if the prefix turns out to need more than this then // we need to shuffle the existing data len = (int)((writer.ioIndex - value) - 1); int offset = 0; uint tmp = (uint)len; while ((tmp >>= 7) != 0) { offset++; } if (offset == 0) { writer.ioBuffer[value] = (byte)(len & 0x7F); } else { DemandSpace(offset, writer); byte[] blob = writer.ioBuffer; Helpers.BlockCopy(blob, value + 1, blob, value + 1 + offset, len); tmp = (uint)len; do { blob[value++] = (byte)((tmp & 0x7F) | 0x80); } while ((tmp >>= 7) != 0); blob[value - 1] = (byte)(blob[value - 1] & ~0x80); writer.position += offset; writer.ioIndex += offset; } break; default: throw new ArgumentOutOfRangeException("style"); } // and this object is no longer a blockage - also flush if sensible const int ADVISORY_FLUSH_SIZE = 1024; if (--writer.flushLock == 0 && writer.ioIndex >= ADVISORY_FLUSH_SIZE) { ProtoWriter.Flush(writer); } }
private static void EndSubItem(SubItemToken token, ProtoWriter writer, PrefixStyle style) { if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.wireType != WireType.None) { throw ProtoWriter.CreateException(writer); } int value = token.value; if (writer.depth <= 0) { throw ProtoWriter.CreateException(writer); } if (writer.depth-- > 25) { writer.PopRecursionStack(); } writer.packedFieldNumber = 0; if (value < 0) { ProtoWriter.WriteHeaderCore(-value, WireType.EndGroup, writer); writer.wireType = WireType.None; return; } switch (style) { case PrefixStyle.Base128: { int num = writer.ioIndex - value - 1; int num2 = 0; uint num3 = (uint)num; while ((num3 >>= 7) != 0u) { num2++; } if (num2 == 0) { writer.ioBuffer[value] = (byte)(num & 127); } else { ProtoWriter.DemandSpace(num2, writer); byte[] array = writer.ioBuffer; Helpers.BlockCopy(array, value + 1, array, value + 1 + num2, num); num3 = (uint)num; do { array[value++] = (byte)((num3 & 127u) | 128u); } while ((num3 >>= 7) != 0u); array[value - 1] = (byte)((int)array[value - 1] & -129); writer.position += num2; writer.ioIndex += num2; } break; } case PrefixStyle.Fixed32: { int num = writer.ioIndex - value - 4; ProtoWriter.WriteInt32ToBuffer(num, writer.ioBuffer, value); break; } case PrefixStyle.Fixed32BigEndian: { int num = writer.ioIndex - value - 4; byte[] array2 = writer.ioBuffer; ProtoWriter.WriteInt32ToBuffer(num, array2, value); byte b = array2[value]; array2[value] = array2[value + 3]; array2[value + 3] = b; b = array2[value + 1]; array2[value + 1] = array2[value + 2]; array2[value + 2] = b; break; } default: throw new ArgumentOutOfRangeException("style"); } if (--writer.flushLock == 0 && writer.ioIndex >= 1024) { ProtoWriter.Flush(writer); } }
private static void EndSubItem(SubItemToken token, ProtoWriter writer, PrefixStyle style) { int num; UInt32 num1; if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.wireType != ProtoBuf.WireType.None) { throw ProtoWriter.CreateException(writer); } int num2 = token.@value; if (writer.depth <= 0) { throw ProtoWriter.CreateException(writer); } ProtoWriter protoWriter = writer; int num3 = protoWriter.depth; int num4 = num3; protoWriter.depth = num3 - 1; if (num4 > 25) { writer.PopRecursionStack(); } writer.packedFieldNumber = 0; if (num2 < 0) { ProtoWriter.WriteHeaderCore(-num2, ProtoBuf.WireType.EndGroup, writer); writer.wireType = ProtoBuf.WireType.None; return; } switch (style) { case PrefixStyle.Base128: { num = writer.ioIndex - num2 - 1; int num5 = 0; uint num6 = (uint)num; while (true) { UInt32 num7 = num6 >> 7; num6 = num7; if (num7 == 0) { break; } num5++; } if (num5 != 0) { ProtoWriter.DemandSpace(num5, writer); byte[] numArray = writer.ioBuffer; Helpers.BlockCopy(numArray, num2 + 1, numArray, num2 + 1 + num5, num); num6 = (uint)num; do { int num8 = num2; num2 = num8 + 1; numArray[num8] = (byte)(num6 & 127 | 128); num1 = num6 >> 7; num6 = num1; }while (num1 != 0); numArray[num2 - 1] = (byte)(numArray[num2 - 1] & -129); writer.position += num5; writer.ioIndex += num5; break; } else { writer.ioBuffer[num2] = (byte)(num & 127); break; } } case PrefixStyle.Fixed32: { num = writer.ioIndex - num2 - 4; ProtoWriter.WriteInt32ToBuffer(num, writer.ioBuffer, num2); break; } case PrefixStyle.Fixed32BigEndian: { num = writer.ioIndex - num2 - 4; byte[] numArray1 = writer.ioBuffer; ProtoWriter.WriteInt32ToBuffer(num, numArray1, num2); byte num9 = numArray1[num2]; numArray1[num2] = numArray1[num2 + 3]; numArray1[num2 + 3] = num9; num9 = numArray1[num2 + 1]; numArray1[num2 + 1] = numArray1[num2 + 2]; numArray1[num2 + 2] = num9; break; } default: { throw new ArgumentOutOfRangeException("style"); } } ProtoWriter protoWriter1 = writer; int num10 = protoWriter1.flushLock - 1; int num11 = num10; protoWriter1.flushLock = num10; if (num11 == 0 && writer.ioIndex >= 1024) { ProtoWriter.Flush(writer); } }
private static void EndSubItem(SubItemToken token, ProtoWriter writer, PrefixStyle style) { if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.wireType != WireType.None) { throw ProtoWriter.CreateException(writer); } int value = token.value; if (writer.depth <= 0) { throw ProtoWriter.CreateException(writer); } if (writer.depth-- > 25) { writer.PopRecursionStack(); } writer.packedFieldNumber = 0; if (value < 0) { ProtoWriter.WriteHeaderCore(-value, WireType.EndGroup, writer); writer.wireType = WireType.None; return; } switch (style) { case PrefixStyle.Base128: { int num = writer.ioIndex - value - 1; int num2 = 0; uint num3 = (uint)num; while ((num3 >>= 7) != 0u) { num2++; } if (num2 == 0) { writer.ioBuffer[value] = (byte)(num & 127); } else { ProtoWriter.DemandSpace(num2, writer); byte[] array = writer.ioBuffer; Helpers.BlockCopy(array, value + 1, array, value + 1 + num2, num); num3 = (uint)num; do { array[value++] = (byte)((num3 & 127u) | 128u); }while ((num3 >>= 7) != 0u); array[value - 1] = (byte)((int)array[value - 1] & -129); writer.position += num2; writer.ioIndex += num2; } break; } case PrefixStyle.Fixed32: { int num = writer.ioIndex - value - 4; ProtoWriter.WriteInt32ToBuffer(num, writer.ioBuffer, value); break; } case PrefixStyle.Fixed32BigEndian: { int num = writer.ioIndex - value - 4; byte[] array2 = writer.ioBuffer; ProtoWriter.WriteInt32ToBuffer(num, array2, value); byte b = array2[value]; array2[value] = array2[value + 3]; array2[value + 3] = b; b = array2[value + 1]; array2[value + 1] = array2[value + 2]; array2[value + 2] = b; break; } default: throw new ArgumentOutOfRangeException("style"); } if (--writer.flushLock == 0 && writer.ioIndex >= 1024) { ProtoWriter.Flush(writer); } }
private static void EndSubItem(SubItemToken token, ProtoWriter writer, PrefixStyle style) { if (writer == null) { throw new ArgumentNullException("writer"); } if (writer.wireType != WireType.None) { throw CreateException(writer); } int num = token.value; if (writer.depth <= 0) { throw CreateException(writer); } if (writer.depth-- > 25) { writer.PopRecursionStack(); } writer.packedFieldNumber = 0; if (num < 0) { WriteHeaderCore(-num, WireType.EndGroup, writer); writer.wireType = WireType.None; } else { switch (style) { case PrefixStyle.Fixed32: { int num2 = writer.ioIndex - num - 4; WriteInt32ToBuffer(num2, writer.ioBuffer, num); break; } case PrefixStyle.Fixed32BigEndian: { int num2 = writer.ioIndex - num - 4; byte[] array2 = writer.ioBuffer; WriteInt32ToBuffer(num2, array2, num); byte b = array2[num]; array2[num] = array2[num + 3]; array2[num + 3] = b; b = array2[num + 1]; array2[num + 1] = array2[num + 2]; array2[num + 2] = b; break; } case PrefixStyle.Base128: { int num2 = writer.ioIndex - num - 1; int num3 = 0; uint num4 = (uint)num2; while ((num4 >>= 7) != 0) { num3++; } if (num3 == 0) { writer.ioBuffer[num] = (byte)(num2 & 0x7F); } else { DemandSpace(num3, writer); byte[] array = writer.ioBuffer; Helpers.BlockCopy(array, num + 1, array, num + 1 + num3, num2); num4 = (uint)num2; do { array[num++] = (byte)((num4 & 0x7F) | 0x80); }while ((num4 >>= 7) != 0); array[num - 1] = (byte)(array[num - 1] & -129); writer.position += num3; writer.ioIndex += num3; } break; } default: throw new ArgumentOutOfRangeException("style"); } if (--writer.flushLock == 0 && writer.ioIndex >= 1024) { Flush(writer); } } }