Skip to content

Commit 50198c9

Browse files
committed
[CSharp] Recover codec state after ToString().
Previously, the `ToString()` call would fail or complete but alter the state of the codec such that it was in a terminal state. Now, we treat `codecState` much like `limit` and recover the original value before returning control from `ToString()`.
1 parent 932e35b commit 50198c9

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ public void generate() throws IOException
167167

168168
out.append(generateVarData(accessOrderModel, varData, BASE_INDENT + INDENT));
169169

170-
out.append(generateDisplay(toUpperFirstChar(msgToken.name()), fields, groups, varData));
170+
out.append(generateDisplay(toUpperFirstChar(msgToken.name()),
171+
fields, groups, varData, accessOrderModel));
171172

172173
out.append(INDENT + "}\n");
173174
out.append("}\n");
@@ -2378,7 +2379,8 @@ private CharSequence generateDisplay(
23782379
final String name,
23792380
final List<Token> tokens,
23802381
final List<Token> groups,
2381-
final List<Token> varData)
2382+
final List<Token> varData,
2383+
final AccessOrderModel accessOrderModel)
23822384
{
23832385
final StringBuilder sb = new StringBuilder(100);
23842386

@@ -2392,6 +2394,12 @@ private CharSequence generateDisplay(
23922394
append(sb, TWO_INDENT, " }");
23932395
sb.append('\n');
23942396
append(sb, TWO_INDENT, " int originalLimit = this.Limit;");
2397+
sb.append("#if ENABLE_ACCESS_ORDER_CHECKS\n");
2398+
append(sb, TWO_INDENT, " CodecState originalState = _codecState;");
2399+
sb.append(THREE_INDENT).append("_codecState = ")
2400+
.append(qualifiedStateCase(accessOrderModel.notWrappedState())).append(";\n");
2401+
append(sb, TWO_INDENT, " OnWrapForDecode(_actingVersion);");
2402+
sb.append("#endif\n");
23952403
append(sb, TWO_INDENT, " this.Limit = _offset + _actingBlockLength;");
23962404
append(sb, TWO_INDENT, " builder.Append(\"[" + name + "](sbeTemplateId=\");");
23972405
append(sb, TWO_INDENT, " builder.Append(" + name + ".TemplateId);");
@@ -2415,6 +2423,9 @@ private CharSequence generateDisplay(
24152423
sb.append('\n');
24162424
appendDisplay(sb, tokens, groups, varData, THREE_INDENT);
24172425
sb.append('\n');
2426+
sb.append("#if ENABLE_ACCESS_ORDER_CHECKS\n");
2427+
append(sb, TWO_INDENT, " _codecState = originalState;");
2428+
sb.append("#endif\n");
24182429
append(sb, TWO_INDENT, " this.Limit = originalLimit;");
24192430
sb.append('\n');
24202431
append(sb, TWO_INDENT, "}");

0 commit comments

Comments
 (0)