Index: third_party/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java |
=================================================================== |
--- third_party/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java (revision 216642) |
+++ third_party/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java (working copy) |
@@ -55,6 +55,29 @@ |
protected GeneratedMessageLite(Builder builder) { |
} |
+ public Parser<? extends MessageLite> getParserForType() { |
+ throw new UnsupportedOperationException( |
+ "This is supposed to be overridden by subclasses."); |
+ } |
+ |
+ /** |
+ * Called by subclasses to parse an unknown field. |
+ * @return {@code true} unless the tag is an end-group tag. |
+ */ |
+ protected boolean parseUnknownField( |
+ CodedInputStream input, |
+ ExtensionRegistryLite extensionRegistry, |
+ int tag) throws IOException { |
+ return input.skipField(tag); |
+ } |
+ |
+ /** |
+ * Used by parsing constructors in generated classes. |
+ */ |
+ protected void makeExtensionsImmutable() { |
+ // Noop for messages without extensions. |
+ } |
+ |
@SuppressWarnings("unchecked") |
public abstract static class Builder<MessageType extends GeneratedMessageLite, |
BuilderType extends Builder> |
@@ -86,9 +109,9 @@ |
* @return {@code true} unless the tag is an end-group tag. |
*/ |
protected boolean parseUnknownField( |
- final CodedInputStream input, |
- final ExtensionRegistryLite extensionRegistry, |
- final int tag) throws IOException { |
+ CodedInputStream input, |
+ ExtensionRegistryLite extensionRegistry, |
+ int tag) throws IOException { |
return input.skipField(tag); |
} |
} |
@@ -194,6 +217,31 @@ |
} |
/** |
+ * Called by subclasses to parse an unknown field or an extension. |
+ * @return {@code true} unless the tag is an end-group tag. |
+ */ |
+ @Override |
+ protected boolean parseUnknownField( |
+ CodedInputStream input, |
+ ExtensionRegistryLite extensionRegistry, |
+ int tag) throws IOException { |
+ return GeneratedMessageLite.parseUnknownField( |
+ extensions, |
+ getDefaultInstanceForType(), |
+ input, |
+ extensionRegistry, |
+ tag); |
+ } |
+ |
+ /** |
+ * Used by parsing constructors in generated classes. |
+ */ |
+ @Override |
+ protected void makeExtensionsImmutable() { |
+ extensions.makeImmutable(); |
+ } |
+ |
+ /** |
* Used by subclasses to serialize extensions. Extension ranges may be |
* interleaved with field numbers, but we must write them in canonical |
* (sorted by field number) order. ExtensionWriter helps us write |
@@ -400,121 +448,139 @@ |
*/ |
@Override |
protected boolean parseUnknownField( |
- final CodedInputStream input, |
- final ExtensionRegistryLite extensionRegistry, |
- final int tag) throws IOException { |
- final int wireType = WireFormat.getTagWireType(tag); |
- final int fieldNumber = WireFormat.getTagFieldNumber(tag); |
+ CodedInputStream input, |
+ ExtensionRegistryLite extensionRegistry, |
+ int tag) throws IOException { |
+ ensureExtensionsIsMutable(); |
+ return GeneratedMessageLite.parseUnknownField( |
+ extensions, |
+ getDefaultInstanceForType(), |
+ input, |
+ extensionRegistry, |
+ tag); |
+ } |
- final GeneratedExtension<MessageType, ?> extension = |
- extensionRegistry.findLiteExtensionByNumber( |
- getDefaultInstanceForType(), fieldNumber); |
+ protected final void mergeExtensionFields(final MessageType other) { |
+ ensureExtensionsIsMutable(); |
+ extensions.mergeFrom(((ExtendableMessage) other).extensions); |
+ } |
+ } |
- boolean unknown = false; |
- boolean packed = false; |
- if (extension == null) { |
- unknown = true; // Unknown field. |
- } else if (wireType == FieldSet.getWireFormatForFieldType( |
- extension.descriptor.getLiteType(), |
- false /* isPacked */)) { |
- packed = false; // Normal, unpacked value. |
- } else if (extension.descriptor.isRepeated && |
- extension.descriptor.type.isPackable() && |
- wireType == FieldSet.getWireFormatForFieldType( |
- extension.descriptor.getLiteType(), |
- true /* isPacked */)) { |
- packed = true; // Packed value. |
- } else { |
- unknown = true; // Wrong wire type. |
- } |
+ // ----------------------------------------------------------------- |
- if (unknown) { // Unknown field or wrong wire type. Skip. |
- return input.skipField(tag); |
- } |
+ /** |
+ * Parse an unknown field or an extension. |
+ * @return {@code true} unless the tag is an end-group tag. |
+ */ |
+ private static <MessageType extends MessageLite> |
+ boolean parseUnknownField( |
+ FieldSet<ExtensionDescriptor> extensions, |
+ MessageType defaultInstance, |
+ CodedInputStream input, |
+ ExtensionRegistryLite extensionRegistry, |
+ int tag) throws IOException { |
+ int wireType = WireFormat.getTagWireType(tag); |
+ int fieldNumber = WireFormat.getTagFieldNumber(tag); |
- if (packed) { |
- final int length = input.readRawVarint32(); |
- final int limit = input.pushLimit(length); |
- if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) { |
- while (input.getBytesUntilLimit() > 0) { |
- final int rawValue = input.readEnum(); |
- final Object value = |
- extension.descriptor.getEnumType().findValueByNumber(rawValue); |
- if (value == null) { |
- // If the number isn't recognized as a valid value for this |
- // enum, drop it (don't even add it to unknownFields). |
- return true; |
- } |
- ensureExtensionsIsMutable(); |
- extensions.addRepeatedField(extension.descriptor, value); |
+ GeneratedExtension<MessageType, ?> extension = |
+ extensionRegistry.findLiteExtensionByNumber( |
+ defaultInstance, fieldNumber); |
+ |
+ boolean unknown = false; |
+ boolean packed = false; |
+ if (extension == null) { |
+ unknown = true; // Unknown field. |
+ } else if (wireType == FieldSet.getWireFormatForFieldType( |
+ extension.descriptor.getLiteType(), |
+ false /* isPacked */)) { |
+ packed = false; // Normal, unpacked value. |
+ } else if (extension.descriptor.isRepeated && |
+ extension.descriptor.type.isPackable() && |
+ wireType == FieldSet.getWireFormatForFieldType( |
+ extension.descriptor.getLiteType(), |
+ true /* isPacked */)) { |
+ packed = true; // Packed value. |
+ } else { |
+ unknown = true; // Wrong wire type. |
+ } |
+ |
+ if (unknown) { // Unknown field or wrong wire type. Skip. |
+ return input.skipField(tag); |
+ } |
+ |
+ if (packed) { |
+ int length = input.readRawVarint32(); |
+ int limit = input.pushLimit(length); |
+ if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) { |
+ while (input.getBytesUntilLimit() > 0) { |
+ int rawValue = input.readEnum(); |
+ Object value = |
+ extension.descriptor.getEnumType().findValueByNumber(rawValue); |
+ if (value == null) { |
+ // If the number isn't recognized as a valid value for this |
+ // enum, drop it (don't even add it to unknownFields). |
+ return true; |
} |
- } else { |
- while (input.getBytesUntilLimit() > 0) { |
- final Object value = |
- FieldSet.readPrimitiveField(input, |
- extension.descriptor.getLiteType()); |
- ensureExtensionsIsMutable(); |
- extensions.addRepeatedField(extension.descriptor, value); |
- } |
+ extensions.addRepeatedField(extension.descriptor, value); |
} |
- input.popLimit(limit); |
} else { |
- final Object value; |
- switch (extension.descriptor.getLiteJavaType()) { |
- case MESSAGE: { |
- MessageLite.Builder subBuilder = null; |
- if (!extension.descriptor.isRepeated()) { |
- MessageLite existingValue = |
- (MessageLite) extensions.getField(extension.descriptor); |
- if (existingValue != null) { |
- subBuilder = existingValue.toBuilder(); |
- } |
+ while (input.getBytesUntilLimit() > 0) { |
+ Object value = |
+ FieldSet.readPrimitiveField(input, |
+ extension.descriptor.getLiteType()); |
+ extensions.addRepeatedField(extension.descriptor, value); |
+ } |
+ } |
+ input.popLimit(limit); |
+ } else { |
+ Object value; |
+ switch (extension.descriptor.getLiteJavaType()) { |
+ case MESSAGE: { |
+ MessageLite.Builder subBuilder = null; |
+ if (!extension.descriptor.isRepeated()) { |
+ MessageLite existingValue = |
+ (MessageLite) extensions.getField(extension.descriptor); |
+ if (existingValue != null) { |
+ subBuilder = existingValue.toBuilder(); |
} |
- if (subBuilder == null) { |
- subBuilder = extension.messageDefaultInstance.newBuilderForType(); |
- } |
- if (extension.descriptor.getLiteType() == |
- WireFormat.FieldType.GROUP) { |
- input.readGroup(extension.getNumber(), |
- subBuilder, extensionRegistry); |
- } else { |
- input.readMessage(subBuilder, extensionRegistry); |
- } |
- value = subBuilder.build(); |
- break; |
} |
- case ENUM: |
- final int rawValue = input.readEnum(); |
- value = extension.descriptor.getEnumType() |
- .findValueByNumber(rawValue); |
- // If the number isn't recognized as a valid value for this enum, |
- // drop it. |
- if (value == null) { |
- return true; |
- } |
- break; |
- default: |
- value = FieldSet.readPrimitiveField(input, |
- extension.descriptor.getLiteType()); |
- break; |
+ if (subBuilder == null) { |
+ subBuilder = extension.messageDefaultInstance.newBuilderForType(); |
+ } |
+ if (extension.descriptor.getLiteType() == |
+ WireFormat.FieldType.GROUP) { |
+ input.readGroup(extension.getNumber(), |
+ subBuilder, extensionRegistry); |
+ } else { |
+ input.readMessage(subBuilder, extensionRegistry); |
+ } |
+ value = subBuilder.build(); |
+ break; |
} |
+ case ENUM: |
+ int rawValue = input.readEnum(); |
+ value = extension.descriptor.getEnumType() |
+ .findValueByNumber(rawValue); |
+ // If the number isn't recognized as a valid value for this enum, |
+ // drop it. |
+ if (value == null) { |
+ return true; |
+ } |
+ break; |
+ default: |
+ value = FieldSet.readPrimitiveField(input, |
+ extension.descriptor.getLiteType()); |
+ break; |
+ } |
- if (extension.descriptor.isRepeated()) { |
- ensureExtensionsIsMutable(); |
- extensions.addRepeatedField(extension.descriptor, value); |
- } else { |
- ensureExtensionsIsMutable(); |
- extensions.setField(extension.descriptor, value); |
- } |
+ if (extension.descriptor.isRepeated()) { |
+ extensions.addRepeatedField(extension.descriptor, value); |
+ } else { |
+ extensions.setField(extension.descriptor, value); |
} |
- |
- return true; |
} |
- protected final void mergeExtensionFields(final MessageType other) { |
- ensureExtensionsIsMutable(); |
- extensions.mergeFrom(((ExtendableMessage) other).extensions); |
- } |
+ return true; |
} |
// ----------------------------------------------------------------- |
@@ -722,7 +788,7 @@ |
/** |
* Replaces this object in the output stream with a serialized form. |
* Part of Java's serialization magic. Generated sub-classes must override |
- * this method by calling <code>return super.writeReplace();</code> |
+ * this method by calling {@code return super.writeReplace();} |
* @return a SerializedForm of this message |
*/ |
protected Object writeReplace() throws ObjectStreamException { |