Skip to content

Commit 75df462

Browse files
committed
[Java] Avoid checking parentMessage.actingVersion inside composite.
Most not present conditions were already elided via `generateFieldNotPresentCondition(inComposite=true, ...)` but the condition within the wrap method was not. Here's an example of a failing schema found with the DTO property-based tests: ``` <?xml version="1.0" encoding="UTF-8" standalone="no"?> <sbe:messageSchema id="42" package="uk.co.real_logic.sbe.properties" version="1" xmlns:sbe="http://fixprotocol.io/2016/sbe"> <types> <composite name="messageHeader"> <type name="blockLength" primitiveType="uint16"/> <type name="templateId" primitiveType="uint16"/> <type name="schemaId" primitiveType="uint16"/> <type name="version" primitiveType="uint16"/> </composite> <composite name="groupSizeEncoding"> <type name="blockLength" primitiveType="uint16"/> <type name="numInGroup" primitiveType="uint16"/> </composite> <composite name="Type1"> <type length="2" name="member0OfType0" presence="required" primitiveType="uint8"/> </composite> </types> <sbe:message id="1" name="TestMessage"> <field id="0" name="member0" presence="optional" sinceVersion="1" type="Type1"/> </sbe:message> </sbe:messageSchema> ``` And generated code (within a composite without a `parentMessage`): ``` public void wrapMember0OfType0(final DirectBuffer wrapBuffer) { if (parentMessage.actingVersion < 1) { wrapBuffer.wrap(buffer, offset, 0); return; } wrapBuffer.wrap(buffer, offset + 0, 2); } ```
1 parent 41f4b0e commit 75df462

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/java/JavaGenerator.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,7 +1665,7 @@ private void generateVarDataWrapDecoder(
16651665
indent + " }\n",
16661666
propertyName,
16671667
readOnlyBuffer,
1668-
generateWrapFieldNotPresentCondition(token.version(), indent),
1668+
generateWrapFieldNotPresentCondition(false, token.version(), indent),
16691669
accessOrderListenerCall,
16701670
sizeOfLengthField,
16711671
PrimitiveType.UINT32 == lengthType ? "(int)" : "",
@@ -2671,9 +2671,12 @@ private CharSequence generatePrimitivePropertyEncode(
26712671
generatePut(encoding.primitiveType(), "offset + " + offset, "value", byteOrderStr));
26722672
}
26732673

2674-
private CharSequence generateWrapFieldNotPresentCondition(final int sinceVersion, final String indent)
2674+
private CharSequence generateWrapFieldNotPresentCondition(
2675+
final boolean inComposite,
2676+
final int sinceVersion,
2677+
final String indent)
26752678
{
2676-
if (0 == sinceVersion)
2679+
if (inComposite || 0 == sinceVersion)
26772680
{
26782681
return "";
26792682
}
@@ -2925,7 +2928,7 @@ else if (encoding.primitiveType() == PrimitiveType.UINT8)
29252928
indent + " }\n",
29262929
Generators.toUpperFirstChar(propertyName),
29272930
readOnlyBuffer,
2928-
generateWrapFieldNotPresentCondition(propertyToken.version(), indent),
2931+
generateWrapFieldNotPresentCondition(inComposite, propertyToken.version(), indent),
29292932
accessOrderListenerCall,
29302933
offset,
29312934
fieldLength);

0 commit comments

Comments
 (0)