int oldLimit = in.pushLimit(length);
tagHandler.onStartNested(fieldNumber, fd);
parseMessage(tagHandler, fd.getMessageType(), in);
tagHandler.onEndNested(fieldNumber, fd);
in.checkLastTagWas(0);
if (fd != null) {
tagHandler.onStartNested(fieldNumber, null);
parseMessage(tagHandler, null, in);
in.checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
tagHandler.onEndNested(fieldNumber, null);
} else {
tagHandler.onStartNested(fieldNumber, fd);
parseMessage(tagHandler, fd.getMessageType(), in);
in.checkLastTagWas(WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));
tagHandler.onEndNested(fieldNumber, fd);