HLSL: Support 1.#INF and -1.#INF syntax.

This commit is contained in:
John Kessenich
2017-04-12 13:26:57 -06:00
parent b5e739c20e
commit 776c515ea5
8 changed files with 256 additions and 16 deletions

View File

@@ -92,7 +92,7 @@ namespace glslang {
class TPpToken {
public:
TPpToken() : space(false), ival(0), dval(0.0), i64val(0)
TPpToken() : space(false), i64val(0)
{
loc.init();
name[0] = 0;
@@ -108,10 +108,14 @@ public:
bool operator!=(const TPpToken& right) { return ! operator==(right); }
TSourceLoc loc;
bool space; // true if a space (for white space or a removed comment) should also be recognized, in front of the token returned
int ival;
double dval;
long long i64val;
bool space; // true if a space (for white space or a removed comment) should also be recognized, in front of the token returned
union {
int ival;
double dval;
long long i64val;
};
char name[MaxTokenLength + 1];
};

View File

@@ -124,6 +124,35 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
HasDecimalOrExponent = true;
saveName(ch);
ch = getChar();
// 1.#INF or -1.#INF
if (ch == '#') {
if ((len < 2) ||
(len == 2 && ppToken->name[0] != '1') ||
(len == 3 && ppToken->name[1] != '1' && !(ppToken->name[0] == '-' || ppToken->name[0] == '+')) ||
(len > 3))
parseContext.ppError(ppToken->loc, "unexpected use of", "#", "");
else {
// we have 1.# or -1.# or +1.#, check for 'INF'
if ((ch = getChar()) != 'I' ||
(ch = getChar()) != 'N' ||
(ch = getChar()) != 'F')
parseContext.ppError(ppToken->loc, "expected 'INF'", "#", "");
else {
// we have [+-].#INF, and we are targeting IEEE 754, so wrap it up:
saveName('I');
saveName('N');
saveName('F');
ppToken->name[len] = '\0';
if (ppToken->name[0] == '-')
ppToken->i64val = 0xfff0000000000000; // -Infinity
else
ppToken->i64val = 0x7ff0000000000000; // +Infinity
return PpAtomConstFloat;
}
}
}
while (ch >= '0' && ch <= '9') {
saveName(ch);
ch = getChar();