31 package com.google.protobuf;
77 import java.io.IOException;
79 import java.util.Arrays;
80 import java.util.Iterator;
81 import java.util.List;
85 final class MessageSchema<
T>
implements Schema<T> {
86 private static final int INTS_PER_FIELD = 3;
87 private static final int OFFSET_BITS = 20;
88 private static final int OFFSET_MASK = 0XFFFFF;
89 private static final int FIELD_TYPE_MASK = 0x0FF00000;
90 private static final int REQUIRED_MASK = 0x10000000;
91 private static final int ENFORCE_UTF8_MASK = 0x20000000;
92 private static final int[] EMPTY_INT_ARRAY =
new int[0];
95 static final int ONEOF_TYPE_OFFSET = 51 ;
101 private static final sun.misc.Unsafe UNSAFE = UnsafeUtil.getUnsafe();
122 private final int[]
buffer;
141 private final Object[] objects;
143 private final int minFieldNumber;
144 private final int maxFieldNumber;
146 private final MessageLite defaultInstance;
147 private final boolean hasExtensions;
148 private final boolean lite;
149 private final boolean proto3;
151 private final boolean useCachedSizeField;
154 private final int[] intArray;
160 private final int checkInitializedCount;
166 private final int repeatedFieldOffsetStart;
168 private final NewInstanceSchema newInstanceSchema;
169 private final ListFieldSchema listFieldSchema;
170 private final UnknownFieldSchema<?, ?> unknownFieldSchema;
171 private final ExtensionSchema<?> extensionSchema;
172 private final MapFieldSchema mapFieldSchema;
174 private MessageSchema(
179 MessageLite defaultInstance,
181 boolean useCachedSizeField,
183 int checkInitialized,
184 int mapFieldPositions,
185 NewInstanceSchema newInstanceSchema,
186 ListFieldSchema listFieldSchema,
187 UnknownFieldSchema<?, ?> unknownFieldSchema,
188 ExtensionSchema<?> extensionSchema,
189 MapFieldSchema mapFieldSchema) {
191 this.objects = objects;
192 this.minFieldNumber = minFieldNumber;
193 this.maxFieldNumber = maxFieldNumber;
195 this.lite = defaultInstance instanceof GeneratedMessageLite;
196 this.proto3 = proto3;
197 this.hasExtensions = extensionSchema !=
null && extensionSchema.hasExtensions(defaultInstance);
198 this.useCachedSizeField = useCachedSizeField;
200 this.intArray = intArray;
201 this.checkInitializedCount = checkInitialized;
202 this.repeatedFieldOffsetStart = mapFieldPositions;
204 this.newInstanceSchema = newInstanceSchema;
205 this.listFieldSchema = listFieldSchema;
206 this.unknownFieldSchema = unknownFieldSchema;
207 this.extensionSchema = extensionSchema;
208 this.defaultInstance = defaultInstance;
209 this.mapFieldSchema = mapFieldSchema;
212 static <T> MessageSchema<T> newSchema(
213 Class<T> messageClass,
214 MessageInfo messageInfo,
215 NewInstanceSchema newInstanceSchema,
216 ListFieldSchema listFieldSchema,
217 UnknownFieldSchema<?, ?> unknownFieldSchema,
218 ExtensionSchema<?> extensionSchema,
219 MapFieldSchema mapFieldSchema) {
220 if (messageInfo instanceof RawMessageInfo) {
221 return newSchemaForRawMessageInfo(
222 (RawMessageInfo) messageInfo,
230 return newSchemaForMessageInfo(
231 (StructuralMessageInfo) messageInfo,
240 static <T> MessageSchema<T> newSchemaForRawMessageInfo(
241 RawMessageInfo messageInfo,
242 NewInstanceSchema newInstanceSchema,
243 ListFieldSchema listFieldSchema,
244 UnknownFieldSchema<?, ?> unknownFieldSchema,
245 ExtensionSchema<?> extensionSchema,
246 MapFieldSchema mapFieldSchema) {
247 final boolean isProto3 = messageInfo.getSyntax() == ProtoSyntax.PROTO3;
249 String info = messageInfo.getStringInfo();
250 final int length = info.length();
253 int next = info.charAt(
i++);
254 if (
next >= 0xD800) {
255 int result =
next & 0x1FFF;
257 while ((
next = info.charAt(
i++)) >= 0xD800) {
258 result |= (
next & 0x1FFF) << shift;
265 next = info.charAt(
i++);
266 if (
next >= 0xD800) {
267 int result =
next & 0x1FFF;
269 while ((
next = info.charAt(
i++)) >= 0xD800) {
270 result |= (
next & 0x1FFF) << shift;
275 final int fieldCount =
next;
277 final int oneofCount;
278 final int hasBitsCount;
279 final int minFieldNumber;
280 final int maxFieldNumber;
281 final int numEntries;
282 final int mapFieldCount;
283 final int repeatedFieldCount;
284 final int checkInitialized;
285 final int[] intArray;
287 if (fieldCount == 0) {
294 repeatedFieldCount = 0;
295 checkInitialized = 0;
296 intArray = EMPTY_INT_ARRAY;
299 next = info.charAt(
i++);
300 if (
next >= 0xD800) {
301 int result =
next & 0x1FFF;
303 while ((
next = info.charAt(
i++)) >= 0xD800) {
304 result |= (
next & 0x1FFF) << shift;
311 next = info.charAt(
i++);
312 if (
next >= 0xD800) {
313 int result =
next & 0x1FFF;
315 while ((
next = info.charAt(
i++)) >= 0xD800) {
316 result |= (
next & 0x1FFF) << shift;
323 next = info.charAt(
i++);
324 if (
next >= 0xD800) {
325 int result =
next & 0x1FFF;
327 while ((
next = info.charAt(
i++)) >= 0xD800) {
328 result |= (
next & 0x1FFF) << shift;
333 minFieldNumber =
next;
335 next = info.charAt(
i++);
336 if (
next >= 0xD800) {
337 int result =
next & 0x1FFF;
339 while ((
next = info.charAt(
i++)) >= 0xD800) {
340 result |= (
next & 0x1FFF) << shift;
345 maxFieldNumber =
next;
347 next = info.charAt(
i++);
348 if (
next >= 0xD800) {
349 int result =
next & 0x1FFF;
351 while ((
next = info.charAt(
i++)) >= 0xD800) {
352 result |= (
next & 0x1FFF) << shift;
359 next = info.charAt(
i++);
360 if (
next >= 0xD800) {
361 int result =
next & 0x1FFF;
363 while ((
next = info.charAt(
i++)) >= 0xD800) {
364 result |= (
next & 0x1FFF) << shift;
369 mapFieldCount =
next;
371 next = info.charAt(
i++);
372 if (
next >= 0xD800) {
373 int result =
next & 0x1FFF;
375 while ((
next = info.charAt(
i++)) >= 0xD800) {
376 result |= (
next & 0x1FFF) << shift;
381 repeatedFieldCount =
next;
383 next = info.charAt(
i++);
384 if (
next >= 0xD800) {
385 int result =
next & 0x1FFF;
387 while ((
next = info.charAt(
i++)) >= 0xD800) {
388 result |= (
next & 0x1FFF) << shift;
393 checkInitialized =
next;
394 intArray =
new int[checkInitialized + mapFieldCount + repeatedFieldCount];
396 objectsPosition = oneofCount * 2 + hasBitsCount;
399 final sun.misc.Unsafe unsafe = UNSAFE;
400 final Object[] messageInfoObjects = messageInfo.getObjects();
401 int checkInitializedPosition = 0;
402 final Class<?> messageClass = messageInfo.getDefaultInstance().getClass();
403 int[]
buffer =
new int[numEntries * INTS_PER_FIELD];
404 Object[] objects =
new Object[numEntries * 2];
406 int mapFieldIndex = checkInitialized;
407 int repeatedFieldIndex = checkInitialized + mapFieldCount;
411 final int fieldNumber;
412 final int fieldTypeWithExtraBits;
415 next = info.charAt(
i++);
416 if (
next >= 0xD800) {
417 int result =
next & 0x1FFF;
419 while ((
next = info.charAt(
i++)) >= 0xD800) {
420 result |= (
next & 0x1FFF) << shift;
427 next = info.charAt(
i++);
428 if (
next >= 0xD800) {
429 int result =
next & 0x1FFF;
431 while ((
next = info.charAt(
i++)) >= 0xD800) {
432 result |= (
next & 0x1FFF) << shift;
437 fieldTypeWithExtraBits =
next;
438 fieldType = fieldTypeWithExtraBits & 0xFF;
440 if ((fieldTypeWithExtraBits & 0x400) != 0) {
441 intArray[checkInitializedPosition++] =
bufferIndex;
444 final int fieldOffset;
445 final int presenceMaskShift;
446 final int presenceFieldOffset;
449 if (fieldType >= ONEOF_TYPE_OFFSET) {
450 next = info.charAt(
i++);
451 if (
next >= 0xD800) {
452 int result =
next & 0x1FFF;
454 while ((
next = info.charAt(
i++)) >= 0xD800) {
455 result |= (
next & 0x1FFF) << shift;
460 int oneofIndex =
next;
462 final int oneofFieldType = fieldType - ONEOF_TYPE_OFFSET;
463 if (oneofFieldType == 9
464 || oneofFieldType == 17 ) {
465 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
466 }
else if (oneofFieldType == 12 ) {
468 if ((
flags & 0x1) == 0x1) {
469 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
474 int index = oneofIndex * 2;
475 Object o = messageInfoObjects[
index];
479 oneofField = reflectField(messageClass, (String) o);
484 messageInfoObjects[
index] = oneofField;
487 fieldOffset = (int) unsafe.objectFieldOffset(oneofField);
491 o = messageInfoObjects[
index];
495 oneofCaseField = reflectField(messageClass, (String) o);
496 messageInfoObjects[
index] = oneofCaseField;
499 presenceFieldOffset = (int) unsafe.objectFieldOffset(oneofCaseField);
500 presenceMaskShift = 0;
502 Field field = reflectField(messageClass, (String) messageInfoObjects[objectsPosition++]);
503 if (fieldType == 9 || fieldType == 17 ) {
505 }
else if (fieldType == 27
506 || fieldType == 49 ) {
507 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
508 }
else if (fieldType == 12
510 || fieldType == 44 ) {
511 if ((
flags & 0x1) == 0x1) {
512 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
514 }
else if (fieldType == 50 ) {
516 objects[
bufferIndex / INTS_PER_FIELD * 2] = messageInfoObjects[objectsPosition++];
517 if ((fieldTypeWithExtraBits & 0x800) != 0) {
518 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
522 fieldOffset = (int) unsafe.objectFieldOffset(
field);
523 if ((
flags & 0x1) == 0x1 && fieldType <= 17 ) {
524 next = info.charAt(
i++);
525 if (
next >= 0xD800) {
526 int result =
next & 0x1FFF;
528 while ((
next = info.charAt(
i++)) >= 0xD800) {
529 result |= (
next & 0x1FFF) << shift;
534 int hasBitsIndex =
next;
537 int index = oneofCount * 2 + hasBitsIndex / 32;
538 Object o = messageInfoObjects[
index];
542 hasBitsField = reflectField(messageClass, (String) o);
543 messageInfoObjects[
index] = hasBitsField;
546 presenceFieldOffset = (int) unsafe.objectFieldOffset(hasBitsField);
547 presenceMaskShift = hasBitsIndex % 32;
549 presenceFieldOffset = 0;
550 presenceMaskShift = 0;
553 if (fieldType >= 18 && fieldType <= 49) {
556 intArray[repeatedFieldIndex++] = fieldOffset;
562 ((fieldTypeWithExtraBits & 0x200) != 0 ? ENFORCE_UTF8_MASK : 0)
563 | ((fieldTypeWithExtraBits & 0x100) != 0 ? REQUIRED_MASK : 0)
564 | (fieldType << OFFSET_BITS)
566 buffer[
bufferIndex++] = (presenceMaskShift << OFFSET_BITS) | presenceFieldOffset;
569 return new MessageSchema<T>(
574 messageInfo.getDefaultInstance(),
579 checkInitialized + mapFieldCount,
587 private static java.
lang.
reflect.Field reflectField(Class<?> messageClass, String fieldName) {
589 return messageClass.getDeclaredField(fieldName);
590 }
catch (NoSuchFieldException e) {
595 if (fieldName.equals(
field.getName())) {
602 throw new RuntimeException(
606 + messageClass.getName()
607 +
" not found. Known fields are "
608 + Arrays.toString(
fields));
612 static <T> MessageSchema<T> newSchemaForMessageInfo(
613 StructuralMessageInfo messageInfo,
614 NewInstanceSchema newInstanceSchema,
615 ListFieldSchema listFieldSchema,
616 UnknownFieldSchema<?, ?> unknownFieldSchema,
617 ExtensionSchema<?> extensionSchema,
618 MapFieldSchema mapFieldSchema) {
619 final boolean isProto3 = messageInfo.getSyntax() == ProtoSyntax.PROTO3;
620 FieldInfo[] fis = messageInfo.getFields();
621 final int minFieldNumber;
622 final int maxFieldNumber;
623 if (fis.length == 0) {
627 minFieldNumber = fis[0].getFieldNumber();
628 maxFieldNumber = fis[fis.length - 1].getFieldNumber();
631 final int numEntries = fis.length;
633 int[]
buffer =
new int[numEntries * INTS_PER_FIELD];
634 Object[] objects =
new Object[numEntries * 2];
636 int mapFieldCount = 0;
637 int repeatedFieldCount = 0;
638 for (FieldInfo fi : fis) {
641 }
else if (fi.getType().id() >= 18 && fi.getType().id() <= 49) {
644 repeatedFieldCount++;
647 int[] mapFieldPositions = mapFieldCount > 0 ?
new int[mapFieldCount] :
null;
648 int[] repeatedFieldOffsets = repeatedFieldCount > 0 ?
new int[repeatedFieldCount] :
null;
650 repeatedFieldCount = 0;
652 int[] checkInitialized = messageInfo.getCheckInitialized();
653 if (checkInitialized ==
null) {
654 checkInitialized = EMPTY_INT_ARRAY;
656 int checkInitializedIndex = 0;
660 final FieldInfo fi = fis[fieldIndex];
661 final int fieldNumber = fi.getFieldNumber();
668 if (checkInitializedIndex < checkInitialized.length
669 && checkInitialized[checkInitializedIndex] == fieldNumber) {
670 checkInitialized[checkInitializedIndex++] =
bufferIndex;
675 }
else if (fi.getType().id() >= 18 && fi.getType().id() <= 49) {
678 repeatedFieldOffsets[repeatedFieldCount++] =
679 (int) UnsafeUtil.objectFieldOffset(fi.getField());
685 if (mapFieldPositions ==
null) {
686 mapFieldPositions = EMPTY_INT_ARRAY;
688 if (repeatedFieldOffsets ==
null) {
689 repeatedFieldOffsets = EMPTY_INT_ARRAY;
692 new int[checkInitialized.length + mapFieldPositions.length + repeatedFieldOffsets.length];
693 System.arraycopy(checkInitialized, 0, combined, 0, checkInitialized.length);
695 mapFieldPositions, 0, combined, checkInitialized.length, mapFieldPositions.length);
697 repeatedFieldOffsets,
700 checkInitialized.length + mapFieldPositions.length,
701 repeatedFieldOffsets.length);
703 return new MessageSchema<T>(
708 messageInfo.getDefaultInstance(),
713 checkInitialized.length + mapFieldPositions.length,
721 private static void storeFieldData(
723 final int fieldOffset;
725 final int presenceMaskShift;
726 final int presenceFieldOffset;
728 OneofInfo oneof = fi.getOneof();
730 typeId = fi.getType().id() + ONEOF_TYPE_OFFSET;
731 fieldOffset = (int) UnsafeUtil.objectFieldOffset(oneof.getValueField());
732 presenceFieldOffset = (int) UnsafeUtil.objectFieldOffset(oneof.getCaseField());
733 presenceMaskShift = 0;
736 fieldOffset = (int) UnsafeUtil.objectFieldOffset(fi.getField());
738 if (!proto3 && !
type.isList() && !
type.isMap()) {
739 presenceFieldOffset = (int) UnsafeUtil.objectFieldOffset(fi.getPresenceField());
740 presenceMaskShift = Integer.numberOfTrailingZeros(fi.getPresenceMask());
742 if (fi.getCachedSizeField() ==
null) {
743 presenceFieldOffset = 0;
744 presenceMaskShift = 0;
746 presenceFieldOffset = (int) UnsafeUtil.objectFieldOffset(fi.getCachedSizeField());
747 presenceMaskShift = 0;
754 (fi.isEnforceUtf8() ? ENFORCE_UTF8_MASK : 0)
755 | (fi.isRequired() ? REQUIRED_MASK : 0)
756 | (typeId << OFFSET_BITS)
758 buffer[
bufferIndex + 2] = (presenceMaskShift << OFFSET_BITS) | presenceFieldOffset;
760 Object messageFieldClass = fi.getMessageFieldClass();
761 if (fi.getMapDefaultEntry() !=
null) {
762 objects[
bufferIndex / INTS_PER_FIELD * 2] = fi.getMapDefaultEntry();
763 if (messageFieldClass !=
null) {
764 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageFieldClass;
765 }
else if (fi.getEnumVerifier() !=
null) {
766 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = fi.getEnumVerifier();
769 if (messageFieldClass !=
null) {
770 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = messageFieldClass;
771 }
else if (fi.getEnumVerifier() !=
null) {
772 objects[
bufferIndex / INTS_PER_FIELD * 2 + 1] = fi.getEnumVerifier();
777 @SuppressWarnings(
"unchecked")
779 public T newInstance() {
780 return (
T) newInstanceSchema.newInstance(defaultInstance);
784 public boolean equals(
T message,
T other) {
786 for (
int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
787 if (!equals(
message, other, pos)) {
792 Object messageUnknown = unknownFieldSchema.getFromMessage(
message);
793 Object otherUnknown = unknownFieldSchema.getFromMessage(other);
794 if (!messageUnknown.equals(otherUnknown)) {
799 FieldSet<?> messageExtensions = extensionSchema.getExtensions(
message);
800 FieldSet<?> otherExtensions = extensionSchema.getExtensions(other);
801 return messageExtensions.equals(otherExtensions);
806 private boolean equals(
T message,
T other,
int pos) {
807 final int typeAndOffset = typeAndOffsetAt(pos);
810 switch (
type(typeAndOffset)) {
812 return arePresentForEquals(
message, other, pos)
814 ==
Double.doubleToLongBits(UnsafeUtil.getDouble(other,
offset));
816 return arePresentForEquals(
message, other, pos)
818 ==
Float.floatToIntBits(UnsafeUtil.getFloat(other,
offset));
820 return arePresentForEquals(
message, other, pos)
823 return arePresentForEquals(
message, other, pos)
826 return arePresentForEquals(
message, other, pos)
829 return arePresentForEquals(
message, other, pos)
832 return arePresentForEquals(
message, other, pos)
835 return arePresentForEquals(
message, other, pos)
838 return arePresentForEquals(
message, other, pos)
839 && SchemaUtil.safeEquals(
842 return arePresentForEquals(
message, other, pos)
843 && SchemaUtil.safeEquals(
846 return arePresentForEquals(
message, other, pos)
847 && SchemaUtil.safeEquals(
850 return arePresentForEquals(
message, other, pos)
853 return arePresentForEquals(
message, other, pos)
856 return arePresentForEquals(
message, other, pos)
859 return arePresentForEquals(
message, other, pos)
862 return arePresentForEquals(
message, other, pos)
865 return arePresentForEquals(
message, other, pos)
868 return arePresentForEquals(
message, other, pos)
869 && SchemaUtil.safeEquals(
904 return SchemaUtil.safeEquals(
907 return SchemaUtil.safeEquals(
927 return isOneofCaseEqual(
message, other, pos)
928 && SchemaUtil.safeEquals(
940 for (
int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
941 final int typeAndOffset = typeAndOffsetAt(pos);
942 final int entryNumber = numberAt(pos);
946 switch (
type(typeAndOffset)) {
954 hashCode = (hashCode * 53) +
Float.floatToIntBits(UnsafeUtil.getFloat(
message,
offset));
957 hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(
message,
offset));
960 hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(
message,
offset));
963 hashCode = (hashCode * 53) + (UnsafeUtil.getInt(
message,
offset));
966 hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(
message,
offset));
969 hashCode = (hashCode * 53) + (UnsafeUtil.getInt(
message,
offset));
972 hashCode = (hashCode * 53) + Internal.hashBoolean(UnsafeUtil.getBoolean(
message,
offset));
975 hashCode = (hashCode * 53) + ((String) UnsafeUtil.getObject(
message,
offset)).hashCode();
981 if (submessage !=
null) {
982 protoHash = submessage.hashCode();
984 hashCode = (53 * hashCode) + protoHash;
988 hashCode = (hashCode * 53) + UnsafeUtil.getObject(
message,
offset).hashCode();
991 hashCode = (hashCode * 53) + (UnsafeUtil.getInt(
message,
offset));
994 hashCode = (hashCode * 53) + (UnsafeUtil.getInt(
message,
offset));
997 hashCode = (hashCode * 53) + (UnsafeUtil.getInt(
message,
offset));
1000 hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(
message,
offset));
1003 hashCode = (hashCode * 53) + (UnsafeUtil.getInt(
message,
offset));
1006 hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(
message,
offset));
1013 if (submessage !=
null) {
1014 protoHash = submessage.hashCode();
1016 hashCode = (53 * hashCode) + protoHash;
1051 hashCode = (hashCode * 53) + UnsafeUtil.getObject(
message,
offset).hashCode();
1054 hashCode = (hashCode * 53) + UnsafeUtil.getObject(
message,
offset).hashCode();
1057 if (isOneofPresent(
message, entryNumber, pos)) {
1064 if (isOneofPresent(
message, entryNumber, pos)) {
1069 if (isOneofPresent(
message, entryNumber, pos)) {
1070 hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(
message,
offset));
1074 if (isOneofPresent(
message, entryNumber, pos)) {
1075 hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(
message,
offset));
1079 if (isOneofPresent(
message, entryNumber, pos)) {
1084 if (isOneofPresent(
message, entryNumber, pos)) {
1085 hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(
message,
offset));
1089 if (isOneofPresent(
message, entryNumber, pos)) {
1094 if (isOneofPresent(
message, entryNumber, pos)) {
1095 hashCode = (hashCode * 53) + Internal.hashBoolean(oneofBooleanAt(
message,
offset));
1099 if (isOneofPresent(
message, entryNumber, pos)) {
1101 (hashCode * 53) + ((String) UnsafeUtil.getObject(
message,
offset)).hashCode();
1105 if (isOneofPresent(
message, entryNumber, pos)) {
1107 hashCode = (53 * hashCode) + submessage.hashCode();
1111 if (isOneofPresent(
message, entryNumber, pos)) {
1112 hashCode = (hashCode * 53) + UnsafeUtil.getObject(
message,
offset).hashCode();
1116 if (isOneofPresent(
message, entryNumber, pos)) {
1121 if (isOneofPresent(
message, entryNumber, pos)) {
1126 if (isOneofPresent(
message, entryNumber, pos)) {
1131 if (isOneofPresent(
message, entryNumber, pos)) {
1132 hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(
message,
offset));
1136 if (isOneofPresent(
message, entryNumber, pos)) {
1141 if (isOneofPresent(
message, entryNumber, pos)) {
1142 hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(
message,
offset));
1146 if (isOneofPresent(
message, entryNumber, pos)) {
1148 hashCode = (53 * hashCode) + submessage.hashCode();
1157 hashCode = (hashCode * 53) + unknownFieldSchema.getFromMessage(
message).hashCode();
1159 if (hasExtensions) {
1160 hashCode = (hashCode * 53) + extensionSchema.getExtensions(
message).hashCode();
1167 public void mergeFrom(
T message,
T other) {
1168 if (other ==
null) {
1169 throw new NullPointerException();
1173 mergeSingleField(
message, other,
i);
1177 SchemaUtil.mergeUnknownFields(unknownFieldSchema,
message, other);
1179 if (hasExtensions) {
1180 SchemaUtil.mergeExtensions(extensionSchema,
message, other);
1185 private void mergeSingleField(
T message,
T other,
int pos) {
1186 final int typeAndOffset = typeAndOffsetAt(pos);
1188 final int number = numberAt(pos);
1190 switch (
type(typeAndOffset)) {
1192 if (isFieldPresent(other, pos)) {
1194 setFieldPresent(
message, pos);
1198 if (isFieldPresent(other, pos)) {
1200 setFieldPresent(
message, pos);
1204 if (isFieldPresent(other, pos)) {
1206 setFieldPresent(
message, pos);
1210 if (isFieldPresent(other, pos)) {
1212 setFieldPresent(
message, pos);
1216 if (isFieldPresent(other, pos)) {
1218 setFieldPresent(
message, pos);
1222 if (isFieldPresent(other, pos)) {
1224 setFieldPresent(
message, pos);
1228 if (isFieldPresent(other, pos)) {
1230 setFieldPresent(
message, pos);
1234 if (isFieldPresent(other, pos)) {
1236 setFieldPresent(
message, pos);
1240 if (isFieldPresent(other, pos)) {
1242 setFieldPresent(
message, pos);
1246 mergeMessage(
message, other, pos);
1249 if (isFieldPresent(other, pos)) {
1251 setFieldPresent(
message, pos);
1255 if (isFieldPresent(other, pos)) {
1257 setFieldPresent(
message, pos);
1261 if (isFieldPresent(other, pos)) {
1263 setFieldPresent(
message, pos);
1267 if (isFieldPresent(other, pos)) {
1269 setFieldPresent(
message, pos);
1273 if (isFieldPresent(other, pos)) {
1275 setFieldPresent(
message, pos);
1279 if (isFieldPresent(other, pos)) {
1281 setFieldPresent(
message, pos);
1285 if (isFieldPresent(other, pos)) {
1287 setFieldPresent(
message, pos);
1291 mergeMessage(
message, other, pos);
1328 SchemaUtil.mergeMap(mapFieldSchema,
message, other,
offset);
1339 if (isOneofPresent(other,
number, pos)) {
1346 mergeOneofMessage(
message, other, pos);
1355 if (isOneofPresent(other,
number, pos)) {
1361 mergeOneofMessage(
message, other, pos);
1368 private void mergeMessage(
T message,
T other,
int pos) {
1369 final int typeAndOffset = typeAndOffsetAt(pos);
1372 if (!isFieldPresent(other, pos)) {
1377 Object theirs = UnsafeUtil.getObject(other,
offset);
1378 if (mine !=
null && theirs !=
null) {
1379 Object
merged = Internal.mergeMessage(mine, theirs);
1381 setFieldPresent(
message, pos);
1382 }
else if (theirs !=
null) {
1384 setFieldPresent(
message, pos);
1388 private void mergeOneofMessage(
T message,
T other,
int pos) {
1389 int typeAndOffset = typeAndOffsetAt(pos);
1390 int number = numberAt(pos);
1393 if (!isOneofPresent(other,
number, pos)) {
1398 Object theirs = UnsafeUtil.getObject(other,
offset);
1399 if (mine !=
null && theirs !=
null) {
1400 Object
merged = Internal.mergeMessage(mine, theirs);
1403 }
else if (theirs !=
null) {
1410 public int getSerializedSize(
T message) {
1411 return proto3 ? getSerializedSizeProto3(
message) : getSerializedSizeProto2(
message);
1414 @SuppressWarnings(
"unchecked")
1415 private
int getSerializedSizeProto2(
T message) {
1418 final sun.misc.Unsafe unsafe = UNSAFE;
1419 int currentPresenceFieldOffset = -1;
1420 int currentPresenceField = 0;
1422 final int typeAndOffset = typeAndOffsetAt(
i);
1423 final int number = numberAt(
i);
1425 int fieldType =
type(typeAndOffset);
1426 int presenceMaskAndOffset = 0;
1427 int presenceMask = 0;
1428 if (fieldType <= 17) {
1429 presenceMaskAndOffset =
buffer[
i + 2];
1430 final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
1431 presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
1432 if (presenceFieldOffset != currentPresenceFieldOffset) {
1433 currentPresenceFieldOffset = presenceFieldOffset;
1434 currentPresenceField = unsafe.getInt(
message, (
long) presenceFieldOffset);
1436 }
else if (useCachedSizeField
1437 && fieldType >=
FieldType.DOUBLE_LIST_PACKED.id()
1438 && fieldType <=
FieldType.SINT64_LIST_PACKED.id()) {
1439 presenceMaskAndOffset =
buffer[
i + 2] & OFFSET_MASK;
1444 switch (fieldType) {
1446 if ((currentPresenceField & presenceMask) != 0) {
1447 size += CodedOutputStream.computeDoubleSize(
number, 0);
1451 if ((currentPresenceField & presenceMask) != 0) {
1452 size += CodedOutputStream.computeFloatSize(
number, 0);
1456 if ((currentPresenceField & presenceMask) != 0) {
1461 if ((currentPresenceField & presenceMask) != 0) {
1466 if ((currentPresenceField & presenceMask) != 0) {
1471 if ((currentPresenceField & presenceMask) != 0) {
1472 size += CodedOutputStream.computeFixed64Size(
number, 0);
1476 if ((currentPresenceField & presenceMask) != 0) {
1477 size += CodedOutputStream.computeFixed32Size(
number, 0);
1481 if ((currentPresenceField & presenceMask) != 0) {
1482 size += CodedOutputStream.computeBoolSize(
number,
true);
1486 if ((currentPresenceField & presenceMask) != 0) {
1488 if (
value instanceof ByteString) {
1489 size += CodedOutputStream.computeBytesSize(
number, (ByteString)
value);
1496 if ((currentPresenceField & presenceMask) != 0) {
1498 size += SchemaUtil.computeSizeMessage(
number,
value, getMessageFieldSchema(
i));
1502 if ((currentPresenceField & presenceMask) != 0) {
1508 if ((currentPresenceField & presenceMask) != 0) {
1513 if ((currentPresenceField & presenceMask) != 0) {
1518 if ((currentPresenceField & presenceMask) != 0) {
1519 size += CodedOutputStream.computeSFixed32Size(
number, 0);
1523 if ((currentPresenceField & presenceMask) != 0) {
1524 size += CodedOutputStream.computeSFixed64Size(
number, 0);
1528 if ((currentPresenceField & presenceMask) != 0) {
1533 if ((currentPresenceField & presenceMask) != 0) {
1538 if ((currentPresenceField & presenceMask) != 0) {
1540 CodedOutputStream.computeGroupSize(
1543 getMessageFieldSchema(
i));
1548 SchemaUtil.computeSizeFixed64List(
1553 SchemaUtil.computeSizeFixed32List(
1558 SchemaUtil.computeSizeInt64List(
1563 SchemaUtil.computeSizeUInt64List(
1568 SchemaUtil.computeSizeInt32List(
1573 SchemaUtil.computeSizeFixed64List(
1578 SchemaUtil.computeSizeFixed32List(
1583 SchemaUtil.computeSizeBoolList(
1592 SchemaUtil.computeSizeMessageList(
1597 SchemaUtil.computeSizeByteStringList(
1602 SchemaUtil.computeSizeUInt32List(
1607 SchemaUtil.computeSizeEnumList(
1612 SchemaUtil.computeSizeFixed32List(
1617 SchemaUtil.computeSizeFixed64List(
1622 SchemaUtil.computeSizeSInt32List(
1627 SchemaUtil.computeSizeSInt64List(
1633 SchemaUtil.computeSizeFixed64ListNoTag(
1635 if (fieldSize > 0) {
1636 if (useCachedSizeField) {
1637 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1640 CodedOutputStream.computeTagSize(
number)
1641 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1649 SchemaUtil.computeSizeFixed32ListNoTag(
1651 if (fieldSize > 0) {
1652 if (useCachedSizeField) {
1653 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1656 CodedOutputStream.computeTagSize(
number)
1657 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1665 SchemaUtil.computeSizeInt64ListNoTag(
1667 if (fieldSize > 0) {
1668 if (useCachedSizeField) {
1669 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1672 CodedOutputStream.computeTagSize(
number)
1673 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1681 SchemaUtil.computeSizeUInt64ListNoTag(
1683 if (fieldSize > 0) {
1684 if (useCachedSizeField) {
1685 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1688 CodedOutputStream.computeTagSize(
number)
1689 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1697 SchemaUtil.computeSizeInt32ListNoTag(
1699 if (fieldSize > 0) {
1700 if (useCachedSizeField) {
1701 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1704 CodedOutputStream.computeTagSize(
number)
1705 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1713 SchemaUtil.computeSizeFixed64ListNoTag(
1715 if (fieldSize > 0) {
1716 if (useCachedSizeField) {
1717 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1720 CodedOutputStream.computeTagSize(
number)
1721 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1729 SchemaUtil.computeSizeFixed32ListNoTag(
1731 if (fieldSize > 0) {
1732 if (useCachedSizeField) {
1733 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1736 CodedOutputStream.computeTagSize(
number)
1737 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1745 SchemaUtil.computeSizeBoolListNoTag(
1747 if (fieldSize > 0) {
1748 if (useCachedSizeField) {
1749 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1752 CodedOutputStream.computeTagSize(
number)
1753 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1761 SchemaUtil.computeSizeUInt32ListNoTag(
1763 if (fieldSize > 0) {
1764 if (useCachedSizeField) {
1765 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1768 CodedOutputStream.computeTagSize(
number)
1769 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1777 SchemaUtil.computeSizeEnumListNoTag(
1779 if (fieldSize > 0) {
1780 if (useCachedSizeField) {
1781 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1784 CodedOutputStream.computeTagSize(
number)
1785 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1793 SchemaUtil.computeSizeFixed32ListNoTag(
1795 if (fieldSize > 0) {
1796 if (useCachedSizeField) {
1797 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1800 CodedOutputStream.computeTagSize(
number)
1801 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1809 SchemaUtil.computeSizeFixed64ListNoTag(
1811 if (fieldSize > 0) {
1812 if (useCachedSizeField) {
1813 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1816 CodedOutputStream.computeTagSize(
number)
1817 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1825 SchemaUtil.computeSizeSInt32ListNoTag(
1827 if (fieldSize > 0) {
1828 if (useCachedSizeField) {
1829 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1832 CodedOutputStream.computeTagSize(
number)
1833 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1841 SchemaUtil.computeSizeSInt64ListNoTag(
1843 if (fieldSize > 0) {
1844 if (useCachedSizeField) {
1845 unsafe.putInt(
message, (
long) presenceMaskAndOffset, fieldSize);
1848 CodedOutputStream.computeTagSize(
number)
1849 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
1856 SchemaUtil.computeSizeGroupList(
1859 getMessageFieldSchema(
i));
1864 mapFieldSchema.getSerializedSize(
1869 size += CodedOutputStream.computeDoubleSize(
number, 0);
1874 size += CodedOutputStream.computeFloatSize(
number, 0);
1894 size += CodedOutputStream.computeFixed64Size(
number, 0);
1899 size += CodedOutputStream.computeFixed32Size(
number, 0);
1904 size += CodedOutputStream.computeBoolSize(
number,
true);
1910 if (
value instanceof ByteString) {
1911 size += CodedOutputStream.computeBytesSize(
number, (ByteString)
value);
1920 size += SchemaUtil.computeSizeMessage(
number,
value, getMessageFieldSchema(
i));
1926 CodedOutputStream.computeBytesSize(
1942 size += CodedOutputStream.computeSFixed32Size(
number, 0);
1947 size += CodedOutputStream.computeSFixed64Size(
number, 0);
1963 CodedOutputStream.computeGroupSize(
1966 getMessageFieldSchema(
i));
1974 size += getUnknownFieldsSerializedSize(unknownFieldSchema,
message);
1976 if (hasExtensions) {
1977 size += extensionSchema.getExtensions(
message).getSerializedSize();
1983 private int getSerializedSizeProto3(
T message) {
1984 final sun.misc.Unsafe unsafe = UNSAFE;
1987 final int typeAndOffset = typeAndOffsetAt(
i);
1988 final int fieldType =
type(typeAndOffset);
1989 final int number = numberAt(
i);
1992 final int cachedSizeOffset =
1993 fieldType >=
FieldType.DOUBLE_LIST_PACKED.id()
1994 && fieldType <=
FieldType.SINT64_LIST_PACKED.id()
1998 switch (fieldType) {
2001 size += CodedOutputStream.computeDoubleSize(
number, 0);
2006 size += CodedOutputStream.computeFloatSize(
number, 0);
2027 size += CodedOutputStream.computeFixed64Size(
number, 0);
2032 size += CodedOutputStream.computeFixed32Size(
number, 0);
2037 size += CodedOutputStream.computeBoolSize(
number,
true);
2043 if (
value instanceof ByteString) {
2044 size += CodedOutputStream.computeBytesSize(
number, (ByteString)
value);
2053 size += SchemaUtil.computeSizeMessage(
number,
value, getMessageFieldSchema(
i));
2074 size += CodedOutputStream.computeSFixed32Size(
number, 0);
2079 size += CodedOutputStream.computeSFixed64Size(
number, 0);
2096 CodedOutputStream.computeGroupSize(
2099 getMessageFieldSchema(
i));
2118 SchemaUtil.computeSizeInt32List(
2135 SchemaUtil.computeSizeMessageList(
2140 SchemaUtil.computeSizeByteStringList(
2145 SchemaUtil.computeSizeUInt32List(
2150 SchemaUtil.computeSizeEnumList(
2161 SchemaUtil.computeSizeSInt32List(
2171 SchemaUtil.computeSizeFixed64ListNoTag(
2173 if (fieldSize > 0) {
2174 if (useCachedSizeField) {
2175 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2178 CodedOutputStream.computeTagSize(
number)
2179 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2187 SchemaUtil.computeSizeFixed32ListNoTag(
2189 if (fieldSize > 0) {
2190 if (useCachedSizeField) {
2191 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2194 CodedOutputStream.computeTagSize(
number)
2195 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2203 SchemaUtil.computeSizeInt64ListNoTag(
2205 if (fieldSize > 0) {
2206 if (useCachedSizeField) {
2207 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2210 CodedOutputStream.computeTagSize(
number)
2211 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2219 SchemaUtil.computeSizeUInt64ListNoTag(
2221 if (fieldSize > 0) {
2222 if (useCachedSizeField) {
2223 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2226 CodedOutputStream.computeTagSize(
number)
2227 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2235 SchemaUtil.computeSizeInt32ListNoTag(
2237 if (fieldSize > 0) {
2238 if (useCachedSizeField) {
2239 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2242 CodedOutputStream.computeTagSize(
number)
2243 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2251 SchemaUtil.computeSizeFixed64ListNoTag(
2253 if (fieldSize > 0) {
2254 if (useCachedSizeField) {
2255 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2258 CodedOutputStream.computeTagSize(
number)
2259 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2267 SchemaUtil.computeSizeFixed32ListNoTag(
2269 if (fieldSize > 0) {
2270 if (useCachedSizeField) {
2271 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2274 CodedOutputStream.computeTagSize(
number)
2275 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2283 SchemaUtil.computeSizeBoolListNoTag(
2285 if (fieldSize > 0) {
2286 if (useCachedSizeField) {
2287 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2290 CodedOutputStream.computeTagSize(
number)
2291 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2299 SchemaUtil.computeSizeUInt32ListNoTag(
2301 if (fieldSize > 0) {
2302 if (useCachedSizeField) {
2303 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2306 CodedOutputStream.computeTagSize(
number)
2307 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2315 SchemaUtil.computeSizeEnumListNoTag(
2317 if (fieldSize > 0) {
2318 if (useCachedSizeField) {
2319 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2322 CodedOutputStream.computeTagSize(
number)
2323 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2331 SchemaUtil.computeSizeFixed32ListNoTag(
2333 if (fieldSize > 0) {
2334 if (useCachedSizeField) {
2335 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2338 CodedOutputStream.computeTagSize(
number)
2339 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2347 SchemaUtil.computeSizeFixed64ListNoTag(
2349 if (fieldSize > 0) {
2350 if (useCachedSizeField) {
2351 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2354 CodedOutputStream.computeTagSize(
number)
2355 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2363 SchemaUtil.computeSizeSInt32ListNoTag(
2365 if (fieldSize > 0) {
2366 if (useCachedSizeField) {
2367 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2370 CodedOutputStream.computeTagSize(
number)
2371 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2379 SchemaUtil.computeSizeSInt64ListNoTag(
2381 if (fieldSize > 0) {
2382 if (useCachedSizeField) {
2383 unsafe.putInt(
message, (
long) cachedSizeOffset, fieldSize);
2386 CodedOutputStream.computeTagSize(
number)
2387 + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
2394 SchemaUtil.computeSizeGroupList(
2400 mapFieldSchema.getSerializedSize(
2405 size += CodedOutputStream.computeDoubleSize(
number, 0);
2410 size += CodedOutputStream.computeFloatSize(
number, 0);
2430 size += CodedOutputStream.computeFixed64Size(
number, 0);
2435 size += CodedOutputStream.computeFixed32Size(
number, 0);
2440 size += CodedOutputStream.computeBoolSize(
number,
true);
2446 if (
value instanceof ByteString) {
2447 size += CodedOutputStream.computeBytesSize(
number, (ByteString)
value);
2456 size += SchemaUtil.computeSizeMessage(
number,
value, getMessageFieldSchema(
i));
2462 CodedOutputStream.computeBytesSize(
2478 size += CodedOutputStream.computeSFixed32Size(
number, 0);
2483 size += CodedOutputStream.computeSFixed64Size(
number, 0);
2499 CodedOutputStream.computeGroupSize(
2502 getMessageFieldSchema(
i));
2510 size += getUnknownFieldsSerializedSize(unknownFieldSchema,
message);
2515 private <UT, UB>
int getUnknownFieldsSerializedSize(
2516 UnknownFieldSchema<UT, UB> schema,
T message) {
2517 UT unknowns = schema.getFromMessage(
message);
2518 return schema.getSerializedSize(unknowns);
2521 private static List<?> listAt(Object
message,
long offset) {
2525 @SuppressWarnings(
"unchecked")
2530 public void writeTo(
T message, Writer writer)
throws IOException {
2531 if (writer.fieldOrder() == Writer.FieldOrder.DESCENDING) {
2532 writeFieldsInDescendingOrder(
message, writer);
2535 writeFieldsInAscendingOrderProto3(
message, writer);
2537 writeFieldsInAscendingOrderProto2(
message, writer);
2542 @SuppressWarnings(
"unchecked")
2543 private
void writeFieldsInAscendingOrderProto2(
T message, Writer writer) throws IOException {
2544 Iterator<? extends
Map.Entry<?, ?>> extensionIterator =
null;
2545 Map.Entry nextExtension =
null;
2546 if (hasExtensions) {
2547 FieldSet<?> extensions = extensionSchema.getExtensions(
message);
2548 if (!extensions.isEmpty()) {
2549 extensionIterator = extensions.iterator();
2550 nextExtension = extensionIterator.next();
2553 int currentPresenceFieldOffset = -1;
2554 int currentPresenceField = 0;
2556 final sun.misc.Unsafe unsafe = UNSAFE;
2557 for (
int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
2558 final int typeAndOffset = typeAndOffsetAt(pos);
2559 final int number = numberAt(pos);
2560 final int fieldType =
type(typeAndOffset);
2562 int presenceMaskAndOffset = 0;
2563 int presenceMask = 0;
2564 if (!proto3 && fieldType <= 17) {
2565 presenceMaskAndOffset =
buffer[pos + 2];
2566 final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
2567 if (presenceFieldOffset != currentPresenceFieldOffset) {
2568 currentPresenceFieldOffset = presenceFieldOffset;
2569 currentPresenceField = unsafe.getInt(
message, (
long) presenceFieldOffset);
2571 presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
2575 while (nextExtension !=
null && extensionSchema.extensionNumber(nextExtension) <=
number) {
2576 extensionSchema.serializeExtension(writer, nextExtension);
2577 nextExtension = extensionIterator.hasNext() ? extensionIterator.next() :
null;
2581 switch (fieldType) {
2583 if ((currentPresenceField & presenceMask) != 0) {
2588 if ((currentPresenceField & presenceMask) != 0) {
2593 if ((currentPresenceField & presenceMask) != 0) {
2598 if ((currentPresenceField & presenceMask) != 0) {
2603 if ((currentPresenceField & presenceMask) != 0) {
2608 if ((currentPresenceField & presenceMask) != 0) {
2613 if ((currentPresenceField & presenceMask) != 0) {
2618 if ((currentPresenceField & presenceMask) != 0) {
2623 if ((currentPresenceField & presenceMask) != 0) {
2628 if ((currentPresenceField & presenceMask) != 0) {
2630 writer.writeMessage(
number,
value, getMessageFieldSchema(pos));
2634 if ((currentPresenceField & presenceMask) != 0) {
2639 if ((currentPresenceField & presenceMask) != 0) {
2644 if ((currentPresenceField & presenceMask) != 0) {
2649 if ((currentPresenceField & presenceMask) != 0) {
2654 if ((currentPresenceField & presenceMask) != 0) {
2659 if ((currentPresenceField & presenceMask) != 0) {
2664 if ((currentPresenceField & presenceMask) != 0) {
2669 if ((currentPresenceField & presenceMask) != 0) {
2675 SchemaUtil.writeDoubleList(
2676 numberAt(pos), (List<Double>) unsafe.getObject(
message,
offset), writer,
false);
2679 SchemaUtil.writeFloatList(
2680 numberAt(pos), (List<Float>) unsafe.getObject(
message,
offset), writer,
false);
2683 SchemaUtil.writeInt64List(
2684 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
false);
2687 SchemaUtil.writeUInt64List(
2688 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
false);
2691 SchemaUtil.writeInt32List(
2692 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
false);
2695 SchemaUtil.writeFixed64List(
2696 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
false);
2699 SchemaUtil.writeFixed32List(
2700 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
false);
2703 SchemaUtil.writeBoolList(
2704 numberAt(pos), (List<Boolean>) unsafe.getObject(
message,
offset), writer,
false);
2707 SchemaUtil.writeStringList(
2708 numberAt(pos), (List<String>) unsafe.getObject(
message,
offset), writer);
2711 SchemaUtil.writeMessageList(
2715 getMessageFieldSchema(pos));
2718 SchemaUtil.writeBytesList(
2719 numberAt(pos), (List<ByteString>) unsafe.getObject(
message,
offset), writer);
2722 SchemaUtil.writeUInt32List(
2723 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
false);
2726 SchemaUtil.writeEnumList(
2727 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
false);
2730 SchemaUtil.writeSFixed32List(
2731 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
false);
2734 SchemaUtil.writeSFixed64List(
2735 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
false);
2738 SchemaUtil.writeSInt32List(
2739 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
false);
2742 SchemaUtil.writeSInt64List(
2743 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
false);
2747 SchemaUtil.writeDoubleList(
2748 numberAt(pos), (List<Double>) unsafe.getObject(
message,
offset), writer,
true);
2751 SchemaUtil.writeFloatList(
2752 numberAt(pos), (List<Float>) unsafe.getObject(
message,
offset), writer,
true);
2755 SchemaUtil.writeInt64List(
2756 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
true);
2759 SchemaUtil.writeUInt64List(
2760 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
true);
2763 SchemaUtil.writeInt32List(
2764 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
true);
2767 SchemaUtil.writeFixed64List(
2768 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
true);
2771 SchemaUtil.writeFixed32List(
2772 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
true);
2776 SchemaUtil.writeBoolList(
2777 numberAt(pos), (List<Boolean>) unsafe.getObject(
message,
offset), writer,
true);
2780 SchemaUtil.writeUInt32List(
2781 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
true);
2784 SchemaUtil.writeEnumList(
2785 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
true);
2788 SchemaUtil.writeSFixed32List(
2789 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
true);
2792 SchemaUtil.writeSFixed64List(
2793 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
true);
2796 SchemaUtil.writeSInt32List(
2797 numberAt(pos), (List<Integer>) unsafe.getObject(
message,
offset), writer,
true);
2800 SchemaUtil.writeSInt64List(
2801 numberAt(pos), (List<Long>) unsafe.getObject(
message,
offset), writer,
true);
2804 SchemaUtil.writeGroupList(
2808 getMessageFieldSchema(pos));
2862 writer.writeMessage(
number,
value, getMessageFieldSchema(pos));
2911 while (nextExtension !=
null) {
2912 extensionSchema.serializeExtension(writer, nextExtension);
2913 nextExtension = extensionIterator.hasNext() ? extensionIterator.next() :
null;
2915 writeUnknownInMessageTo(unknownFieldSchema,
message, writer);
2918 @SuppressWarnings(
"unchecked")
2919 private
void writeFieldsInAscendingOrderProto3(
T message, Writer writer) throws IOException {
2920 Iterator<? extends
Map.Entry<?, ?>> extensionIterator =
null;
2921 Map.Entry nextExtension =
null;
2922 if (hasExtensions) {
2923 FieldSet<?> extensions = extensionSchema.getExtensions(
message);
2924 if (!extensions.isEmpty()) {
2925 extensionIterator = extensions.iterator();
2926 nextExtension = extensionIterator.next();
2931 for (
int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
2932 final int typeAndOffset = typeAndOffsetAt(pos);
2933 final int number = numberAt(pos);
2936 while (nextExtension !=
null && extensionSchema.extensionNumber(nextExtension) <=
number) {
2937 extensionSchema.serializeExtension(writer, nextExtension);
2938 nextExtension = extensionIterator.hasNext() ? extensionIterator.next() :
null;
2941 switch (
type(typeAndOffset)) {
2943 if (isFieldPresent(
message, pos)) {
2948 if (isFieldPresent(
message, pos)) {
2953 if (isFieldPresent(
message, pos)) {
2958 if (isFieldPresent(
message, pos)) {
2963 if (isFieldPresent(
message, pos)) {
2968 if (isFieldPresent(
message, pos)) {
2973 if (isFieldPresent(
message, pos)) {
2978 if (isFieldPresent(
message, pos)) {
2983 if (isFieldPresent(
message, pos)) {
2988 if (isFieldPresent(
message, pos)) {
2990 writer.writeMessage(
number,
value, getMessageFieldSchema(pos));
2994 if (isFieldPresent(
message, pos)) {
3000 if (isFieldPresent(
message, pos)) {
3005 if (isFieldPresent(
message, pos)) {
3010 if (isFieldPresent(
message, pos)) {
3015 if (isFieldPresent(
message, pos)) {
3020 if (isFieldPresent(
message, pos)) {
3025 if (isFieldPresent(
message, pos)) {
3030 if (isFieldPresent(
message, pos)) {
3034 getMessageFieldSchema(pos));
3038 SchemaUtil.writeDoubleList(
3040 (List<Double>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3045 SchemaUtil.writeFloatList(
3047 (List<Float>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3052 SchemaUtil.writeInt64List(
3054 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3059 SchemaUtil.writeUInt64List(
3061 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3066 SchemaUtil.writeInt32List(
3068 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3073 SchemaUtil.writeFixed64List(
3075 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3080 SchemaUtil.writeFixed32List(
3082 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3087 SchemaUtil.writeBoolList(
3089 (List<Boolean>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3094 SchemaUtil.writeStringList(
3096 (List<String>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3100 SchemaUtil.writeMessageList(
3102 (List<?>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3104 getMessageFieldSchema(pos));
3107 SchemaUtil.writeBytesList(
3109 (List<ByteString>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3113 SchemaUtil.writeUInt32List(
3115 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3120 SchemaUtil.writeEnumList(
3122 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3127 SchemaUtil.writeSFixed32List(
3129 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3134 SchemaUtil.writeSFixed64List(
3136 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3141 SchemaUtil.writeSInt32List(
3143 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3148 SchemaUtil.writeSInt64List(
3150 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3156 SchemaUtil.writeDoubleList(
3158 (List<Double>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3163 SchemaUtil.writeFloatList(
3165 (List<Float>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3170 SchemaUtil.writeInt64List(
3172 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3177 SchemaUtil.writeUInt64List(
3179 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3184 SchemaUtil.writeInt32List(
3186 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3191 SchemaUtil.writeFixed64List(
3193 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3198 SchemaUtil.writeFixed32List(
3200 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3206 SchemaUtil.writeBoolList(
3208 (List<Boolean>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3213 SchemaUtil.writeUInt32List(
3215 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3220 SchemaUtil.writeEnumList(
3222 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3227 SchemaUtil.writeSFixed32List(
3229 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3234 SchemaUtil.writeSFixed64List(
3236 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3241 SchemaUtil.writeSInt32List(
3243 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3248 SchemaUtil.writeSInt64List(
3250 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3255 SchemaUtil.writeGroupList(
3257 (List<?>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3259 getMessageFieldSchema(pos));
3263 writeMapHelper(writer,
number, UnsafeUtil.getObject(
message,
offset(typeAndOffset)), pos);
3313 writer.writeMessage(
number,
value, getMessageFieldSchema(pos));
3357 getMessageFieldSchema(pos));
3365 while (nextExtension !=
null) {
3366 extensionSchema.serializeExtension(writer, nextExtension);
3367 nextExtension = extensionIterator.hasNext() ? extensionIterator.next() :
null;
3369 writeUnknownInMessageTo(unknownFieldSchema,
message, writer);
3372 @SuppressWarnings(
"unchecked")
3373 private
void writeFieldsInDescendingOrder(
T message, Writer writer) throws IOException {
3374 writeUnknownInMessageTo(unknownFieldSchema,
message, writer);
3376 Iterator<? extends
Map.Entry<?, ?>> extensionIterator =
null;
3377 Map.Entry nextExtension =
null;
3378 if (hasExtensions) {
3379 FieldSet<?> extensions = extensionSchema.getExtensions(
message);
3380 if (!extensions.isEmpty()) {
3381 extensionIterator = extensions.descendingIterator();
3382 nextExtension = extensionIterator.next();
3386 for (
int pos =
buffer.
length - INTS_PER_FIELD; pos >= 0; pos -= INTS_PER_FIELD) {
3387 final int typeAndOffset = typeAndOffsetAt(pos);
3388 final int number = numberAt(pos);
3391 while (nextExtension !=
null && extensionSchema.extensionNumber(nextExtension) >
number) {
3392 extensionSchema.serializeExtension(writer, nextExtension);
3393 nextExtension = extensionIterator.hasNext() ? extensionIterator.next() :
null;
3396 switch (
type(typeAndOffset)) {
3398 if (isFieldPresent(
message, pos)) {
3403 if (isFieldPresent(
message, pos)) {
3408 if (isFieldPresent(
message, pos)) {
3413 if (isFieldPresent(
message, pos)) {
3418 if (isFieldPresent(
message, pos)) {
3423 if (isFieldPresent(
message, pos)) {
3428 if (isFieldPresent(
message, pos)) {
3433 if (isFieldPresent(
message, pos)) {
3438 if (isFieldPresent(
message, pos)) {
3443 if (isFieldPresent(
message, pos)) {
3445 writer.writeMessage(
number,
value, getMessageFieldSchema(pos));
3449 if (isFieldPresent(
message, pos)) {
3455 if (isFieldPresent(
message, pos)) {
3460 if (isFieldPresent(
message, pos)) {
3465 if (isFieldPresent(
message, pos)) {
3470 if (isFieldPresent(
message, pos)) {
3475 if (isFieldPresent(
message, pos)) {
3480 if (isFieldPresent(
message, pos)) {
3485 if (isFieldPresent(
message, pos)) {
3489 getMessageFieldSchema(pos));
3493 SchemaUtil.writeDoubleList(
3495 (List<Double>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3500 SchemaUtil.writeFloatList(
3502 (List<Float>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3507 SchemaUtil.writeInt64List(
3509 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3514 SchemaUtil.writeUInt64List(
3516 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3521 SchemaUtil.writeInt32List(
3523 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3528 SchemaUtil.writeFixed64List(
3530 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3535 SchemaUtil.writeFixed32List(
3537 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3542 SchemaUtil.writeBoolList(
3544 (List<Boolean>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3549 SchemaUtil.writeStringList(
3551 (List<String>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3555 SchemaUtil.writeMessageList(
3557 (List<?>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3559 getMessageFieldSchema(pos));
3562 SchemaUtil.writeBytesList(
3564 (List<ByteString>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3568 SchemaUtil.writeUInt32List(
3570 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3575 SchemaUtil.writeEnumList(
3577 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3582 SchemaUtil.writeSFixed32List(
3584 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3589 SchemaUtil.writeSFixed64List(
3591 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3596 SchemaUtil.writeSInt32List(
3598 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3603 SchemaUtil.writeSInt64List(
3605 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3610 SchemaUtil.writeDoubleList(
3612 (List<Double>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3617 SchemaUtil.writeFloatList(
3619 (List<Float>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3624 SchemaUtil.writeInt64List(
3626 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3631 SchemaUtil.writeUInt64List(
3633 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3638 SchemaUtil.writeInt32List(
3640 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3645 SchemaUtil.writeFixed64List(
3647 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3652 SchemaUtil.writeFixed32List(
3654 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3660 SchemaUtil.writeBoolList(
3662 (List<Boolean>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3667 SchemaUtil.writeUInt32List(
3669 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3674 SchemaUtil.writeEnumList(
3676 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3681 SchemaUtil.writeSFixed32List(
3683 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3688 SchemaUtil.writeSFixed64List(
3690 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3695 SchemaUtil.writeSInt32List(
3697 (List<Integer>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3702 SchemaUtil.writeSInt64List(
3704 (List<Long>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3709 SchemaUtil.writeGroupList(
3711 (List<?>) UnsafeUtil.getObject(
message,
offset(typeAndOffset)),
3713 getMessageFieldSchema(pos));
3717 writeMapHelper(writer,
number, UnsafeUtil.getObject(
message,
offset(typeAndOffset)), pos);
3767 writer.writeMessage(
number,
value, getMessageFieldSchema(pos));
3811 getMessageFieldSchema(pos));
3818 while (nextExtension !=
null) {
3819 extensionSchema.serializeExtension(writer, nextExtension);
3820 nextExtension = extensionIterator.hasNext() ? extensionIterator.next() :
null;
3824 @SuppressWarnings(
"unchecked")
3825 private <
K, V>
void writeMapHelper(Writer writer,
int number, Object mapField,
int pos)
3826 throws IOException {
3827 if (mapField !=
null) {
3830 (MapEntryLite.Metadata<
K, V>) mapFieldSchema.forMapMetadata(getMapFieldDefaultEntry(pos)),
3831 (
Map<K, V>) mapFieldSchema.forMapData(mapField));
3835 private <UT, UB>
void writeUnknownInMessageTo(
3836 UnknownFieldSchema<UT, UB> schema,
T message, Writer writer)
throws IOException {
3837 schema.writeTo(schema.getFromMessage(
message), writer);
3841 public void mergeFrom(
T message, Reader reader, ExtensionRegistryLite extensionRegistry)
3842 throws IOException {
3843 if (extensionRegistry ==
null) {
3844 throw new NullPointerException();
3846 mergeFromHelper(unknownFieldSchema, extensionSchema,
message, reader, extensionRegistry);
3853 private <UT, UB, ET extends FieldDescriptorLite<ET>>
void mergeFromHelper(
3854 UnknownFieldSchema<UT, UB> unknownFieldSchema,
3855 ExtensionSchema<ET> extensionSchema,
3858 ExtensionRegistryLite extensionRegistry)
3859 throws IOException {
3860 UB unknownFields =
null;
3861 FieldSet<ET> extensions =
null;
3864 final int number = reader.getFieldNumber();
3865 final int pos = positionForFieldNumber(
number);
3867 if (
number == Reader.READ_DONE) {
3874 : extensionSchema.findExtensionByNumber(
3875 extensionRegistry, defaultInstance,
number);
3877 if (extensions ==
null) {
3878 extensions = extensionSchema.getMutableExtensions(
message);
3881 extensionSchema.parseExtension(
3887 unknownFieldSchema);
3890 if (unknownFieldSchema.shouldDiscardUnknownFields(reader)) {
3891 if (reader.skipField()) {
3895 if (unknownFields ==
null) {
3896 unknownFields = unknownFieldSchema.getBuilderFromMessage(
message);
3899 if (unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader)) {
3906 final int typeAndOffset = typeAndOffsetAt(pos);
3909 switch (
type(typeAndOffset)) {
3911 UnsafeUtil.putDouble(
message,
offset(typeAndOffset), reader.readDouble());
3912 setFieldPresent(
message, pos);
3915 UnsafeUtil.putFloat(
message,
offset(typeAndOffset), reader.readFloat());
3916 setFieldPresent(
message, pos);
3919 UnsafeUtil.putLong(
message,
offset(typeAndOffset), reader.readInt64());
3920 setFieldPresent(
message, pos);
3923 UnsafeUtil.putLong(
message,
offset(typeAndOffset), reader.readUInt64());
3924 setFieldPresent(
message, pos);
3927 UnsafeUtil.putInt(
message,
offset(typeAndOffset), reader.readInt32());
3928 setFieldPresent(
message, pos);
3931 UnsafeUtil.putLong(
message,
offset(typeAndOffset), reader.readFixed64());
3932 setFieldPresent(
message, pos);
3935 UnsafeUtil.putInt(
message,
offset(typeAndOffset), reader.readFixed32());
3936 setFieldPresent(
message, pos);
3939 UnsafeUtil.putBoolean(
message,
offset(typeAndOffset), reader.readBool());
3940 setFieldPresent(
message, pos);
3943 readString(
message, typeAndOffset, reader);
3944 setFieldPresent(
message, pos);
3948 if (isFieldPresent(
message, pos)) {
3949 Object mergedResult =
3950 Internal.mergeMessage(
3952 reader.readMessageBySchemaWithCheck(
3953 (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
3954 UnsafeUtil.putObject(
message,
offset(typeAndOffset), mergedResult);
3956 UnsafeUtil.putObject(
3959 reader.readMessageBySchemaWithCheck(
3960 (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
3961 setFieldPresent(
message, pos);
3966 UnsafeUtil.putObject(
message,
offset(typeAndOffset), reader.readBytes());
3967 setFieldPresent(
message, pos);
3970 UnsafeUtil.putInt(
message,
offset(typeAndOffset), reader.readUInt32());
3971 setFieldPresent(
message, pos);
3975 int enumValue = reader.readEnum();
3976 EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
3977 if (enumVerifier ==
null || enumVerifier.isInRange(enumValue)) {
3978 UnsafeUtil.putInt(
message,
offset(typeAndOffset), enumValue);
3979 setFieldPresent(
message, pos);
3982 SchemaUtil.storeUnknownEnum(
3983 number, enumValue, unknownFields, unknownFieldSchema);
3988 UnsafeUtil.putInt(
message,
offset(typeAndOffset), reader.readSFixed32());
3989 setFieldPresent(
message, pos);
3992 UnsafeUtil.putLong(
message,
offset(typeAndOffset), reader.readSFixed64());
3993 setFieldPresent(
message, pos);
3996 UnsafeUtil.putInt(
message,
offset(typeAndOffset), reader.readSInt32());
3997 setFieldPresent(
message, pos);
4000 UnsafeUtil.putLong(
message,
offset(typeAndOffset), reader.readSInt64());
4001 setFieldPresent(
message, pos);
4005 if (isFieldPresent(
message, pos)) {
4006 Object mergedResult =
4007 Internal.mergeMessage(
4009 reader.readGroupBySchemaWithCheck(
4010 (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
4011 UnsafeUtil.putObject(
message,
offset(typeAndOffset), mergedResult);
4013 UnsafeUtil.putObject(
4016 reader.readGroupBySchemaWithCheck(
4017 (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
4018 setFieldPresent(
message, pos);
4023 reader.readDoubleList(
4027 reader.readFloatList(
4031 reader.readInt64List(
4032 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4035 reader.readUInt64List(
4036 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4039 reader.readInt32List(
4040 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4043 reader.readFixed64List(
4044 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4047 reader.readFixed32List(
4048 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4051 reader.readBoolList(
4052 listFieldSchema.<Boolean>mutableListAt(
message,
offset(typeAndOffset)));
4055 readStringList(
message, typeAndOffset, reader);
4063 (Schema<T>) getMessageFieldSchema(pos),
4068 reader.readBytesList(
4069 listFieldSchema.<ByteString>mutableListAt(
message,
offset(typeAndOffset)));
4072 reader.readUInt32List(
4073 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4077 List<Integer> enumList =
4078 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset));
4079 reader.readEnumList(enumList);
4081 SchemaUtil.filterUnknownEnumList(
4084 getEnumFieldVerifier(pos),
4086 unknownFieldSchema);
4090 reader.readSFixed32List(
4091 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4094 reader.readSFixed64List(
4095 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4098 reader.readSInt32List(
4099 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4102 reader.readSInt64List(
4103 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4106 reader.readDoubleList(
4110 reader.readFloatList(
4114 reader.readInt64List(
4115 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4118 reader.readUInt64List(
4119 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4122 reader.readInt32List(
4123 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4126 reader.readFixed64List(
4127 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4130 reader.readFixed32List(
4131 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4134 reader.readBoolList(
4135 listFieldSchema.<Boolean>mutableListAt(
message,
offset(typeAndOffset)));
4138 reader.readUInt32List(
4139 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4143 List<Integer> enumList =
4144 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset));
4145 reader.readEnumList(enumList);
4147 SchemaUtil.filterUnknownEnumList(
4150 getEnumFieldVerifier(pos),
4152 unknownFieldSchema);
4156 reader.readSFixed32List(
4157 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4160 reader.readSFixed64List(
4161 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4164 reader.readSInt32List(
4165 listFieldSchema.<Integer>mutableListAt(
message,
offset(typeAndOffset)));
4168 reader.readSInt64List(
4169 listFieldSchema.<Long>mutableListAt(
message,
offset(typeAndOffset)));
4177 (Schema<T>) getMessageFieldSchema(pos),
4182 mergeMap(
message, pos, getMapFieldDefaultEntry(pos), extensionRegistry, reader);
4185 UnsafeUtil.putObject(
4190 UnsafeUtil.putObject(
4195 UnsafeUtil.putObject(
4196 message,
offset(typeAndOffset), Long.valueOf(reader.readInt64()));
4200 UnsafeUtil.putObject(
4201 message,
offset(typeAndOffset), Long.valueOf(reader.readUInt64()));
4205 UnsafeUtil.putObject(
4206 message,
offset(typeAndOffset), Integer.valueOf(reader.readInt32()));
4210 UnsafeUtil.putObject(
4211 message,
offset(typeAndOffset), Long.valueOf(reader.readFixed64()));
4215 UnsafeUtil.putObject(
4216 message,
offset(typeAndOffset), Integer.valueOf(reader.readFixed32()));
4220 UnsafeUtil.putObject(
4221 message,
offset(typeAndOffset), Boolean.valueOf(reader.readBool()));
4225 readString(
message, typeAndOffset, reader);
4230 Object mergedResult =
4231 Internal.mergeMessage(
4233 reader.readMessageBySchemaWithCheck(
4234 getMessageFieldSchema(pos), extensionRegistry));
4235 UnsafeUtil.putObject(
message,
offset(typeAndOffset), mergedResult);
4237 UnsafeUtil.putObject(
4240 reader.readMessageBySchemaWithCheck(
4241 getMessageFieldSchema(pos), extensionRegistry));
4242 setFieldPresent(
message, pos);
4247 UnsafeUtil.putObject(
message,
offset(typeAndOffset), reader.readBytes());
4251 UnsafeUtil.putObject(
4252 message,
offset(typeAndOffset), Integer.valueOf(reader.readUInt32()));
4257 int enumValue = reader.readEnum();
4258 EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
4259 if (enumVerifier ==
null || enumVerifier.isInRange(enumValue)) {
4260 UnsafeUtil.putObject(
message,
offset(typeAndOffset), enumValue);
4264 SchemaUtil.storeUnknownEnum(
4265 number, enumValue, unknownFields, unknownFieldSchema);
4270 UnsafeUtil.putObject(
4271 message,
offset(typeAndOffset), Integer.valueOf(reader.readSFixed32()));
4275 UnsafeUtil.putObject(
4276 message,
offset(typeAndOffset), Long.valueOf(reader.readSFixed64()));
4280 UnsafeUtil.putObject(
4281 message,
offset(typeAndOffset), Integer.valueOf(reader.readSInt32()));
4285 UnsafeUtil.putObject(
4286 message,
offset(typeAndOffset), Long.valueOf(reader.readSInt64()));
4290 UnsafeUtil.putObject(
4293 reader.readGroupBySchemaWithCheck(getMessageFieldSchema(pos), extensionRegistry));
4298 if (unknownFields ==
null) {
4299 unknownFields = unknownFieldSchema.newBuilder();
4301 if (!unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader)) {
4306 }
catch (InvalidProtocolBufferException.InvalidWireTypeException e) {
4309 if (unknownFieldSchema.shouldDiscardUnknownFields(reader)) {
4310 if (!reader.skipField()) {
4314 if (unknownFields ==
null) {
4315 unknownFields = unknownFieldSchema.getBuilderFromMessage(
message);
4317 if (!unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader)) {
4324 for (
int i = checkInitializedCount;
i < repeatedFieldOffsetStart;
i++) {
4326 filterMapUnknownEnumValues(
message, intArray[
i], unknownFields, unknownFieldSchema);
4328 if (unknownFields !=
null) {
4329 unknownFieldSchema.setBuilderToMessage(
message, unknownFields);
4334 @SuppressWarnings(
"ReferenceEquality")
4335 static UnknownFieldSetLite getMutableUnknownFields(Object
message) {
4336 UnknownFieldSetLite unknownFields = ((GeneratedMessageLite)
message).unknownFields;
4337 if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
4338 unknownFields = UnknownFieldSetLite.newInstance();
4339 ((GeneratedMessageLite)
message).unknownFields = unknownFields;
4341 return unknownFields;
4345 private int decodeMapEntryValue(
4349 WireFormat.FieldType fieldType,
4350 Class<?> messageType,
4351 Registers registers)
4352 throws IOException {
4353 switch (fieldType) {
4356 registers.object1 = registers.long1 != 0;
4383 registers.object1 = registers.int1;
4388 registers.object1 = registers.long1;
4393 Protobuf.getInstance().schemaFor(messageType),
data,
position, limit, registers);
4397 registers.object1 = CodedInputStream.decodeZigZag32(registers.int1);
4401 registers.object1 = CodedInputStream.decodeZigZag64(registers.long1);
4407 throw new RuntimeException(
"unsupported field type.");
4413 private <K, V>
int decodeMapEntry(
4419 Registers registers)
4420 throws IOException {
4422 final int length = registers.int1;
4424 throw InvalidProtocolBufferException.truncatedMessage();
4433 tag = registers.int1;
4435 final int fieldNumber = tag >>> 3;
4436 final int wireType = tag & 0x7;
4437 switch (fieldNumber) {
4439 if (wireType ==
metadata.keyType.getWireType()) {
4442 key = (
K) registers.object1;
4447 if (wireType ==
metadata.valueType.getWireType()) {
4449 decodeMapEntryValue(
4456 value = (V) registers.object1;
4466 throw InvalidProtocolBufferException.parseFailure();
4472 @SuppressWarnings(
"ReferenceEquality")
4473 private
int parseRepeatedField(
4485 Registers registers)
4486 throws IOException {
4487 ProtobufList<?> list = (ProtobufList<?>) UNSAFE.getObject(
message, fieldOffset);
4488 if (!list.isModifiable()) {
4489 final int size = list.size();
4491 list.mutableCopyWithCapacity(
4492 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
4493 UNSAFE.putObject(
message, fieldOffset, list);
4495 switch (fieldType) {
4498 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4500 }
else if (wireType == WireFormat.WIRETYPE_FIXED64) {
4506 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4508 }
else if (wireType == WireFormat.WIRETYPE_FIXED32) {
4516 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4518 }
else if (wireType == WireFormat.WIRETYPE_VARINT) {
4526 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4528 }
else if (wireType == WireFormat.WIRETYPE_VARINT) {
4536 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4538 }
else if (wireType == WireFormat.WIRETYPE_FIXED64) {
4546 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4548 }
else if (wireType == WireFormat.WIRETYPE_FIXED32) {
4554 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4556 }
else if (wireType == WireFormat.WIRETYPE_VARINT) {
4561 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4562 if ((typeAndOffset & ENFORCE_UTF8_MASK) == 0) {
4570 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4573 getMessageFieldSchema(bufferPosition),
4583 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4589 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4591 }
else if (wireType == WireFormat.WIRETYPE_VARINT) {
4596 UnknownFieldSetLite unknownFields = ((GeneratedMessageLite)
message).unknownFields;
4597 if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
4602 unknownFields =
null;
4605 SchemaUtil.filterUnknownEnumList(
4607 (ProtobufList<Integer>) list,
4608 getEnumFieldVerifier(bufferPosition),
4610 (UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema);
4611 if (unknownFields !=
null) {
4612 ((GeneratedMessageLite)
message).unknownFields = unknownFields;
4617 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4619 }
else if (wireType == WireFormat.WIRETYPE_VARINT) {
4625 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4627 }
else if (wireType == WireFormat.WIRETYPE_VARINT) {
4632 if (wireType == WireFormat.WIRETYPE_START_GROUP) {
4635 getMessageFieldSchema(bufferPosition),
4650 private <K, V>
int parseMapField(
4657 Registers registers)
4658 throws IOException {
4659 final sun.misc.Unsafe unsafe = UNSAFE;
4660 Object mapDefaultEntry = getMapFieldDefaultEntry(bufferPosition);
4661 Object mapField = unsafe.getObject(
message, fieldOffset);
4662 if (mapFieldSchema.isImmutable(mapField)) {
4663 Object oldMapField = mapField;
4664 mapField = mapFieldSchema.newMapField(mapDefaultEntry);
4665 mapFieldSchema.mergeFrom(mapField, oldMapField);
4666 unsafe.putObject(
message, fieldOffset, mapField);
4668 return decodeMapEntry(
4672 (Metadata<K, V>) mapFieldSchema.forMapMetadata(mapDefaultEntry),
4673 (
Map<K, V>) mapFieldSchema.forMutableMapData(mapField),
4677 private int parseOneofField(
4689 Registers registers)
4690 throws IOException {
4691 final sun.misc.Unsafe unsafe = UNSAFE;
4692 final long oneofCaseOffset =
buffer[bufferPosition + 2] & OFFSET_MASK;
4693 switch (fieldType) {
4695 if (wireType == WireFormat.WIRETYPE_FIXED64) {
4702 if (wireType == WireFormat.WIRETYPE_FIXED32) {
4710 if (wireType == WireFormat.WIRETYPE_VARINT) {
4712 unsafe.putObject(
message, fieldOffset, registers.long1);
4718 if (wireType == WireFormat.WIRETYPE_VARINT) {
4720 unsafe.putObject(
message, fieldOffset, registers.int1);
4726 if (wireType == WireFormat.WIRETYPE_FIXED64) {
4734 if (wireType == WireFormat.WIRETYPE_FIXED32) {
4741 if (wireType == WireFormat.WIRETYPE_VARINT) {
4743 unsafe.putObject(
message, fieldOffset, registers.long1 != 0);
4748 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4750 final int length = registers.int1;
4752 unsafe.putObject(
message, fieldOffset,
"");
4754 if ((typeAndOffset & ENFORCE_UTF8_MASK) != 0
4756 throw InvalidProtocolBufferException.invalidUtf8();
4766 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4769 getMessageFieldSchema(bufferPosition),
data,
position, limit, registers);
4770 final Object oldValue =
4772 ? unsafe.getObject(
message, fieldOffset)
4774 if (oldValue ==
null) {
4775 unsafe.putObject(
message, fieldOffset, registers.object1);
4778 message, fieldOffset, Internal.mergeMessage(oldValue, registers.object1));
4784 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4786 unsafe.putObject(
message, fieldOffset, registers.object1);
4791 if (wireType == WireFormat.WIRETYPE_VARINT) {
4793 final int enumValue = registers.int1;
4794 EnumVerifier enumVerifier = getEnumFieldVerifier(bufferPosition);
4795 if (enumVerifier ==
null || enumVerifier.isInRange(enumValue)) {
4796 unsafe.putObject(
message, fieldOffset, enumValue);
4800 getMutableUnknownFields(
message).storeField(tag, (
long) enumValue);
4805 if (wireType == WireFormat.WIRETYPE_VARINT) {
4807 unsafe.putObject(
message, fieldOffset, CodedInputStream.decodeZigZag32(registers.int1));
4812 if (wireType == WireFormat.WIRETYPE_VARINT) {
4814 unsafe.putObject(
message, fieldOffset, CodedInputStream.decodeZigZag64(registers.long1));
4819 if (wireType == WireFormat.WIRETYPE_START_GROUP) {
4820 final int endTag = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
4823 getMessageFieldSchema(bufferPosition),
data,
position, limit, endTag, registers);
4824 final Object oldValue =
4826 ? unsafe.getObject(
message, fieldOffset)
4828 if (oldValue ==
null) {
4829 unsafe.putObject(
message, fieldOffset, registers.object1);
4832 message, fieldOffset, Internal.mergeMessage(oldValue, registers.object1));
4843 private Schema getMessageFieldSchema(
int pos) {
4844 final int index = pos / INTS_PER_FIELD * 2;
4845 Schema schema = (Schema) objects[
index];
4846 if (schema !=
null) {
4849 schema = Protobuf.getInstance().schemaFor((Class) objects[
index + 1]);
4850 objects[
index] = schema;
4854 private Object getMapFieldDefaultEntry(
int pos) {
4855 return objects[pos / INTS_PER_FIELD * 2];
4858 private EnumVerifier getEnumFieldVerifier(
int pos) {
4859 return (EnumVerifier) objects[pos / INTS_PER_FIELD * 2 + 1];
4868 int parseProto2Message(
4870 throws IOException {
4871 final sun.misc.Unsafe unsafe = UNSAFE;
4872 int currentPresenceFieldOffset = -1;
4873 int currentPresenceField = 0;
4881 tag = registers.int1;
4883 final int number = tag >>> 3;
4884 final int wireType = tag & 0x7;
4885 if (
number > oldNumber) {
4886 pos = positionForFieldNumber(
number, pos / INTS_PER_FIELD);
4888 pos = positionForFieldNumber(
number);
4895 final int typeAndOffset =
buffer[pos + 1];
4896 final int fieldType =
type(typeAndOffset);
4897 final long fieldOffset =
offset(typeAndOffset);
4898 if (fieldType <= 17) {
4900 final int presenceMaskAndOffset =
buffer[pos + 2];
4901 final int presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
4902 final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
4905 if (presenceFieldOffset != currentPresenceFieldOffset) {
4906 if (currentPresenceFieldOffset != -1) {
4907 unsafe.putInt(
message, (
long) currentPresenceFieldOffset, currentPresenceField);
4909 currentPresenceFieldOffset = presenceFieldOffset;
4910 currentPresenceField = unsafe.getInt(
message, (
long) presenceFieldOffset);
4912 switch (fieldType) {
4914 if (wireType == WireFormat.WIRETYPE_FIXED64) {
4917 currentPresenceField |= presenceMask;
4922 if (wireType == WireFormat.WIRETYPE_FIXED32) {
4925 currentPresenceField |= presenceMask;
4931 if (wireType == WireFormat.WIRETYPE_VARINT) {
4933 unsafe.putLong(
message, fieldOffset, registers.long1);
4934 currentPresenceField |= presenceMask;
4940 if (wireType == WireFormat.WIRETYPE_VARINT) {
4942 unsafe.putInt(
message, fieldOffset, registers.int1);
4943 currentPresenceField |= presenceMask;
4949 if (wireType == WireFormat.WIRETYPE_FIXED64) {
4952 currentPresenceField |= presenceMask;
4958 if (wireType == WireFormat.WIRETYPE_FIXED32) {
4961 currentPresenceField |= presenceMask;
4966 if (wireType == WireFormat.WIRETYPE_VARINT) {
4968 UnsafeUtil.putBoolean(
message, fieldOffset, registers.long1 != 0);
4969 currentPresenceField |= presenceMask;
4974 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4975 if ((typeAndOffset & ENFORCE_UTF8_MASK) == 0) {
4980 unsafe.putObject(
message, fieldOffset, registers.object1);
4981 currentPresenceField |= presenceMask;
4986 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
4989 getMessageFieldSchema(pos),
data,
position, limit, registers);
4990 if ((currentPresenceField & presenceMask) == 0) {
4991 unsafe.putObject(
message, fieldOffset, registers.object1);
4996 Internal.mergeMessage(
4997 unsafe.getObject(
message, fieldOffset), registers.object1));
4999 currentPresenceField |= presenceMask;
5004 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5006 unsafe.putObject(
message, fieldOffset, registers.object1);
5007 currentPresenceField |= presenceMask;
5012 if (wireType == WireFormat.WIRETYPE_VARINT) {
5014 final int enumValue = registers.int1;
5015 EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
5016 if (enumVerifier ==
null || enumVerifier.isInRange(enumValue)) {
5017 unsafe.putInt(
message, fieldOffset, enumValue);
5018 currentPresenceField |= presenceMask;
5021 getMutableUnknownFields(
message).storeField(tag, (
long) enumValue);
5027 if (wireType == WireFormat.WIRETYPE_VARINT) {
5030 message, fieldOffset, CodedInputStream.decodeZigZag32(registers.int1));
5031 currentPresenceField |= presenceMask;
5036 if (wireType == WireFormat.WIRETYPE_VARINT) {
5039 message, fieldOffset, CodedInputStream.decodeZigZag64(registers.long1));
5041 currentPresenceField |= presenceMask;
5046 if (wireType == WireFormat.WIRETYPE_START_GROUP) {
5047 final int endTag = (
number << 3) | WireFormat.WIRETYPE_END_GROUP;
5050 getMessageFieldSchema(pos),
data,
position, limit, endTag, registers);
5051 if ((currentPresenceField & presenceMask) == 0) {
5052 unsafe.putObject(
message, fieldOffset, registers.object1);
5057 Internal.mergeMessage(
5058 unsafe.getObject(
message, fieldOffset), registers.object1));
5061 currentPresenceField |= presenceMask;
5068 }
else if (fieldType == 27) {
5070 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5071 ProtobufList<?> list = (ProtobufList<?>) unsafe.getObject(
message, fieldOffset);
5072 if (!list.isModifiable()) {
5073 final int size = list.size();
5075 list.mutableCopyWithCapacity(
5076 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
5077 unsafe.putObject(
message, fieldOffset, list);
5081 getMessageFieldSchema(pos), tag,
data,
position, limit, list, registers);
5084 }
else if (fieldType <= 49) {
5104 }
else if (fieldType == 50) {
5105 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5133 if (tag == endGroup && endGroup != 0) {
5138 && registers.extensionRegistry != ExtensionRegistryLite.getEmptyRegistry()) {
5139 position = decodeExtensionOrUnknownField(
5141 (UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema,
5148 if (currentPresenceFieldOffset != -1) {
5149 unsafe.putInt(
message, (
long) currentPresenceFieldOffset, currentPresenceField);
5151 UnknownFieldSetLite unknownFields =
null;
5152 for (
int i = checkInitializedCount;
i < repeatedFieldOffsetStart;
i++) {
5154 filterMapUnknownEnumValues(
5158 (UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema);
5160 if (unknownFields !=
null) {
5161 ((UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema)
5162 .setBuilderToMessage(
message, unknownFields);
5164 if (endGroup == 0) {
5166 throw InvalidProtocolBufferException.parseFailure();
5169 if (
position > limit || tag != endGroup) {
5170 throw InvalidProtocolBufferException.parseFailure();
5177 private int parseProto3Message(
5179 final sun.misc.Unsafe unsafe = UNSAFE;
5187 tag = registers.int1;
5189 final int number = tag >>> 3;
5190 final int wireType = tag & 0x7;
5191 if (
number > oldNumber) {
5192 pos = positionForFieldNumber(
number, pos / INTS_PER_FIELD);
5194 pos = positionForFieldNumber(
number);
5201 final int typeAndOffset =
buffer[pos + 1];
5202 final int fieldType =
type(typeAndOffset);
5203 final long fieldOffset =
offset(typeAndOffset);
5204 if (fieldType <= 17) {
5205 switch (fieldType) {
5207 if (wireType == WireFormat.WIRETYPE_FIXED64) {
5214 if (wireType == WireFormat.WIRETYPE_FIXED32) {
5222 if (wireType == WireFormat.WIRETYPE_VARINT) {
5224 unsafe.putLong(
message, fieldOffset, registers.long1);
5230 if (wireType == WireFormat.WIRETYPE_VARINT) {
5232 unsafe.putInt(
message, fieldOffset, registers.int1);
5238 if (wireType == WireFormat.WIRETYPE_FIXED64) {
5246 if (wireType == WireFormat.WIRETYPE_FIXED32) {
5253 if (wireType == WireFormat.WIRETYPE_VARINT) {
5255 UnsafeUtil.putBoolean(
message, fieldOffset, registers.long1 != 0);
5260 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5261 if ((typeAndOffset & ENFORCE_UTF8_MASK) == 0) {
5266 unsafe.putObject(
message, fieldOffset, registers.object1);
5271 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5274 getMessageFieldSchema(pos),
data,
position, limit, registers);
5275 final Object oldValue = unsafe.getObject(
message, fieldOffset);
5276 if (oldValue ==
null) {
5277 unsafe.putObject(
message, fieldOffset, registers.object1);
5280 message, fieldOffset, Internal.mergeMessage(oldValue, registers.object1));
5286 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5288 unsafe.putObject(
message, fieldOffset, registers.object1);
5293 if (wireType == WireFormat.WIRETYPE_VARINT) {
5295 unsafe.putInt(
message, fieldOffset, registers.int1);
5300 if (wireType == WireFormat.WIRETYPE_VARINT) {
5303 message, fieldOffset, CodedInputStream.decodeZigZag32(registers.int1));
5308 if (wireType == WireFormat.WIRETYPE_VARINT) {
5311 message, fieldOffset, CodedInputStream.decodeZigZag64(registers.long1));
5318 }
else if (fieldType == 27) {
5320 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5321 ProtobufList<?> list = (ProtobufList<?>) unsafe.getObject(
message, fieldOffset);
5322 if (!list.isModifiable()) {
5323 final int size = list.size();
5325 list.mutableCopyWithCapacity(
5326 size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY :
size * 2);
5327 unsafe.putObject(
message, fieldOffset, list);
5331 getMessageFieldSchema(pos), tag,
data,
position, limit, list, registers);
5334 }
else if (fieldType <= 49) {
5354 }
else if (fieldType == 50) {
5355 if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
5387 throw InvalidProtocolBufferException.parseFailure();
5394 throws IOException {
5403 public void makeImmutable(
T message) {
5405 for (
int i = checkInitializedCount;
i < repeatedFieldOffsetStart;
i++) {
5408 if (mapField ==
null) {
5411 UnsafeUtil.putObject(
message,
offset, mapFieldSchema.toImmutable(mapField));
5413 final int length = intArray.length;
5414 for (
int i = repeatedFieldOffsetStart;
i <
length;
i++) {
5415 listFieldSchema.makeImmutableListAt(
message, intArray[
i]);
5417 unknownFieldSchema.makeImmutable(
message);
5418 if (hasExtensions) {
5419 extensionSchema.makeImmutable(
message);
5423 @SuppressWarnings(
"unchecked")
5424 private final <
K, V>
void mergeMap(
5427 Object mapDefaultEntry,
5428 ExtensionRegistryLite extensionRegistry,
5430 throws IOException {
5437 if (mapField ==
null) {
5438 mapField = mapFieldSchema.newMapField(mapDefaultEntry);
5440 }
else if (mapFieldSchema.isImmutable(mapField)) {
5441 Object oldMapField = mapField;
5442 mapField = mapFieldSchema.newMapField(mapDefaultEntry);
5443 mapFieldSchema.mergeFrom(mapField, oldMapField);
5447 (
Map<K, V>) mapFieldSchema.forMutableMapData(mapField),
5448 (Metadata<K, V>) mapFieldSchema.forMapMetadata(mapDefaultEntry),
5452 private final <UT, UB> UB filterMapUnknownEnumValues(
5453 Object
message,
int pos, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema) {
5454 int fieldNumber = numberAt(pos);
5457 if (mapField ==
null) {
5458 return unknownFields;
5460 EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
5461 if (enumVerifier ==
null) {
5462 return unknownFields;
5464 Map<?, ?> mapData = mapFieldSchema.forMutableMapData(mapField);
5467 filterUnknownEnumMap(
5468 pos, fieldNumber, mapData, enumVerifier, unknownFields, unknownFieldSchema);
5469 return unknownFields;
5472 @SuppressWarnings(
"unchecked")
5473 private final <
K, V, UT, UB> UB filterUnknownEnumMap(
5477 EnumVerifier enumVerifier,
5479 UnknownFieldSchema<UT, UB> unknownFieldSchema) {
5481 (Metadata<K, V>) mapFieldSchema.forMapMetadata(getMapFieldDefaultEntry(pos));
5482 for (Iterator<
Map.Entry<
K, V>>
it = mapData.entrySet().iterator();
it.hasNext(); ) {
5483 Map.Entry<
K, V> entry =
it.next();
5484 if (!enumVerifier.isInRange((Integer) entry.getValue())) {
5485 if (unknownFields ==
null) {
5486 unknownFields = unknownFieldSchema.newBuilder();
5489 MapEntryLite.computeSerializedSize(
metadata, entry.getKey(), entry.getValue());
5490 CodedBuilder codedBuilder = ByteString.newCodedBuilder(entrySize);
5491 CodedOutputStream codedOutput = codedBuilder.getCodedOutput();
5493 MapEntryLite.writeTo(codedOutput,
metadata, entry.getKey(), entry.getValue());
5494 }
catch (IOException e) {
5496 throw new RuntimeException(e);
5498 unknownFieldSchema.addLengthDelimited(unknownFields,
number, codedBuilder.build());
5502 return unknownFields;
5507 int currentPresenceFieldOffset = -1;
5508 int currentPresenceField = 0;
5509 for (
int i = 0;
i < checkInitializedCount;
i++) {
5510 final int pos = intArray[
i];
5511 final int number = numberAt(pos);
5513 final int typeAndOffset = typeAndOffsetAt(pos);
5515 int presenceMaskAndOffset = 0;
5516 int presenceMask = 0;
5518 presenceMaskAndOffset =
buffer[pos + 2];
5519 final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
5520 presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
5521 if (presenceFieldOffset != currentPresenceFieldOffset) {
5522 currentPresenceFieldOffset = presenceFieldOffset;
5523 currentPresenceField = UNSAFE.getInt(
message, (
long) presenceFieldOffset);
5527 if (isRequired(typeAndOffset)) {
5528 if (!isFieldPresent(
message, pos, currentPresenceField, presenceMask)) {
5536 switch (
type(typeAndOffset)) {
5539 if (isFieldPresent(
message, pos, currentPresenceField, presenceMask)
5546 if (!isListInitialized(
message, typeAndOffset, pos)) {
5558 if (!isMapInitialized(
message, typeAndOffset, pos)) {
5567 if (hasExtensions) {
5568 if (!extensionSchema.getExtensions(
message).isInitialized()) {
5577 Object nested = UnsafeUtil.getObject(
message,
offset(typeAndOffset));
5578 return schema.isInitialized(nested);
5581 private <N>
boolean isListInitialized(Object
message,
int typeAndOffset,
int pos) {
5582 @SuppressWarnings(
"unchecked")
5583 List<N> list = (List<N>) UnsafeUtil.getObject(
message,
offset(typeAndOffset));
5584 if (list.isEmpty()) {
5588 Schema schema = getMessageFieldSchema(pos);
5589 for (
int i = 0;
i < list.size();
i++) {
5590 N nested = list.get(
i);
5591 if (!schema.isInitialized(nested)) {
5598 private boolean isMapInitialized(
T message,
int typeAndOffset,
int pos) {
5600 if (
map.isEmpty()) {
5603 Object mapDefaultEntry = getMapFieldDefaultEntry(pos);
5604 MapEntryLite.Metadata<?, ?>
metadata = mapFieldSchema.forMapMetadata(mapDefaultEntry);
5605 if (
metadata.valueType.getJavaType() != WireFormat.JavaType.MESSAGE) {
5609 Schema schema =
null;
5610 for (Object nested :
map.values()) {
5611 if (schema ==
null) {
5612 schema = Protobuf.getInstance().schemaFor(nested.getClass());
5614 if (!schema.isInitialized(nested)) {
5621 private void writeString(
int fieldNumber, Object
value, Writer writer)
throws IOException {
5622 if (
value instanceof String) {
5623 writer.writeString(fieldNumber, (String)
value);
5625 writer.writeBytes(fieldNumber, (ByteString)
value);
5629 private void readString(Object
message,
int typeAndOffset, Reader reader)
throws IOException {
5630 if (isEnforceUtf8(typeAndOffset)) {
5632 UnsafeUtil.putObject(
message,
offset(typeAndOffset), reader.readStringRequireUtf8());
5636 UnsafeUtil.putObject(
message,
offset(typeAndOffset), reader.readString());
5640 UnsafeUtil.putObject(
message,
offset(typeAndOffset), reader.readBytes());
5644 private void readStringList(Object
message,
int typeAndOffset, Reader reader)
throws IOException {
5645 if (isEnforceUtf8(typeAndOffset)) {
5646 reader.readStringListRequireUtf8(
5647 listFieldSchema.<String>mutableListAt(
message,
offset(typeAndOffset)));
5649 reader.readStringList(listFieldSchema.<String>mutableListAt(
message,
offset(typeAndOffset)));
5653 private <E>
void readMessageList(
5658 ExtensionRegistryLite extensionRegistry)
5659 throws IOException {
5661 reader.readMessageList(
5662 listFieldSchema.<E>mutableListAt(
message,
offset), schema, extensionRegistry);
5665 private <E>
void readGroupList(
5670 ExtensionRegistryLite extensionRegistry)
5671 throws IOException {
5672 reader.readGroupList(
5673 listFieldSchema.<E>mutableListAt(
message,
offset), schema, extensionRegistry);
5676 private int numberAt(
int pos) {
5680 private int typeAndOffsetAt(
int pos) {
5684 private int presenceMaskAndOffsetAt(
int pos) {
5689 return (
value & FIELD_TYPE_MASK) >>> OFFSET_BITS;
5692 private static boolean isRequired(
int value) {
5693 return (
value & REQUIRED_MASK) != 0;
5696 private static boolean isEnforceUtf8(
int value) {
5697 return (
value & ENFORCE_UTF8_MASK) != 0;
5701 return value & OFFSET_MASK;
5724 private static <T>
double oneofDoubleAt(
T message,
long offset) {
5733 return ((Integer) UnsafeUtil.getObject(
message,
offset)).intValue();
5737 return ((Long) UnsafeUtil.getObject(
message,
offset)).longValue();
5740 private static <T>
boolean oneofBooleanAt(
T message,
long offset) {
5741 return ((Boolean) UnsafeUtil.getObject(
message,
offset)).booleanValue();
5745 private boolean arePresentForEquals(
T message,
T other,
int pos) {
5746 return isFieldPresent(
message, pos) == isFieldPresent(other, pos);
5749 private boolean isFieldPresent(
T message,
int pos,
int presenceField,
int presenceMask) {
5751 return isFieldPresent(
message, pos);
5753 return (presenceField & presenceMask) != 0;
5757 private boolean isFieldPresent(
T message,
int pos) {
5759 final int typeAndOffset = typeAndOffsetAt(pos);
5761 switch (
type(typeAndOffset)) {
5780 if (
value instanceof String) {
5781 return !((String)
value).isEmpty();
5782 }
else if (
value instanceof ByteString) {
5783 return !ByteString.EMPTY.equals(
value);
5785 throw new IllegalArgumentException();
5790 return !ByteString.EMPTY.equals(UnsafeUtil.getObject(
message,
offset));
5806 throw new IllegalArgumentException();
5809 int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
5810 final int presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
5811 return (UnsafeUtil.getInt(
message, presenceMaskAndOffset & OFFSET_MASK) & presenceMask) != 0;
5815 private void setFieldPresent(
T message,
int pos) {
5820 int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
5821 final int presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
5822 final long presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
5825 presenceFieldOffset,
5826 UnsafeUtil.getInt(
message, presenceFieldOffset) | presenceMask);
5829 private boolean isOneofPresent(
T message,
int fieldNumber,
int pos) {
5830 int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
5831 return UnsafeUtil.getInt(
message, presenceMaskAndOffset & OFFSET_MASK) == fieldNumber;
5834 private boolean isOneofCaseEqual(
T message,
T other,
int pos) {
5835 int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
5836 return UnsafeUtil.getInt(
message, presenceMaskAndOffset & OFFSET_MASK)
5837 == UnsafeUtil.getInt(other, presenceMaskAndOffset & OFFSET_MASK);
5840 private void setOneofPresent(
T message,
int fieldNumber,
int pos) {
5841 int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
5842 UnsafeUtil.putInt(
message, presenceMaskAndOffset & OFFSET_MASK, fieldNumber);
5845 private int positionForFieldNumber(
final int number) {
5846 if (
number >= minFieldNumber &&
number <= maxFieldNumber) {
5847 return slowPositionForFieldNumber(
number, 0);
5852 private int positionForFieldNumber(
final int number,
final int min) {
5853 if (
number >= minFieldNumber &&
number <= maxFieldNumber) {
5854 return slowPositionForFieldNumber(
number, min);
5859 private int slowPositionForFieldNumber(
final int number,
int min) {
5861 while (min <= max) {
5863 final int mid = (max + min) >>> 1;
5864 final int pos = mid * INTS_PER_FIELD;
5865 final int midFieldNumber = numberAt(pos);
5866 if (
number == midFieldNumber) {
5870 if (
number < midFieldNumber) {
5881 int getSchemaSize() {