@@ -63,7 +63,8 @@ public static int decode(
63
63
64
64
final long packedValues = decodeGroups (buffer , bufferIdx , actingVersion , msgTokens , tokenIdx , numTokens , listener );
65
65
66
- bufferIdx = decodeData (buffer , bufferIndex (packedValues ), msgTokens , tokenIndex (packedValues ), numTokens , listener );
66
+ bufferIdx = decodeData (
67
+ buffer , bufferIndex (packedValues ), msgTokens , tokenIndex (packedValues ), numTokens , actingVersion , listener );
67
68
68
69
listener .onEndMessage (msgTokens .get (numTokens - 1 ));
69
70
@@ -138,22 +139,30 @@ private static long decodeGroups(
138
139
break ;
139
140
}
140
141
142
+ final boolean isPresent = token .version () <= actingVersion ;
143
+
141
144
final Token blockLengthToken = tokens .get (tokenIdx + 2 );
142
- final int blockLength = Types .getInt (
145
+ final int blockLength = isPresent ? Types .getInt (
143
146
buffer ,
144
147
bufferIdx + blockLengthToken .offset (),
145
148
blockLengthToken .encoding ().primitiveType (),
146
- blockLengthToken .encoding ().byteOrder ());
149
+ blockLengthToken .encoding ().byteOrder ())
150
+ : 0 ;
147
151
148
152
final Token numInGroupToken = tokens .get (tokenIdx + 3 );
149
- final int numInGroup = Types .getInt (
153
+ final int numInGroup = isPresent ? Types .getInt (
150
154
buffer ,
151
155
bufferIdx + numInGroupToken .offset (),
152
156
numInGroupToken .encoding ().primitiveType (),
153
- numInGroupToken .encoding ().byteOrder ());
157
+ numInGroupToken .encoding ().byteOrder ())
158
+ : 0 ;
154
159
155
160
final Token dimensionTypeComposite = tokens .get (tokenIdx + 1 );
156
- bufferIdx += dimensionTypeComposite .encodedLength ();
161
+
162
+ if (isPresent )
163
+ {
164
+ bufferIdx += dimensionTypeComposite .encodedLength ();
165
+ }
157
166
158
167
final int beginFieldsIdx = tokenIdx + dimensionTypeComposite .componentTokenCount () + 1 ;
159
168
@@ -171,7 +180,7 @@ private static long decodeGroups(
171
180
buffer , bufferIdx , actingVersion , tokens , afterFieldsIdx , numTokens , listener );
172
181
173
182
bufferIdx = decodeData (
174
- buffer , bufferIndex (packedValues ), tokens , tokenIndex (packedValues ), numTokens , listener );
183
+ buffer , bufferIndex (packedValues ), tokens , tokenIndex (packedValues ), numTokens , actingVersion , listener );
175
184
176
185
listener .onEndGroup (token , i , numInGroup );
177
186
}
@@ -194,7 +203,7 @@ private static void decodeComposite(
194
203
{
195
204
listener .onBeginComposite (fieldToken , tokens , tokenIdx , toIndex );
196
205
197
- for (int i = tokenIdx + 1 ; i < toIndex ;)
206
+ for (int i = tokenIdx + 1 ; i < toIndex ; )
198
207
{
199
208
final Token typeToken = tokens .get (i );
200
209
final int nextFieldIdx = i + typeToken .componentTokenCount ();
@@ -235,6 +244,7 @@ private static int decodeData(
235
244
final List <Token > tokens ,
236
245
int tokenIdx ,
237
246
final int numTokens ,
247
+ final int actingVersion ,
238
248
final TokenListener listener )
239
249
{
240
250
while (tokenIdx < numTokens )
@@ -245,15 +255,21 @@ private static int decodeData(
245
255
break ;
246
256
}
247
257
258
+ final boolean isPresent = token .version () <= actingVersion ;
259
+
248
260
final Token lengthToken = tokens .get (tokenIdx + 2 );
249
- final int length = Types .getInt (
261
+ final int length = isPresent ? Types .getInt (
250
262
buffer ,
251
263
bufferIdx + lengthToken .offset (),
252
264
lengthToken .encoding ().primitiveType (),
253
- lengthToken .encoding ().byteOrder ());
265
+ lengthToken .encoding ().byteOrder ())
266
+ : 0 ;
254
267
255
268
final Token dataToken = tokens .get (tokenIdx + 3 );
256
- bufferIdx += dataToken .offset ();
269
+ if (isPresent )
270
+ {
271
+ bufferIdx += dataToken .offset ();
272
+ }
257
273
258
274
listener .onVarData (token , buffer , bufferIdx , length , dataToken );
259
275
0 commit comments