Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java |
diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java |
index f885b01eba2f0343b8f372c6a513cd89bc7d72d9..c5adc5ad02050f93e9e94db97ecc7b9e70f1a37b 100644 |
--- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java |
+++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java |
@@ -39,6 +39,7 @@ import com.google.protobuf.Internal.IntList; |
import com.google.protobuf.Internal.LongList; |
import com.google.protobuf.Internal.ProtobufList; |
import com.google.protobuf.WireFormat.FieldType; |
+ |
import java.io.IOException; |
import java.io.InputStream; |
import java.io.ObjectStreamException; |
@@ -58,15 +59,15 @@ import java.util.Map; |
*/ |
public abstract class GeneratedMessageLite< |
MessageType extends GeneratedMessageLite<MessageType, BuilderType>, |
- BuilderType extends GeneratedMessageLite.Builder<MessageType, BuilderType>> |
+ BuilderType extends GeneratedMessageLite.Builder<MessageType, BuilderType>> |
extends AbstractMessageLite<MessageType, BuilderType> { |
/** For use by generated code only. Lazily initialized to reduce allocations. */ |
protected UnknownFieldSetLite unknownFields = UnknownFieldSetLite.getDefaultInstance(); |
- |
+ |
/** For use by generated code only. */ |
protected int memoizedSerializedSize = -1; |
- |
+ |
@Override |
@SuppressWarnings("unchecked") // Guaranteed by runtime. |
public final Parser<MessageType> getParserForType() { |
@@ -112,7 +113,7 @@ public abstract class GeneratedMessageLite< |
} |
return memoizedHashCode; |
} |
- |
+ |
@SuppressWarnings("unchecked") // Guaranteed by runtime |
int hashCode(HashCodeVisitor visitor) { |
if (memoizedHashCode == 0) { |
@@ -124,18 +125,18 @@ public abstract class GeneratedMessageLite< |
} |
return memoizedHashCode; |
} |
- |
+ |
@SuppressWarnings("unchecked") // Guaranteed by isInstance + runtime |
@Override |
public boolean equals(Object other) { |
if (this == other) { |
return true; |
} |
- |
+ |
if (!getDefaultInstanceForType().getClass().isInstance(other)) { |
return false; |
} |
- |
+ |
try { |
visit(EqualsVisitor.INSTANCE, (MessageType) other); |
} catch (NotEqualsException e) { |
@@ -143,7 +144,7 @@ public abstract class GeneratedMessageLite< |
} |
return true; |
} |
- |
+ |
/** |
* Same as {@link #equals(Object)} but throws {@code NotEqualsException}. |
*/ |
@@ -152,7 +153,7 @@ public abstract class GeneratedMessageLite< |
if (this == other) { |
return true; |
} |
- |
+ |
if (!getDefaultInstanceForType().getClass().isInstance(other)) { |
return false; |
} |
@@ -160,7 +161,7 @@ public abstract class GeneratedMessageLite< |
visit(visitor, (MessageType) other); |
return true; |
} |
- |
+ |
// The general strategy for unknown fields is to use an UnknownFieldSetLite that is treated as |
// mutable during the parsing constructor and immutable after. This allows us to avoid |
// any unnecessary intermediary allocations while reducing the generated code size. |
@@ -173,10 +174,10 @@ public abstract class GeneratedMessageLite< |
unknownFields = UnknownFieldSetLite.newInstance(); |
} |
} |
- |
+ |
/** |
* Called by subclasses to parse an unknown field. For use by generated code only. |
- * |
+ * |
* @return {@code true} unless the tag is an end-group tag. |
*/ |
protected boolean parseUnknownField(int tag, CodedInputStream input) throws IOException { |
@@ -184,7 +185,7 @@ public abstract class GeneratedMessageLite< |
if (WireFormat.getTagWireType(tag) == WireFormat.WIRETYPE_END_GROUP) { |
return false; |
} |
- |
+ |
ensureUnknownFieldsInitialized(); |
return unknownFields.mergeFieldFrom(tag, input); |
} |
@@ -196,7 +197,7 @@ public abstract class GeneratedMessageLite< |
ensureUnknownFieldsInitialized(); |
unknownFields.mergeVarintField(tag, value); |
} |
- |
+ |
/** |
* Called by subclasses to parse an unknown field. For use by generated code only. |
*/ |
@@ -204,7 +205,7 @@ public abstract class GeneratedMessageLite< |
ensureUnknownFieldsInitialized(); |
unknownFields.mergeLengthDelimitedField(fieldNumber, value); |
} |
- |
+ |
/** |
* Called by subclasses to complete parsing. For use by generated code only. |
*/ |
@@ -291,7 +292,7 @@ public abstract class GeneratedMessageLite< |
dynamicMethod(MethodToInvoke.VISIT, visitor, other); |
unknownFields = visitor.visitUnknownFields(unknownFields, other.unknownFields); |
} |
- |
+ |
/** |
* Merge some unknown fields into the {@link UnknownFieldSetLite} for this |
* message. |
@@ -358,9 +359,9 @@ public abstract class GeneratedMessageLite< |
if (isBuilt) { |
return instance; |
} |
- |
+ |
instance.makeImmutable(); |
- |
+ |
isBuilt = true; |
return instance; |
} |
@@ -373,24 +374,24 @@ public abstract class GeneratedMessageLite< |
} |
return result; |
} |
- |
+ |
@Override |
protected BuilderType internalMergeFrom(MessageType message) { |
return mergeFrom(message); |
} |
- |
+ |
/** All subclasses implement this. */ |
public BuilderType mergeFrom(MessageType message) { |
copyOnWrite(); |
instance.visit(MergeFromVisitor.INSTANCE, message); |
return (BuilderType) this; |
} |
- |
+ |
@Override |
public MessageType getDefaultInstanceForType() { |
return defaultInstance; |
} |
- |
+ |
@Override |
public BuilderType mergeFrom( |
com.google.protobuf.CodedInputStream input, |
@@ -465,12 +466,12 @@ public abstract class GeneratedMessageLite< |
super.visit(visitor, other); |
extensions = visitor.visitExtensions(extensions, other.extensions); |
} |
- |
+ |
/** |
* Parse an unknown field or an extension. For use by generated code only. |
- * |
+ * |
* <p>For use by generated code only. |
- * |
+ * |
* @return {@code true} unless the tag is an end-group tag. |
*/ |
protected <MessageType extends MessageLite> boolean parseUnknownField( |
@@ -478,6 +479,7 @@ public abstract class GeneratedMessageLite< |
CodedInputStream input, |
ExtensionRegistryLite extensionRegistry, |
int tag) throws IOException { |
+ int wireType = WireFormat.getTagWireType(tag); |
int fieldNumber = WireFormat.getTagFieldNumber(tag); |
// TODO(dweis): How much bytecode would be saved by not requiring the generated code to |
@@ -485,17 +487,6 @@ public abstract class GeneratedMessageLite< |
GeneratedExtension<MessageType, ?> extension = extensionRegistry.findLiteExtensionByNumber( |
defaultInstance, fieldNumber); |
- return parseExtension(input, extensionRegistry, extension, tag, fieldNumber); |
- } |
- |
- private boolean parseExtension( |
- CodedInputStream input, |
- ExtensionRegistryLite extensionRegistry, |
- GeneratedExtension<?, ?> extension, |
- int tag, |
- int fieldNumber) |
- throws IOException { |
- int wireType = WireFormat.getTagWireType(tag); |
boolean unknown = false; |
boolean packed = false; |
if (extension == null) { |
@@ -517,7 +508,7 @@ public abstract class GeneratedMessageLite< |
if (unknown) { // Unknown field or wrong wire type. Skip. |
return parseUnknownField(tag, input); |
} |
- |
+ |
if (packed) { |
int length = input.readRawVarint32(); |
int limit = input.pushLimit(length); |
@@ -596,148 +587,10 @@ public abstract class GeneratedMessageLite< |
extension.singularToFieldSetType(value)); |
} |
} |
+ |
return true; |
} |
- /** |
- * Parse an unknown field or an extension. For use by generated code only. |
- * |
- * <p>For use by generated code only. |
- * |
- * @return {@code true} unless the tag is an end-group tag. |
- */ |
- protected <MessageType extends MessageLite> boolean parseUnknownFieldAsMessageSet( |
- MessageType defaultInstance, |
- CodedInputStream input, |
- ExtensionRegistryLite extensionRegistry, |
- int tag) |
- throws IOException { |
- |
- if (tag == WireFormat.MESSAGE_SET_ITEM_TAG) { |
- mergeMessageSetExtensionFromCodedStream(defaultInstance, input, extensionRegistry); |
- return true; |
- } |
- |
- // TODO(dweis): Do we really want to support non message set wire format in message sets? |
- // Full runtime does... So we do for now. |
- int wireType = WireFormat.getTagWireType(tag); |
- if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) { |
- return parseUnknownField(defaultInstance, input, extensionRegistry, tag); |
- } else { |
- // TODO(dweis): Should we throw on invalid input? Full runtime does not... |
- return input.skipField(tag); |
- } |
- } |
- |
- /** |
- * Merges the message set from the input stream; requires message set wire format. |
- * |
- * @param defaultInstance the default instance of the containing message we are parsing in |
- * @param input the stream to parse from |
- * @param extensionRegistry the registry to use when parsing |
- */ |
- private <MessageType extends MessageLite> void mergeMessageSetExtensionFromCodedStream( |
- MessageType defaultInstance, |
- CodedInputStream input, |
- ExtensionRegistryLite extensionRegistry) |
- throws IOException { |
- // The wire format for MessageSet is: |
- // message MessageSet { |
- // repeated group Item = 1 { |
- // required int32 typeId = 2; |
- // required bytes message = 3; |
- // } |
- // } |
- // "typeId" is the extension's field number. The extension can only be |
- // a message type, where "message" contains the encoded bytes of that |
- // message. |
- // |
- // In practice, we will probably never see a MessageSet item in which |
- // the message appears before the type ID, or where either field does not |
- // appear exactly once. However, in theory such cases are valid, so we |
- // should be prepared to accept them. |
- |
- int typeId = 0; |
- ByteString rawBytes = null; // If we encounter "message" before "typeId" |
- GeneratedExtension<?, ?> extension = null; |
- |
- // Read bytes from input, if we get it's type first then parse it eagerly, |
- // otherwise we store the raw bytes in a local variable. |
- while (true) { |
- final int tag = input.readTag(); |
- if (tag == 0) { |
- break; |
- } |
- |
- if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) { |
- typeId = input.readUInt32(); |
- if (typeId != 0) { |
- extension = extensionRegistry.findLiteExtensionByNumber(defaultInstance, typeId); |
- } |
- |
- } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) { |
- if (typeId != 0) { |
- if (extension != null) { |
- // We already know the type, so we can parse directly from the |
- // input with no copying. Hooray! |
- eagerlyMergeMessageSetExtension(input, extension, extensionRegistry, typeId); |
- rawBytes = null; |
- continue; |
- } |
- } |
- // We haven't seen a type ID yet or we want parse message lazily. |
- rawBytes = input.readBytes(); |
- |
- } else { // Unknown tag. Skip it. |
- if (!input.skipField(tag)) { |
- break; // End of group |
- } |
- } |
- } |
- input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG); |
- |
- // Process the raw bytes. |
- if (rawBytes != null && typeId != 0) { // Zero is not a valid type ID. |
- if (extension != null) { // We known the type |
- mergeMessageSetExtensionFromBytes(rawBytes, extensionRegistry, extension); |
- } else { // We don't know how to parse this. Ignore it. |
- if (rawBytes != null) { |
- mergeLengthDelimitedField(typeId, rawBytes); |
- } |
- } |
- } |
- } |
- |
- private void eagerlyMergeMessageSetExtension( |
- CodedInputStream input, |
- GeneratedExtension<?, ?> extension, |
- ExtensionRegistryLite extensionRegistry, |
- int typeId) |
- throws IOException { |
- int fieldNumber = typeId; |
- int tag = WireFormat.makeTag(typeId, WireFormat.WIRETYPE_LENGTH_DELIMITED); |
- parseExtension(input, extensionRegistry, extension, tag, fieldNumber); |
- } |
- |
- private void mergeMessageSetExtensionFromBytes( |
- ByteString rawBytes, |
- ExtensionRegistryLite extensionRegistry, |
- GeneratedExtension<?, ?> extension) |
- throws IOException { |
- MessageLite.Builder subBuilder = null; |
- MessageLite existingValue = (MessageLite) extensions.getField(extension.descriptor); |
- if (existingValue != null) { |
- subBuilder = existingValue.toBuilder(); |
- } |
- if (subBuilder == null) { |
- subBuilder = extension.getMessageDefaultInstance().newBuilderForType(); |
- } |
- rawBytes.newCodedInput().readMessage(subBuilder, extensionRegistry); |
- MessageLite value = subBuilder.build(); |
- |
- extensions.setField(extension.descriptor, extension.singularToFieldSetType(value)); |
- } |
- |
private void verifyExtensionContainingType( |
final GeneratedExtension<MessageType, ?> extension) { |
if (extension.getContainingTypeDefaultInstance() != |
@@ -754,7 +607,7 @@ public abstract class GeneratedMessageLite< |
public final <Type> boolean hasExtension(final ExtensionLite<MessageType, Type> extension) { |
GeneratedExtension<MessageType, Type> extensionLite = |
checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
return extensions.hasField(extensionLite.descriptor); |
} |
@@ -765,7 +618,7 @@ public abstract class GeneratedMessageLite< |
final ExtensionLite<MessageType, List<Type>> extension) { |
GeneratedExtension<MessageType, List<Type>> extensionLite = |
checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
return extensions.getRepeatedFieldCount(extensionLite.descriptor); |
} |
@@ -776,7 +629,7 @@ public abstract class GeneratedMessageLite< |
public final <Type> Type getExtension(final ExtensionLite<MessageType, Type> extension) { |
GeneratedExtension<MessageType, Type> extensionLite = |
checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
final Object value = extensions.getField(extensionLite.descriptor); |
if (value == null) { |
@@ -807,7 +660,7 @@ public abstract class GeneratedMessageLite< |
@Override |
protected final void makeImmutable() { |
super.makeImmutable(); |
- |
+ |
extensions.makeImmutable(); |
} |
@@ -881,7 +734,7 @@ public abstract class GeneratedMessageLite< |
implements ExtendableMessageOrBuilder<MessageType, BuilderType> { |
protected ExtendableBuilder(MessageType defaultInstance) { |
super(defaultInstance); |
- |
+ |
// TODO(dweis): This is kind of an unnecessary clone since we construct a |
// new instance in the parent constructor which makes the extensions |
// immutable. This extra allocation shouldn't matter in practice |
@@ -900,7 +753,7 @@ public abstract class GeneratedMessageLite< |
if (!isBuilt) { |
return; |
} |
- |
+ |
super.copyOnWrite(); |
instance.extensions = instance.extensions.clone(); |
} |
@@ -954,13 +807,21 @@ public abstract class GeneratedMessageLite< |
return instance.getExtension(extension, index); |
} |
+ // This is implemented here only to work around an apparent bug in the |
+ // Java compiler and/or build system. See bug #1898463. The mere presence |
+ // of this dummy clone() implementation makes it go away. |
+ @Override |
+ public BuilderType clone() { |
+ return super.clone(); |
+ } |
+ |
/** Set the value of an extension. */ |
public final <Type> BuilderType setExtension( |
final ExtensionLite<MessageType, Type> extension, |
final Type value) { |
GeneratedExtension<MessageType, Type> extensionLite = |
checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
copyOnWrite(); |
instance.extensions.setField(extensionLite.descriptor, extensionLite.toFieldSetType(value)); |
@@ -973,7 +834,7 @@ public abstract class GeneratedMessageLite< |
final int index, final Type value) { |
GeneratedExtension<MessageType, List<Type>> extensionLite = |
checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
copyOnWrite(); |
instance.extensions.setRepeatedField( |
@@ -987,7 +848,7 @@ public abstract class GeneratedMessageLite< |
final Type value) { |
GeneratedExtension<MessageType, List<Type>> extensionLite = |
checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
copyOnWrite(); |
instance.extensions.addRepeatedField( |
@@ -999,7 +860,7 @@ public abstract class GeneratedMessageLite< |
public final <Type> BuilderType clearExtension( |
final ExtensionLite<MessageType, ?> extension) { |
GeneratedExtension<MessageType, ?> extensionLite = checkIsLite(extension); |
- |
+ |
verifyExtensionContainingType(extensionLite); |
copyOnWrite(); |
instance.extensions.clearField(extensionLite.descriptor); |
@@ -1296,7 +1157,7 @@ public abstract class GeneratedMessageLite< |
public static SerializedForm of(MessageLite message) { |
return new SerializedForm(message); |
} |
- |
+ |
private static final long serialVersionUID = 0L; |
private final String messageClassName; |
@@ -1330,7 +1191,7 @@ public abstract class GeneratedMessageLite< |
} catch (ClassNotFoundException e) { |
throw new RuntimeException("Unable to find proto buffer class: " + messageClassName, e); |
} catch (NoSuchFieldException e) { |
- return readResolveFallback(); |
+ throw new RuntimeException("Unable to find DEFAULT_INSTANCE in " + messageClassName, e); |
} catch (SecurityException e) { |
throw new RuntimeException("Unable to call DEFAULT_INSTANCE in " + messageClassName, e); |
} catch (IllegalAccessException e) { |
@@ -1339,35 +1200,8 @@ public abstract class GeneratedMessageLite< |
throw new RuntimeException("Unable to understand proto buffer", e); |
} |
} |
- |
- /** |
- * @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1 generated code. |
- */ |
- @Deprecated |
- private Object readResolveFallback() throws ObjectStreamException { |
- try { |
- Class<?> messageClass = Class.forName(messageClassName); |
- java.lang.reflect.Field defaultInstanceField = |
- messageClass.getDeclaredField("defaultInstance"); |
- defaultInstanceField.setAccessible(true); |
- MessageLite defaultInstance = (MessageLite) defaultInstanceField.get(null); |
- return defaultInstance.newBuilderForType() |
- .mergeFrom(asBytes) |
- .buildPartial(); |
- } catch (ClassNotFoundException e) { |
- throw new RuntimeException("Unable to find proto buffer class: " + messageClassName, e); |
- } catch (NoSuchFieldException e) { |
- throw new RuntimeException("Unable to find defaultInstance in " + messageClassName, e); |
- } catch (SecurityException e) { |
- throw new RuntimeException("Unable to call defaultInstance in " + messageClassName, e); |
- } catch (IllegalAccessException e) { |
- throw new RuntimeException("Unable to call parsePartialFrom", e); |
- } catch (InvalidProtocolBufferException e) { |
- throw new RuntimeException("Unable to understand proto buffer", e); |
- } |
- } |
} |
- |
+ |
/** |
* Checks that the {@link Extension} is Lite and returns it as a |
* {@link GeneratedExtension}. |
@@ -1381,7 +1215,7 @@ public abstract class GeneratedMessageLite< |
if (!extension.isLite()) { |
throw new IllegalArgumentException("Expected a lite extension."); |
} |
- |
+ |
return (GeneratedExtension<MessageType, T>) extension; |
} |
@@ -1393,8 +1227,8 @@ public abstract class GeneratedMessageLite< |
protected static final <T extends GeneratedMessageLite<T, ?>> boolean isInitialized( |
T message, boolean shouldMemoize) { |
return message.dynamicMethod(MethodToInvoke.IS_INITIALIZED, shouldMemoize) != null; |
- } |
- |
+ } |
+ |
protected static final <T extends GeneratedMessageLite<T, ?>> void makeImmutable(T message) { |
message.dynamicMethod(MethodToInvoke.MAKE_IMMUTABLE); |
} |
@@ -1412,7 +1246,7 @@ public abstract class GeneratedMessageLite< |
protected static LongList emptyLongList() { |
return LongArrayList.emptyList(); |
} |
- |
+ |
protected static LongList mutableCopy(LongList list) { |
int size = list.size(); |
return list.mutableCopyWithCapacity( |
@@ -1422,7 +1256,7 @@ public abstract class GeneratedMessageLite< |
protected static FloatList emptyFloatList() { |
return FloatArrayList.emptyList(); |
} |
- |
+ |
protected static FloatList mutableCopy(FloatList list) { |
int size = list.size(); |
return list.mutableCopyWithCapacity( |
@@ -1432,7 +1266,7 @@ public abstract class GeneratedMessageLite< |
protected static DoubleList emptyDoubleList() { |
return DoubleArrayList.emptyList(); |
} |
- |
+ |
protected static DoubleList mutableCopy(DoubleList list) { |
int size = list.size(); |
return list.mutableCopyWithCapacity( |
@@ -1442,7 +1276,7 @@ public abstract class GeneratedMessageLite< |
protected static BooleanList emptyBooleanList() { |
return BooleanArrayList.emptyList(); |
} |
- |
+ |
protected static BooleanList mutableCopy(BooleanList list) { |
int size = list.size(); |
return list.mutableCopyWithCapacity( |
@@ -1452,7 +1286,7 @@ public abstract class GeneratedMessageLite< |
protected static <E> ProtobufList<E> emptyProtobufList() { |
return ProtobufArrayList.emptyList(); |
} |
- |
+ |
protected static <E> ProtobufList<E> mutableCopy(ProtobufList<E> list) { |
int size = list.size(); |
return list.mutableCopyWithCapacity( |
@@ -1466,20 +1300,20 @@ public abstract class GeneratedMessageLite< |
*/ |
protected static class DefaultInstanceBasedParser<T extends GeneratedMessageLite<T, ?>> |
extends AbstractParser<T> { |
- |
+ |
private T defaultInstance; |
- |
+ |
public DefaultInstanceBasedParser(T defaultInstance) { |
this.defaultInstance = defaultInstance; |
} |
- |
+ |
@Override |
public T parsePartialFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry) |
throws InvalidProtocolBufferException { |
return GeneratedMessageLite.parsePartialFrom(defaultInstance, input, extensionRegistry); |
} |
} |
- |
+ |
/** |
* A static helper method for parsing a partial from input using the extension registry and the |
* instance. |
@@ -1501,14 +1335,14 @@ public abstract class GeneratedMessageLite< |
} |
return result; |
} |
- |
+ |
protected static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( |
T defaultInstance, |
CodedInputStream input) |
throws InvalidProtocolBufferException { |
return parsePartialFrom(defaultInstance, input, ExtensionRegistryLite.getEmptyRegistry()); |
} |
- |
+ |
/** |
* Helper method to check if message is initialized. |
* |
@@ -1539,7 +1373,7 @@ public abstract class GeneratedMessageLite< |
throws InvalidProtocolBufferException { |
return checkMessageInitialized(parsePartialFrom(defaultInstance, data, extensionRegistry)); |
} |
- |
+ |
// This is a special case since we want to verify that the last tag is 0. We assume we exhaust the |
// ByteString. |
private static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( |
@@ -1559,7 +1393,7 @@ public abstract class GeneratedMessageLite< |
throw e; |
} |
} |
- |
+ |
// This is a special case since we want to verify that the last tag is 0. We assume we exhaust the |
// ByteString. |
private static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom( |
@@ -1643,7 +1477,7 @@ public abstract class GeneratedMessageLite< |
return checkMessageInitialized( |
parsePartialDelimitedFrom(defaultInstance, input, extensionRegistry)); |
} |
- |
+ |
private static <T extends GeneratedMessageLite<T, ?>> T parsePartialDelimitedFrom( |
T defaultInstance, |
InputStream input, |
@@ -1696,12 +1530,13 @@ public abstract class GeneratedMessageLite< |
Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other); |
Object visitOneofMessage(boolean minePresent, Object mine, Object other); |
void visitOneofNotSet(boolean minePresent); |
- |
+ |
/** |
* Message fields use null sentinals. |
*/ |
<T extends MessageLite> T visitMessage(T mine, T other); |
- LazyFieldLite visitLazyMessage(LazyFieldLite mine, LazyFieldLite other); |
+ LazyFieldLite visitLazyMessage( |
+ boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other); |
<T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other); |
BooleanList visitBooleanList(BooleanList mine, BooleanList other); |
@@ -1851,7 +1686,7 @@ public abstract class GeneratedMessageLite< |
} |
throw NOT_EQUALS; |
} |
- |
+ |
@Override |
public Object visitOneofMessage(boolean minePresent, Object mine, Object other) { |
if (minePresent && ((GeneratedMessageLite<?, ?>) mine).equals(this, (MessageLite) other)) { |
@@ -1859,7 +1694,7 @@ public abstract class GeneratedMessageLite< |
} |
throw NOT_EQUALS; |
} |
- |
+ |
@Override |
public void visitOneofNotSet(boolean minePresent) { |
if (minePresent) { |
@@ -1881,17 +1716,13 @@ public abstract class GeneratedMessageLite< |
return mine; |
} |
- |
+ |
@Override |
public LazyFieldLite visitLazyMessage( |
- LazyFieldLite mine, LazyFieldLite other) { |
- if (mine == null && other == null) { |
- return null; |
- } |
- if (mine == null || other == null) { |
- throw NOT_EQUALS; |
- } |
- if (mine.equals(other)) { |
+ boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) { |
+ if (!minePresent && !otherPresent) { |
+ return mine; |
+ } else if (minePresent && otherPresent && mine.equals(other)) { |
return mine; |
} |
throw NOT_EQUALS; |
@@ -1982,7 +1813,7 @@ public abstract class GeneratedMessageLite< |
// The caller must ensure that the visitor is invoked parameterized with this and this such that |
// other is this. This is required due to how oneof cases are handled. See the class comment |
// on Visitor for more information. |
- |
+ |
private int hashCode = 0; |
@Override |
@@ -2078,7 +1909,7 @@ public abstract class GeneratedMessageLite< |
hashCode = (53 * hashCode) + mine.hashCode(); |
return mine; |
} |
- |
+ |
@Override |
public Object visitOneofMessage(boolean minePresent, Object mine, Object other) { |
return visitMessage((MessageLite) mine, (MessageLite) other); |
@@ -2087,7 +1918,7 @@ public abstract class GeneratedMessageLite< |
@Override |
public void visitOneofNotSet(boolean minePresent) { |
if (minePresent) { |
- throw new IllegalStateException(); // Can't happen if other == this. |
+ throw new IllegalStateException(); // Can't happen if other == this. |
} |
} |
@@ -2108,14 +1939,9 @@ public abstract class GeneratedMessageLite< |
} |
@Override |
- public LazyFieldLite visitLazyMessage(LazyFieldLite mine, LazyFieldLite other) { |
- final int protoHash; |
- if (mine != null) { |
- protoHash = mine.hashCode(); |
- } else { |
- protoHash = 37; |
- } |
- hashCode = (53 * hashCode) + protoHash; |
+ public LazyFieldLite visitLazyMessage( |
+ boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) { |
+ hashCode = (53 * hashCode) + mine.hashCode(); |
return mine; |
} |
@@ -2170,7 +1996,7 @@ public abstract class GeneratedMessageLite< |
hashCode = (53 * hashCode) + mine.hashCode(); |
return mine; |
} |
- |
+ |
@Override |
public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) { |
hashCode = (53 * hashCode) + mine.hashCode(); |
@@ -2238,7 +2064,7 @@ public abstract class GeneratedMessageLite< |
@Override |
public Object visitOneofDouble(boolean minePresent, Object mine, Object other) { |
- return other; |
+ return other; |
} |
@Override |
@@ -2248,26 +2074,29 @@ public abstract class GeneratedMessageLite< |
@Override |
public Object visitOneofLong(boolean minePresent, Object mine, Object other) { |
- return other; |
+ return other; |
} |
@Override |
public Object visitOneofString(boolean minePresent, Object mine, Object other) { |
- return other; |
+ return other; |
} |
@Override |
public Object visitOneofByteString(boolean minePresent, Object mine, Object other) { |
- return other; |
+ return other; |
} |
@Override |
public Object visitOneofLazyMessage(boolean minePresent, Object mine, Object other) { |
- LazyFieldLite lazy = minePresent ? (LazyFieldLite) mine : new LazyFieldLite(); |
- lazy.merge((LazyFieldLite) other); |
- return lazy; |
+ if (minePresent) { |
+ LazyFieldLite lazy = (LazyFieldLite) mine; |
+ lazy.merge((LazyFieldLite) other); |
+ return lazy; |
+ } |
+ return other; |
} |
- |
+ |
@Override |
public Object visitOneofMessage(boolean minePresent, Object mine, Object other) { |
if (minePresent) { |
@@ -2275,7 +2104,7 @@ public abstract class GeneratedMessageLite< |
} |
return other; |
} |
- |
+ |
@Override |
public void visitOneofNotSet(boolean minePresent) { |
return; |
@@ -2292,13 +2121,12 @@ public abstract class GeneratedMessageLite< |
} |
@Override |
- public LazyFieldLite visitLazyMessage(LazyFieldLite mine, LazyFieldLite other) { |
- if (other != null) { |
- if (mine == null) { |
- mine = new LazyFieldLite(); |
- } |
- mine.merge(other); |
- } |
+ public LazyFieldLite visitLazyMessage( |
+ boolean minePresent, LazyFieldLite mine, boolean otherPresent, LazyFieldLite other) { |
+ // LazyFieldLite's are never null so we can just copy across. Necessary to avoid leakage |
+ // from builder into immutable message. |
+ // TODO(dweis): Change to null sentinels? |
+ mine.merge(other); |
return mine; |
} |
@@ -2312,7 +2140,7 @@ public abstract class GeneratedMessageLite< |
} |
mine.addAll(other); |
} |
- |
+ |
return size > 0 ? mine : other; |
} |
@@ -2326,7 +2154,7 @@ public abstract class GeneratedMessageLite< |
} |
mine.addAll(other); |
} |
- |
+ |
return size > 0 ? mine : other; |
} |
@@ -2340,7 +2168,7 @@ public abstract class GeneratedMessageLite< |
} |
mine.addAll(other); |
} |
- |
+ |
return size > 0 ? mine : other; |
} |
@@ -2354,7 +2182,7 @@ public abstract class GeneratedMessageLite< |
} |
mine.addAll(other); |
} |
- |
+ |
return size > 0 ? mine : other; |
} |
@@ -2368,7 +2196,7 @@ public abstract class GeneratedMessageLite< |
} |
mine.addAll(other); |
} |
- |
+ |
return size > 0 ? mine : other; |
} |
@@ -2382,7 +2210,7 @@ public abstract class GeneratedMessageLite< |
} |
mine.addAll(other); |
} |
- |
+ |
return size > 0 ? mine : other; |
} |
@@ -2404,15 +2232,10 @@ public abstract class GeneratedMessageLite< |
return other == UnknownFieldSetLite.getDefaultInstance() |
? mine : UnknownFieldSetLite.mutableCopyOf(mine, other); |
} |
- |
+ |
@Override |
public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) { |
- if (!other.isEmpty()) { |
- if (!mine.isMutable()) { |
- mine = mine.mutableCopy(); |
- } |
- mine.mergeFrom(other); |
- } |
+ mine.mergeFrom(other); |
return mine; |
} |
} |