31 package com.google.protobuf;
36 import java.io.IOException;
46 final class ArrayDecoders {
56 static final class Registers {
59 public Object object1;
60 public final ExtensionRegistryLite extensionRegistry;
63 this.extensionRegistry = ExtensionRegistryLite.getEmptyRegistry();
66 Registers(ExtensionRegistryLite extensionRegistry) {
67 if (extensionRegistry ==
null) {
68 throw new NullPointerException();
70 this.extensionRegistry = extensionRegistry;
78 static int decodeVarint32(
byte[]
data,
int position, Registers registers) {
81 registers.int1 =
value;
88 static int decodeVarint32(
int firstByte,
byte[]
data,
int position, Registers registers) {
89 int value = firstByte & 0x7F;
92 registers.int1 =
value | ((int) b2 << 7);
95 value |= (b2 & 0x7F) << 7;
99 registers.int1 =
value | ((int) b3 << 14);
102 value |= (b3 & 0x7F) << 14;
106 registers.int1 =
value | ((int) b4 << 21);
109 value |= (b4 & 0x7F) << 21;
113 registers.int1 =
value | ((int) b5 << 28);
116 value |= (b5 & 0x7F) << 28;
120 registers.int1 =
value;
128 static int decodeVarint64(
byte[]
data,
int position, Registers registers) {
131 registers.long1 =
value;
139 static int decodeVarint64(
long firstByte,
byte[]
data,
int position, Registers registers) {
140 long value = firstByte & 0x7F;
149 registers.long1 =
value;
184 static int decodeString(
byte[]
data,
int position, Registers registers)
185 throws InvalidProtocolBufferException {
187 final int length = registers.int1;
189 throw InvalidProtocolBufferException.negativeSize();
191 registers.object1 =
"";
200 static int decodeStringRequireUtf8(
byte[]
data,
int position, Registers registers)
201 throws InvalidProtocolBufferException {
203 final int length = registers.int1;
205 throw InvalidProtocolBufferException.negativeSize();
207 registers.object1 =
"";
216 static int decodeBytes(
byte[]
data,
int position, Registers registers)
217 throws InvalidProtocolBufferException {
219 final int length = registers.int1;
221 throw InvalidProtocolBufferException.negativeSize();
223 throw InvalidProtocolBufferException.truncatedMessage();
225 registers.object1 = ByteString.EMPTY;
234 @SuppressWarnings({
"unchecked",
"rawtypes"})
235 static int decodeMessageField(
236 Schema schema,
byte[]
data,
int position,
int limit, Registers registers)
throws IOException {
243 throw InvalidProtocolBufferException.truncatedMessage();
245 Object result = schema.newInstance();
247 schema.makeImmutable(result);
248 registers.object1 = result;
253 @SuppressWarnings({
"unchecked",
"rawtypes"})
254 static int decodeGroupField(
255 Schema schema,
byte[]
data,
int position,
int limit,
int endGroup, Registers registers)
259 final MessageSchema messageSchema = (MessageSchema) schema;
260 Object result = messageSchema.newInstance();
262 final int endPosition =
263 messageSchema.parseProto2Message(result,
data,
position, limit, endGroup, registers);
264 messageSchema.makeImmutable(result);
265 registers.object1 = result;
270 static int decodeVarint32List(
271 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
272 final IntArrayList
output = (IntArrayList) list;
274 output.addInt(registers.int1);
276 int nextPosition = decodeVarint32(
data,
position, registers);
277 if (tag != registers.int1) {
280 position = decodeVarint32(
data, nextPosition, registers);
281 output.addInt(registers.int1);
287 static int decodeVarint64List(
288 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
289 final LongArrayList
output = (LongArrayList) list;
291 output.addLong(registers.long1);
293 int nextPosition = decodeVarint32(
data,
position, registers);
294 if (tag != registers.int1) {
297 position = decodeVarint64(
data, nextPosition, registers);
298 output.addLong(registers.long1);
304 static int decodeFixed32List(
305 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
306 final IntArrayList
output = (IntArrayList) list;
310 int nextPosition = decodeVarint32(
data,
position, registers);
311 if (tag != registers.int1) {
314 output.addInt(decodeFixed32(
data, nextPosition));
321 static int decodeFixed64List(
322 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
323 final LongArrayList
output = (LongArrayList) list;
327 int nextPosition = decodeVarint32(
data,
position, registers);
328 if (tag != registers.int1) {
331 output.addLong(decodeFixed64(
data, nextPosition));
338 static int decodeFloatList(
339 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
340 final FloatArrayList
output = (FloatArrayList) list;
344 int nextPosition = decodeVarint32(
data,
position, registers);
345 if (tag != registers.int1) {
348 output.addFloat(decodeFloat(
data, nextPosition));
355 static int decodeDoubleList(
356 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
357 final DoubleArrayList
output = (DoubleArrayList) list;
361 int nextPosition = decodeVarint32(
data,
position, registers);
362 if (tag != registers.int1) {
365 output.addDouble(decodeDouble(
data, nextPosition));
372 static int decodeBoolList(
373 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
374 final BooleanArrayList
output = (BooleanArrayList) list;
376 output.addBoolean(registers.long1 != 0);
378 int nextPosition = decodeVarint32(
data,
position, registers);
379 if (tag != registers.int1) {
382 position = decodeVarint64(
data, nextPosition, registers);
383 output.addBoolean(registers.long1 != 0);
389 static int decodeSInt32List(
390 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
391 final IntArrayList
output = (IntArrayList) list;
393 output.addInt(CodedInputStream.decodeZigZag32(registers.int1));
395 int nextPosition = decodeVarint32(
data,
position, registers);
396 if (tag != registers.int1) {
399 position = decodeVarint32(
data, nextPosition, registers);
400 output.addInt(CodedInputStream.decodeZigZag32(registers.int1));
406 static int decodeSInt64List(
407 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers) {
408 final LongArrayList
output = (LongArrayList) list;
410 output.addLong(CodedInputStream.decodeZigZag64(registers.long1));
412 int nextPosition = decodeVarint32(
data,
position, registers);
413 if (tag != registers.int1) {
416 position = decodeVarint64(
data, nextPosition, registers);
417 output.addLong(CodedInputStream.decodeZigZag64(registers.long1));
423 static int decodePackedVarint32List(
424 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
425 final IntArrayList
output = (IntArrayList) list;
427 final int fieldLimit =
position + registers.int1;
430 output.addInt(registers.int1);
433 throw InvalidProtocolBufferException.truncatedMessage();
439 static int decodePackedVarint64List(
440 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
441 final LongArrayList
output = (LongArrayList) list;
443 final int fieldLimit =
position + registers.int1;
446 output.addLong(registers.long1);
449 throw InvalidProtocolBufferException.truncatedMessage();
455 static int decodePackedFixed32List(
456 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
457 final IntArrayList
output = (IntArrayList) list;
459 final int fieldLimit =
position + registers.int1;
465 throw InvalidProtocolBufferException.truncatedMessage();
471 static int decodePackedFixed64List(
472 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
473 final LongArrayList
output = (LongArrayList) list;
475 final int fieldLimit =
position + registers.int1;
481 throw InvalidProtocolBufferException.truncatedMessage();
487 static int decodePackedFloatList(
488 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
489 final FloatArrayList
output = (FloatArrayList) list;
491 final int fieldLimit =
position + registers.int1;
497 throw InvalidProtocolBufferException.truncatedMessage();
503 static int decodePackedDoubleList(
504 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
505 final DoubleArrayList
output = (DoubleArrayList) list;
507 final int fieldLimit =
position + registers.int1;
513 throw InvalidProtocolBufferException.truncatedMessage();
519 static int decodePackedBoolList(
520 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
521 final BooleanArrayList
output = (BooleanArrayList) list;
523 final int fieldLimit =
position + registers.int1;
526 output.addBoolean(registers.long1 != 0);
529 throw InvalidProtocolBufferException.truncatedMessage();
535 static int decodePackedSInt32List(
536 byte[]
data,
int position, ProtobufList<?> list, Registers registers)
throws IOException {
537 final IntArrayList
output = (IntArrayList) list;
539 final int fieldLimit =
position + registers.int1;
542 output.addInt(CodedInputStream.decodeZigZag32(registers.int1));
545 throw InvalidProtocolBufferException.truncatedMessage();
551 @SuppressWarnings(
"unchecked")
552 static
int decodePackedSInt64List(
553 byte[]
data,
int position, ProtobufList<?> list, Registers registers) throws IOException {
554 final LongArrayList
output = (LongArrayList) list;
556 final int fieldLimit =
position + registers.int1;
559 output.addLong(CodedInputStream.decodeZigZag64(registers.long1));
562 throw InvalidProtocolBufferException.truncatedMessage();
568 @SuppressWarnings(
"unchecked")
569 static
int decodeStringList(
570 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers)
571 throws InvalidProtocolBufferException {
572 final ProtobufList<String>
output = (ProtobufList<String>) list;
574 final int length = registers.int1;
576 throw InvalidProtocolBufferException.negativeSize();
585 int nextPosition = decodeVarint32(
data,
position, registers);
586 if (tag != registers.int1) {
589 position = decodeVarint32(
data, nextPosition, registers);
590 final int nextLength = registers.int1;
591 if (nextLength < 0) {
592 throw InvalidProtocolBufferException.negativeSize();
593 }
else if (nextLength == 0) {
607 @SuppressWarnings(
"unchecked")
608 static
int decodeStringListRequireUtf8(
609 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers)
610 throws InvalidProtocolBufferException {
611 final ProtobufList<String>
output = (ProtobufList<String>) list;
613 final int length = registers.int1;
615 throw InvalidProtocolBufferException.negativeSize();
620 throw InvalidProtocolBufferException.invalidUtf8();
627 int nextPosition = decodeVarint32(
data,
position, registers);
628 if (tag != registers.int1) {
631 position = decodeVarint32(
data, nextPosition, registers);
632 final int nextLength = registers.int1;
633 if (nextLength < 0) {
634 throw InvalidProtocolBufferException.negativeSize();
635 }
else if (nextLength == 0) {
639 throw InvalidProtocolBufferException.invalidUtf8();
650 @SuppressWarnings(
"unchecked")
651 static
int decodeBytesList(
652 int tag,
byte[]
data,
int position,
int limit, ProtobufList<?> list, Registers registers)
653 throws InvalidProtocolBufferException {
654 final ProtobufList<ByteString>
output = (ProtobufList<ByteString>) list;
656 final int length = registers.int1;
658 throw InvalidProtocolBufferException.negativeSize();
660 throw InvalidProtocolBufferException.truncatedMessage();
662 output.add(ByteString.EMPTY);
668 int nextPosition = decodeVarint32(
data,
position, registers);
669 if (tag != registers.int1) {
672 position = decodeVarint32(
data, nextPosition, registers);
673 final int nextLength = registers.int1;
674 if (nextLength < 0) {
675 throw InvalidProtocolBufferException.negativeSize();
677 throw InvalidProtocolBufferException.truncatedMessage();
678 }
else if (nextLength == 0) {
679 output.add(ByteString.EMPTY);
693 @SuppressWarnings({
"unchecked"})
694 static int decodeMessageList(
700 ProtobufList<?> list,
703 final ProtobufList<Object>
output = (ProtobufList<Object>) list;
705 output.add(registers.object1);
707 int nextPosition = decodeVarint32(
data,
position, registers);
708 if (tag != registers.int1) {
711 position = decodeMessageField(schema,
data, nextPosition, limit, registers);
712 output.add(registers.object1);
722 @SuppressWarnings({
"unchecked",
"rawtypes"})
723 static int decodeGroupList(
729 ProtobufList<?> list,
732 final ProtobufList<Object>
output = (ProtobufList<Object>) list;
733 final int endgroup = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
735 output.add(registers.object1);
737 int nextPosition = decodeVarint32(
data,
position, registers);
738 if (tag != registers.int1) {
741 position = decodeGroupField(schema,
data, nextPosition, limit, endgroup, registers);
742 output.add(registers.object1);
747 static int decodeExtensionOrUnknownField(
750 MessageLite defaultInstance,
751 UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite> unknownFieldSchema,
754 final int number = tag >>> 3;
755 GeneratedMessageLite.GeneratedExtension
extension =
756 registers.extensionRegistry.findLiteExtensionByNumber(defaultInstance,
number);
758 return decodeUnknownField(
761 ((GeneratedMessageLite.ExtendableMessage<?, ?>)
message).ensureExtensionsAreMutable();
762 return decodeExtension(
764 extension, unknownFieldSchema, registers);
768 static int decodeExtension(
773 GeneratedMessageLite.ExtendableMessage<?, ?>
message,
774 GeneratedMessageLite.GeneratedExtension<?, ?>
extension,
775 UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite> unknownFieldSchema,
778 final FieldSet<GeneratedMessageLite.ExtensionDescriptor> extensions =
message.extensions;
779 final int fieldNumber = tag >>> 3;
784 DoubleArrayList list =
new DoubleArrayList();
786 extensions.setField(
extension.descriptor, list);
791 FloatArrayList list =
new FloatArrayList();
793 extensions.setField(
extension.descriptor, list);
799 LongArrayList list =
new LongArrayList();
801 extensions.setField(
extension.descriptor, list);
807 IntArrayList list =
new IntArrayList();
809 extensions.setField(
extension.descriptor, list);
815 LongArrayList list =
new LongArrayList();
817 extensions.setField(
extension.descriptor, list);
823 IntArrayList list =
new IntArrayList();
825 extensions.setField(
extension.descriptor, list);
830 BooleanArrayList list =
new BooleanArrayList();
832 extensions.setField(
extension.descriptor, list);
837 IntArrayList list =
new IntArrayList();
839 extensions.setField(
extension.descriptor, list);
844 LongArrayList list =
new LongArrayList();
846 extensions.setField(
extension.descriptor, list);
851 IntArrayList list =
new IntArrayList();
853 UnknownFieldSetLite unknownFields =
message.unknownFields;
854 if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
855 unknownFields =
null;
858 SchemaUtil.filterUnknownEnumList(
864 if (unknownFields !=
null) {
865 message.unknownFields = unknownFields;
867 extensions.setField(
extension.descriptor, list);
871 throw new IllegalStateException(
872 "Type cannot be packed: " +
extension.descriptor.getLiteType());
877 if (
extension.getLiteType() == WireFormat.FieldType.ENUM) {
879 Object enumValue =
extension.descriptor.getEnumType().findValueByNumber(registers.int1);
880 if (enumValue ==
null) {
881 UnknownFieldSetLite unknownFields = ((GeneratedMessageLite)
message).unknownFields;
882 if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
883 unknownFields = UnknownFieldSetLite.newInstance();
884 ((GeneratedMessageLite)
message).unknownFields = unknownFields;
886 SchemaUtil.storeUnknownEnum(
887 fieldNumber, registers.int1, unknownFields, unknownFieldSchema);
892 value = registers.int1;
906 value = registers.long1;
911 value = registers.int1;
925 value = (registers.long1 != 0);
929 value = registers.object1;
933 value = CodedInputStream.decodeZigZag32(registers.int1);
937 value = CodedInputStream.decodeZigZag64(registers.long1);
941 value = registers.object1;
944 final int endTag = (fieldNumber << 3) | WireFormat.WIRETYPE_END_GROUP;
946 Protobuf.getInstance().schemaFor(
extension.getMessageDefaultInstance().getClass()),
948 value = registers.object1;
953 Protobuf.getInstance().schemaFor(
extension.getMessageDefaultInstance().getClass()),
955 value = registers.object1;
959 throw new IllegalStateException(
"Shouldn't reach here.");
968 Object oldValue = extensions.getField(
extension.descriptor);
969 if (oldValue !=
null) {
970 value = Internal.mergeMessage(oldValue,
value);
983 static int decodeUnknownField(
988 UnknownFieldSetLite unknownFields,
990 throws InvalidProtocolBufferException {
991 if (WireFormat.getTagFieldNumber(tag) == 0) {
992 throw InvalidProtocolBufferException.invalidTag();
994 switch (WireFormat.getTagWireType(tag)) {
995 case WireFormat.WIRETYPE_VARINT:
997 unknownFields.storeField(tag, registers.long1);
999 case WireFormat.WIRETYPE_FIXED32:
1000 unknownFields.storeField(tag, decodeFixed32(
data,
position));
1002 case WireFormat.WIRETYPE_FIXED64:
1003 unknownFields.storeField(tag, decodeFixed64(
data,
position));
1005 case WireFormat.WIRETYPE_LENGTH_DELIMITED:
1007 final int length = registers.int1;
1009 throw InvalidProtocolBufferException.negativeSize();
1011 throw InvalidProtocolBufferException.truncatedMessage();
1012 }
else if (
length == 0) {
1013 unknownFields.storeField(tag, ByteString.EMPTY);
1018 case WireFormat.WIRETYPE_START_GROUP:
1019 final UnknownFieldSetLite
child = UnknownFieldSetLite.newInstance();
1020 final int endGroup = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
1024 lastTag = registers.int1;
1025 if (lastTag == endGroup) {
1030 if (
position > limit || lastTag != endGroup) {
1031 throw InvalidProtocolBufferException.parseFailure();
1033 unknownFields.storeField(tag,
child);
1036 throw InvalidProtocolBufferException.invalidTag();
1041 static int skipField(
int tag,
byte[]
data,
int position,
int limit, Registers registers)
1042 throws InvalidProtocolBufferException {
1043 if (WireFormat.getTagFieldNumber(tag) == 0) {
1044 throw InvalidProtocolBufferException.invalidTag();
1046 switch (WireFormat.getTagWireType(tag)) {
1047 case WireFormat.WIRETYPE_VARINT:
1050 case WireFormat.WIRETYPE_FIXED32:
1052 case WireFormat.WIRETYPE_FIXED64:
1054 case WireFormat.WIRETYPE_LENGTH_DELIMITED:
1057 case WireFormat.WIRETYPE_START_GROUP:
1058 final int endGroup = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
1062 lastTag = registers.int1;
1063 if (lastTag == endGroup) {
1068 if (
position > limit || lastTag != endGroup) {
1069 throw InvalidProtocolBufferException.parseFailure();
1073 throw InvalidProtocolBufferException.invalidTag();