|
@@ -183,26 +183,14 @@ namespace Google.Protobuf
|
|
|
/// </summary>
|
|
|
public static bool TryMergeFieldFrom<TTarget>(ref ExtensionSet<TTarget> set, CodedInputStream stream) where TTarget : IExtendableMessage<TTarget>
|
|
|
{
|
|
|
- Extension extension;
|
|
|
- int lastFieldNumber = WireFormat.GetTagFieldNumber(stream.LastTag);
|
|
|
-
|
|
|
- IExtensionValue extensionValue;
|
|
|
- if (set != null && set.ValuesByNumber.TryGetValue(lastFieldNumber, out extensionValue))
|
|
|
+ ParseContext.Initialize(stream, out ParseContext ctx);
|
|
|
+ try
|
|
|
{
|
|
|
- extensionValue.MergeFrom(stream);
|
|
|
- return true;
|
|
|
+ return TryMergeFieldFrom<TTarget>(ref set, ref ctx);
|
|
|
}
|
|
|
- else if (stream.ExtensionRegistry != null && stream.ExtensionRegistry.ContainsInputField(stream.LastTag, typeof(TTarget), out extension))
|
|
|
+ finally
|
|
|
{
|
|
|
- IExtensionValue value = extension.CreateValue();
|
|
|
- value.MergeFrom(stream);
|
|
|
- set = (set ?? new ExtensionSet<TTarget>());
|
|
|
- set.ValuesByNumber.Add(extension.FieldNumber, value);
|
|
|
- return true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return false;
|
|
|
+ ctx.CopyStateTo(stream);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -212,7 +200,6 @@ namespace Google.Protobuf
|
|
|
/// </summary>
|
|
|
public static bool TryMergeFieldFrom<TTarget>(ref ExtensionSet<TTarget> set, ref ParseContext ctx) where TTarget : IExtendableMessage<TTarget>
|
|
|
{
|
|
|
- // TODO(jtattermusch): deduplicate code
|
|
|
Extension extension;
|
|
|
int lastFieldNumber = WireFormat.GetTagFieldNumber(ctx.LastTag);
|
|
|
|