[ObjC] Support MessageSet with `GPBUnknownFields`.
Update the initialization from a message to deal with the current differences.
Update some tests to cover the usage.
PiperOrigin-RevId: 652892603
diff --git a/objectivec/GPBUnknownFields.m b/objectivec/GPBUnknownFields.m
index e24e07b..f3073ad 100644
--- a/objectivec/GPBUnknownFields.m
+++ b/objectivec/GPBUnknownFields.m
@@ -12,6 +12,7 @@
#import "GPBCodedInputStream_PackagePrivate.h"
#import "GPBCodedOutputStream.h"
#import "GPBCodedOutputStream_PackagePrivate.h"
+#import "GPBDescriptor.h"
#import "GPBMessage.h"
#import "GPBUnknownField.h"
#import "GPBUnknownFieldSet_PackagePrivate.h"
@@ -199,8 +200,19 @@
// updated.
GPBUnknownFieldSet *legacyUnknownFields = [message unknownFields];
if (legacyUnknownFields) {
- GPBCodedInputStream *input =
- [[GPBCodedInputStream alloc] initWithData:[legacyUnknownFields data]];
+ NSData *data;
+ if (message.descriptor.isWireFormat) {
+ NSMutableData *mutableData =
+ [NSMutableData dataWithLength:legacyUnknownFields.serializedSizeAsMessageSet];
+ GPBCodedOutputStream *output = [[GPBCodedOutputStream alloc] initWithData:mutableData];
+ [legacyUnknownFields writeAsMessageSetTo:output];
+ [output flush];
+ [output release];
+ data = mutableData;
+ } else {
+ data = [legacyUnknownFields data];
+ }
+ GPBCodedInputStream *input = [[GPBCodedInputStream alloc] initWithData:data];
// Parse until the end of the data (tag will be zero).
if (!MergeFromInputStream(self, input, 0)) {
[input release];