Skip to content

Commit 586db7a

Browse files
author
Dale Wilson
committed
Generate symbolic names for null-value literals that confuse the VC compiler.
1 parent 1254aed commit 586db7a

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

main/java/uk/co/real_logic/sbe/generation/cpp98/Cpp98Generator.java

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -841,9 +841,11 @@ private CharSequence generatePrimitiveFieldMetaData(final String propertyName, f
841841
{
842842
final StringBuilder sb = new StringBuilder();
843843

844-
final PrimitiveType primitiveType = token.encoding().primitiveType();
844+
final Encoding encoding = token.encoding();
845+
final PrimitiveType primitiveType = encoding.primitiveType();
845846
final String cpp98TypeName = cpp98TypeName(primitiveType);
846-
847+
final CharSequence nullValueString = generateNullValueLiteral(primitiveType, encoding);
848+
847849
sb.append(String.format(
848850
"\n" +
849851
indent + " static const %1$s %2$sNullValue()\n" +
@@ -852,7 +854,7 @@ private CharSequence generatePrimitiveFieldMetaData(final String propertyName, f
852854
indent + " }\n",
853855
cpp98TypeName,
854856
propertyName,
855-
generateLiteral(primitiveType, token.encoding().applicableNullValue().toString())
857+
nullValueString
856858
));
857859

858860
sb.append(String.format(
@@ -1432,6 +1434,40 @@ private Object generateCompositeProperty(final String propertyName, final Token
14321434
return sb;
14331435
}
14341436

1437+
private CharSequence generateNullValueLiteral(final PrimitiveType primitiveType, final Encoding encoding)
1438+
{
1439+
// Visual C++ does not handle minimum integer values properly
1440+
// See: http://msdn.microsoft.com/en-us/library/4kh09110.aspx
1441+
// So some of the null values get special handling
1442+
if(null == encoding.nullValue())
1443+
{
1444+
switch (primitiveType)
1445+
{
1446+
case CHAR:
1447+
case FLOAT:
1448+
case DOUBLE:
1449+
break; // no special handling
1450+
case INT8:
1451+
return "SCHAR_MIN";
1452+
case INT16:
1453+
return "SHRT_MIN";
1454+
case INT32:
1455+
return "LONG_MIN";
1456+
case INT64:
1457+
return "LLONG_MIN";
1458+
case UINT8:
1459+
return "UCHAR_MAX";
1460+
case UINT16:
1461+
return "USHRT_MAX";
1462+
case UINT32:
1463+
return "ULONG_MAX";
1464+
case UINT64:
1465+
return "ULLONG_MAX";
1466+
}
1467+
}
1468+
return generateLiteral(primitiveType, encoding.applicableNullValue().toString());
1469+
}
1470+
14351471
private CharSequence generateLiteral(final PrimitiveType type, final String value)
14361472
{
14371473
String literal = "";

0 commit comments

Comments
 (0)