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