@@ -63,7 +63,8 @@ public static int decode(
6363
6464 final long packedValues = decodeGroups (buffer , bufferIdx , actingVersion , msgTokens , tokenIdx , numTokens , listener );
6565
66- bufferIdx = decodeData (buffer , bufferIndex (packedValues ), msgTokens , tokenIndex (packedValues ), numTokens , listener );
66+ bufferIdx = decodeData (
67+ buffer , bufferIndex (packedValues ), msgTokens , tokenIndex (packedValues ), numTokens , actingVersion , listener );
6768
6869 listener .onEndMessage (msgTokens .get (numTokens - 1 ));
6970
@@ -138,22 +139,30 @@ private static long decodeGroups(
138139 break ;
139140 }
140141
142+ final boolean isPresent = token .version () <= actingVersion ;
143+
141144 final Token blockLengthToken = tokens .get (tokenIdx + 2 );
142- final int blockLength = Types .getInt (
145+ final int blockLength = isPresent ? Types .getInt (
143146 buffer ,
144147 bufferIdx + blockLengthToken .offset (),
145148 blockLengthToken .encoding ().primitiveType (),
146- blockLengthToken .encoding ().byteOrder ());
149+ blockLengthToken .encoding ().byteOrder ())
150+ : 0 ;
147151
148152 final Token numInGroupToken = tokens .get (tokenIdx + 3 );
149- final int numInGroup = Types .getInt (
153+ final int numInGroup = isPresent ? Types .getInt (
150154 buffer ,
151155 bufferIdx + numInGroupToken .offset (),
152156 numInGroupToken .encoding ().primitiveType (),
153- numInGroupToken .encoding ().byteOrder ());
157+ numInGroupToken .encoding ().byteOrder ())
158+ : 0 ;
154159
155160 final Token dimensionTypeComposite = tokens .get (tokenIdx + 1 );
156- bufferIdx += dimensionTypeComposite .encodedLength ();
161+
162+ if (isPresent )
163+ {
164+ bufferIdx += dimensionTypeComposite .encodedLength ();
165+ }
157166
158167 final int beginFieldsIdx = tokenIdx + dimensionTypeComposite .componentTokenCount () + 1 ;
159168
@@ -171,7 +180,7 @@ private static long decodeGroups(
171180 buffer , bufferIdx , actingVersion , tokens , afterFieldsIdx , numTokens , listener );
172181
173182 bufferIdx = decodeData (
174- buffer , bufferIndex (packedValues ), tokens , tokenIndex (packedValues ), numTokens , listener );
183+ buffer , bufferIndex (packedValues ), tokens , tokenIndex (packedValues ), numTokens , actingVersion , listener );
175184
176185 listener .onEndGroup (token , i , numInGroup );
177186 }
@@ -194,7 +203,7 @@ private static void decodeComposite(
194203 {
195204 listener .onBeginComposite (fieldToken , tokens , tokenIdx , toIndex );
196205
197- for (int i = tokenIdx + 1 ; i < toIndex ;)
206+ for (int i = tokenIdx + 1 ; i < toIndex ; )
198207 {
199208 final Token typeToken = tokens .get (i );
200209 final int nextFieldIdx = i + typeToken .componentTokenCount ();
@@ -235,6 +244,7 @@ private static int decodeData(
235244 final List <Token > tokens ,
236245 int tokenIdx ,
237246 final int numTokens ,
247+ final int actingVersion ,
238248 final TokenListener listener )
239249 {
240250 while (tokenIdx < numTokens )
@@ -245,15 +255,21 @@ private static int decodeData(
245255 break ;
246256 }
247257
258+ final boolean isPresent = token .version () <= actingVersion ;
259+
248260 final Token lengthToken = tokens .get (tokenIdx + 2 );
249- final int length = Types .getInt (
261+ final int length = isPresent ? Types .getInt (
250262 buffer ,
251263 bufferIdx + lengthToken .offset (),
252264 lengthToken .encoding ().primitiveType (),
253- lengthToken .encoding ().byteOrder ());
265+ lengthToken .encoding ().byteOrder ())
266+ : 0 ;
254267
255268 final Token dataToken = tokens .get (tokenIdx + 3 );
256- bufferIdx += dataToken .offset ();
269+ if (isPresent )
270+ {
271+ bufferIdx += dataToken .offset ();
272+ }
257273
258274 listener .onVarData (token , buffer , bufferIdx , length , dataToken );
259275
0 commit comments