@@ -234,6 +234,29 @@ static int decodeBytes(byte[] data, int position, Registers registers)
234234 @ SuppressWarnings ({"unchecked" , "rawtypes" })
235235 static int decodeMessageField (
236236 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 {
237260 int length = data [position ++];
238261 if (length < 0 ) {
239262 position = decodeVarint32 (length , data , position , registers );
@@ -242,27 +265,28 @@ static int decodeMessageField(
242265 if (length < 0 || length > limit - position ) {
243266 throw InvalidProtocolBufferException .truncatedMessage ();
244267 }
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 ;
249270 return position + length ;
250271 }
251272
252- /** Decodes a group value. */
253273 @ 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 )
256282 throws IOException {
257283 // A group field must has a MessageSchema (the only other subclass of Schema is MessageSetSchema
258284 // and it can't be used in group fields).
259285 final MessageSchema messageSchema = (MessageSchema ) schema ;
260- Object result = messageSchema .newInstance ();
261286 // It's OK to directly use parseProto2Message since proto3 doesn't have group.
262287 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 ;
266290 return endPosition ;
267291 }
268292
@@ -847,26 +871,19 @@ static int decodeExtension(
847871 break ;
848872 }
849873 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 ;
866886 }
867- extensions .setField (extension .descriptor , list );
868- break ;
869- }
870887 default :
871888 throw new IllegalStateException (
872889 "Type cannot be packed: " + extension .descriptor .getLiteType ());
@@ -878,13 +895,8 @@ static int decodeExtension(
878895 position = decodeVarint32 (data , position , registers );
879896 Object enumValue = extension .descriptor .getEnumType ().findValueByNumber (registers .int1 );
880897 if (enumValue == null ) {
881- UnknownFieldSetLite unknownFields = ((GeneratedMessageLite ) message ).unknownFields ;
882- if (unknownFields == UnknownFieldSetLite .getDefaultInstance ()) {
883- unknownFields = UnknownFieldSetLite .newInstance ();
884- ((GeneratedMessageLite ) message ).unknownFields = unknownFields ;
885- }
886898 SchemaUtil .storeUnknownEnum (
887- fieldNumber , registers .int1 , unknownFields , unknownFieldSchema );
899+ message , fieldNumber , registers .int1 , null , unknownFieldSchema );
888900 return position ;
889901 }
890902 // Note, we store the integer value instead of the actual enum object in FieldSet.
@@ -941,38 +953,52 @@ static int decodeExtension(
941953 value = registers .object1 ;
942954 break ;
943955 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+ }
951976 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+ }
958995 case ENUM :
959996 throw new IllegalStateException ("Shouldn't reach here." );
960997 }
961998 }
962999 if (extension .isRepeated ()) {
9631000 extensions .addRepeatedField (extension .descriptor , value );
9641001 } 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- }
9761002 extensions .setField (extension .descriptor , value );
9771003 }
9781004 }
0 commit comments