Skip to content

Commit 8af808c

Browse files
committed
[Java] Preserve byte order throughout IR transformations.
Previously, the IrDecoder looked at the message header's BEGIN_COMPOSITE token to determine byte order; however, IrEncoder does not write the schema's byte order on tokens like these. Now, the IrDecoder finds the first real ENCODING token and reads the byte order from that.
1 parent 7079133 commit 8af808c

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/ir/IrDecoder.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,16 @@ public Ir decode()
126126
i = captureHeader(tokens);
127127
}
128128

129-
final ByteOrder byteOrder = !tokens.isEmpty() ? tokens.get(0).encoding().byteOrder() : null;
129+
ByteOrder byteOrder = null;
130+
for (int j = 0; j < tokens.size(); j++)
131+
{
132+
if (tokens.get(j).signal() == Signal.ENCODING)
133+
{
134+
byteOrder = tokens.get(j).encoding().byteOrder();
135+
break;
136+
}
137+
}
138+
130139
final Ir ir = new Ir(
131140
irPackageName, irNamespaceName, irId, irVersion, null, semanticVersion, byteOrder, irHeader);
132141

sbe-tool/src/test/java/uk/co/real_logic/sbe/ir/BasicXmlIrGenerationTest.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
1617
package uk.co.real_logic.sbe.ir;
1718

18-
import org.junit.jupiter.api.Test;
1919
import uk.co.real_logic.sbe.PrimitiveType;
2020
import uk.co.real_logic.sbe.xml.IrGenerator;
2121
import uk.co.real_logic.sbe.xml.MessageSchema;
2222
import uk.co.real_logic.sbe.xml.ParserOptions;
23+
import org.junit.jupiter.api.Test;
2324

2425
import java.io.InputStream;
26+
import java.nio.ByteBuffer;
2527
import java.nio.ByteOrder;
2628
import java.util.List;
2729

@@ -308,4 +310,30 @@ void shouldGenerateIrForMessageWithVariableLengthFieldWithEmbeddedLength() throw
308310
assertThat(tokens.get(dataEncIdx).encoding().primitiveType(), is(PrimitiveType.CHAR));
309311
}
310312
}
313+
314+
@Test
315+
void shouldRegenerateIrWithSameByteOrder() throws Exception
316+
{
317+
try (InputStream in = getLocalResource("example-bigendian-test-schema.xml"))
318+
{
319+
final MessageSchema schema = parse(in, ParserOptions.DEFAULT);
320+
final IrGenerator generator = new IrGenerator();
321+
final Ir firstIr = generator.generate(schema);
322+
final ByteBuffer firstIrOutputBuffer = ByteBuffer.allocate(8 * 1024);
323+
324+
final int length;
325+
try (IrEncoder firstIrEncoder = new IrEncoder(firstIrOutputBuffer, firstIr))
326+
{
327+
length = firstIrEncoder.encode();
328+
}
329+
330+
final Ir secondIr;
331+
try (IrDecoder firstIrDecoder = new IrDecoder(firstIrOutputBuffer.slice(0, length)))
332+
{
333+
secondIr = firstIrDecoder.decode();
334+
}
335+
336+
assertThat(secondIr.byteOrder(), is(firstIr.byteOrder()));
337+
}
338+
}
311339
}

0 commit comments

Comments
 (0)