@@ -234,6 +234,29 @@ static int decodeBytes(byte[] data, int position, Registers registers)
234
234
@ SuppressWarnings ({"unchecked" , "rawtypes" })
235
235
static int decodeMessageField (
236
236
Schema schema , byte [] data , int position , int limit , Registers registers ) throws IOException {
237
+ Object msg = schema .newInstance ();
238
+ int offset = mergeMessageField (msg , schema , data , position , limit , registers );
239
+ schema .makeImmutable (msg );
240
+ registers .object1 = msg ;
241
+ return offset ;
242
+ }
243
+
244
+ /** Decodes a group value. */
245
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
246
+ static int decodeGroupField (
247
+ Schema schema , byte [] data , int position , int limit , int endGroup , Registers registers )
248
+ throws IOException {
249
+ Object msg = schema .newInstance ();
250
+ int offset = mergeGroupField (msg , schema , data , position , limit , endGroup , registers );
251
+ schema .makeImmutable (msg );
252
+ registers .object1 = msg ;
253
+ return offset ;
254
+ }
255
+
256
+ @ SuppressWarnings ({"unchecked" , "rawtypes" })
257
+ static int mergeMessageField (
258
+ Object msg , Schema schema , byte [] data , int position , int limit , Registers registers )
259
+ throws IOException {
237
260
int length = data [position ++];
238
261
if (length < 0 ) {
239
262
position = decodeVarint32 (length , data , position , registers );
@@ -242,27 +265,28 @@ static int decodeMessageField(
242
265
if (length < 0 || length > limit - position ) {
243
266
throw InvalidProtocolBufferException .truncatedMessage ();
244
267
}
245
- Object result = schema .newInstance ();
246
- schema .mergeFrom (result , data , position , position + length , registers );
247
- schema .makeImmutable (result );
248
- registers .object1 = result ;
268
+ schema .mergeFrom (msg , data , position , position + length , registers );
269
+ registers .object1 = msg ;
249
270
return position + length ;
250
271
}
251
272
252
- /** Decodes a group value. */
253
273
@ SuppressWarnings ({"unchecked" , "rawtypes" })
254
- static int decodeGroupField (
255
- Schema schema , byte [] data , int position , int limit , int endGroup , Registers registers )
274
+ static int mergeGroupField (
275
+ Object msg ,
276
+ Schema schema ,
277
+ byte [] data ,
278
+ int position ,
279
+ int limit ,
280
+ int endGroup ,
281
+ Registers registers )
256
282
throws IOException {
257
283
// A group field must has a MessageSchema (the only other subclass of Schema is MessageSetSchema
258
284
// and it can't be used in group fields).
259
285
final MessageSchema messageSchema = (MessageSchema ) schema ;
260
- Object result = messageSchema .newInstance ();
261
286
// It's OK to directly use parseProto2Message since proto3 doesn't have group.
262
287
final int endPosition =
263
- messageSchema .parseProto2Message (result , data , position , limit , endGroup , registers );
264
- messageSchema .makeImmutable (result );
265
- registers .object1 = result ;
288
+ messageSchema .parseProto2Message (msg , data , position , limit , endGroup , registers );
289
+ registers .object1 = msg ;
266
290
return endPosition ;
267
291
}
268
292
@@ -847,26 +871,19 @@ static int decodeExtension(
847
871
break ;
848
872
}
849
873
case ENUM :
850
- {
851
- IntArrayList list = new IntArrayList ();
852
- position = decodePackedVarint32List (data , position , list , registers );
853
- UnknownFieldSetLite unknownFields = message .unknownFields ;
854
- if (unknownFields == UnknownFieldSetLite .getDefaultInstance ()) {
855
- unknownFields = null ;
856
- }
857
- unknownFields =
858
- SchemaUtil .filterUnknownEnumList (
859
- fieldNumber ,
860
- list ,
861
- extension .descriptor .getEnumType (),
862
- unknownFields ,
863
- unknownFieldSchema );
864
- if (unknownFields != null ) {
865
- message .unknownFields = unknownFields ;
874
+ {
875
+ IntArrayList list = new IntArrayList ();
876
+ position = decodePackedVarint32List (data , position , list , registers );
877
+ SchemaUtil .filterUnknownEnumList (
878
+ message ,
879
+ fieldNumber ,
880
+ list ,
881
+ extension .descriptor .getEnumType (),
882
+ null ,
883
+ unknownFieldSchema );
884
+ extensions .setField (extension .descriptor , list );
885
+ break ;
866
886
}
867
- extensions .setField (extension .descriptor , list );
868
- break ;
869
- }
870
887
default :
871
888
throw new IllegalStateException (
872
889
"Type cannot be packed: " + extension .descriptor .getLiteType ());
@@ -878,13 +895,8 @@ static int decodeExtension(
878
895
position = decodeVarint32 (data , position , registers );
879
896
Object enumValue = extension .descriptor .getEnumType ().findValueByNumber (registers .int1 );
880
897
if (enumValue == null ) {
881
- UnknownFieldSetLite unknownFields = ((GeneratedMessageLite ) message ).unknownFields ;
882
- if (unknownFields == UnknownFieldSetLite .getDefaultInstance ()) {
883
- unknownFields = UnknownFieldSetLite .newInstance ();
884
- ((GeneratedMessageLite ) message ).unknownFields = unknownFields ;
885
- }
886
898
SchemaUtil .storeUnknownEnum (
887
- fieldNumber , registers .int1 , unknownFields , unknownFieldSchema );
899
+ message , fieldNumber , registers .int1 , null , unknownFieldSchema );
888
900
return position ;
889
901
}
890
902
// Note, we store the integer value instead of the actual enum object in FieldSet.
@@ -941,38 +953,52 @@ static int decodeExtension(
941
953
value = registers .object1 ;
942
954
break ;
943
955
case GROUP :
944
- final int endTag = (fieldNumber << 3 ) | WireFormat .WIRETYPE_END_GROUP ;
945
- position = decodeGroupField (
946
- Protobuf .getInstance ().schemaFor (extension .getMessageDefaultInstance ().getClass ()),
947
- data , position , limit , endTag , registers );
948
- value = registers .object1 ;
949
- break ;
950
-
956
+ {
957
+ final int endTag = (fieldNumber << 3 ) | WireFormat .WIRETYPE_END_GROUP ;
958
+ final Schema fieldSchema =
959
+ Protobuf .getInstance ()
960
+ .schemaFor (extension .getMessageDefaultInstance ().getClass ());
961
+ if (extension .isRepeated ()) {
962
+ position = decodeGroupField (fieldSchema , data , position , limit , endTag , registers );
963
+ extensions .addRepeatedField (extension .descriptor , registers .object1 );
964
+ } else {
965
+ Object oldValue = extensions .getField (extension .descriptor );
966
+ if (oldValue == null ) {
967
+ oldValue = fieldSchema .newInstance ();
968
+ extensions .setField (extension .descriptor , oldValue );
969
+ }
970
+ position =
971
+ mergeGroupField (
972
+ oldValue , fieldSchema , data , position , limit , endTag , registers );
973
+ }
974
+ return position ;
975
+ }
951
976
case MESSAGE :
952
- position = decodeMessageField (
953
- Protobuf .getInstance ().schemaFor (extension .getMessageDefaultInstance ().getClass ()),
954
- data , position , limit , registers );
955
- value = registers .object1 ;
956
- break ;
957
-
977
+ {
978
+ final Schema fieldSchema =
979
+ Protobuf .getInstance ()
980
+ .schemaFor (extension .getMessageDefaultInstance ().getClass ());
981
+ if (extension .isRepeated ()) {
982
+ position = decodeMessageField (fieldSchema , data , position , limit , registers );
983
+ extensions .addRepeatedField (extension .descriptor , registers .object1 );
984
+ } else {
985
+ Object oldValue = extensions .getField (extension .descriptor );
986
+ if (oldValue == null ) {
987
+ oldValue = fieldSchema .newInstance ();
988
+ extensions .setField (extension .descriptor , oldValue );
989
+ }
990
+ position =
991
+ mergeMessageField (oldValue , fieldSchema , data , position , limit , registers );
992
+ }
993
+ return position ;
994
+ }
958
995
case ENUM :
959
996
throw new IllegalStateException ("Shouldn't reach here." );
960
997
}
961
998
}
962
999
if (extension .isRepeated ()) {
963
1000
extensions .addRepeatedField (extension .descriptor , value );
964
1001
} else {
965
- switch (extension .getLiteType ()) {
966
- case MESSAGE :
967
- case GROUP :
968
- Object oldValue = extensions .getField (extension .descriptor );
969
- if (oldValue != null ) {
970
- value = Internal .mergeMessage (oldValue , value );
971
- }
972
- break ;
973
- default :
974
- break ;
975
- }
976
1002
extensions .setField (extension .descriptor , value );
977
1003
}
978
1004
}
0 commit comments