Fix the infinite loop when an input file lacks EOF
The input scanner can be trapped in an infinite loop if the given input file does not have EOF (and is not ended with a 'whitespace'). The problem is caused by unget(), which keeps rolling back the scanner pointer without hitting an EOF at the end of the file. This makes getch() function keep returning the last character of the file and never ends, and the effect of advance() is always counteracted by unget().
This commit is contained in:
parent
ba00f67d2f
commit
19647a32b9
2
Test/baseResults/preprocessor.eof_missing.vert.out
Normal file
2
Test/baseResults/preprocessor.eof_missing.vert.out
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
noEOF
|
||||||
|
|
1
Test/preprocessor.eof_missing.vert
Normal file
1
Test/preprocessor.eof_missing.vert
Normal file
@ -0,0 +1 @@
|
|||||||
|
noEOF
|
@ -13,3 +13,4 @@ preprocessor.simple.vert
|
|||||||
preprocessor.success_if_parse_would_fail.vert
|
preprocessor.success_if_parse_would_fail.vert
|
||||||
preprocessor.defined.vert
|
preprocessor.defined.vert
|
||||||
preprocessor.many.endif.vert
|
preprocessor.many.endif.vert
|
||||||
|
preprocessor.eof_missing.vert
|
||||||
|
@ -54,7 +54,7 @@ public:
|
|||||||
TInputScanner(int n, const char* const s[], size_t L[], const char* const* names = nullptr, int b = 0, int f = 0, bool single = false) :
|
TInputScanner(int n, const char* const s[], size_t L[], const char* const* names = nullptr, int b = 0, int f = 0, bool single = false) :
|
||||||
numSources(n),
|
numSources(n),
|
||||||
sources(reinterpret_cast<const unsigned char* const *>(s)), // up to this point, common usage is "char*", but now we need positive 8-bit characters
|
sources(reinterpret_cast<const unsigned char* const *>(s)), // up to this point, common usage is "char*", but now we need positive 8-bit characters
|
||||||
lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f), singleLogical(single)
|
lengths(L), currentSource(0), currentChar(0), stringBias(b), finale(f), singleLogical(single), endOfFileReached(false)
|
||||||
{
|
{
|
||||||
loc = new TSourceLoc[numSources];
|
loc = new TSourceLoc[numSources];
|
||||||
for (int i = 0; i < numSources; ++i) {
|
for (int i = 0; i < numSources; ++i) {
|
||||||
@ -81,10 +81,8 @@ public:
|
|||||||
// retrieve the next character and advance one character
|
// retrieve the next character and advance one character
|
||||||
int get()
|
int get()
|
||||||
{
|
{
|
||||||
if (currentSource >= numSources)
|
|
||||||
return EndOfInput;
|
|
||||||
|
|
||||||
int ret = peek();
|
int ret = peek();
|
||||||
|
if (ret == EndOfInput) return ret;
|
||||||
++loc[currentSource].column;
|
++loc[currentSource].column;
|
||||||
++logicalSourceLoc.column;
|
++logicalSourceLoc.column;
|
||||||
if (ret == '\n') {
|
if (ret == '\n') {
|
||||||
@ -101,8 +99,10 @@ public:
|
|||||||
// retrieve the next character, no advance
|
// retrieve the next character, no advance
|
||||||
int peek()
|
int peek()
|
||||||
{
|
{
|
||||||
if (currentSource >= numSources)
|
if (currentSource >= numSources) {
|
||||||
|
endOfFileReached = true;
|
||||||
return EndOfInput;
|
return EndOfInput;
|
||||||
|
}
|
||||||
// Make sure we do not read off the end of a string.
|
// Make sure we do not read off the end of a string.
|
||||||
// N.B. Sources can have a length of 0.
|
// N.B. Sources can have a length of 0.
|
||||||
int sourceToRead = currentSource;
|
int sourceToRead = currentSource;
|
||||||
@ -122,6 +122,9 @@ public:
|
|||||||
// go back one character
|
// go back one character
|
||||||
void unget()
|
void unget()
|
||||||
{
|
{
|
||||||
|
// Do not roll back if we reached the end of the file.
|
||||||
|
if (endOfFileReached) return;
|
||||||
|
|
||||||
if (currentChar > 0) {
|
if (currentChar > 0) {
|
||||||
--currentChar;
|
--currentChar;
|
||||||
--loc[currentSource].column;
|
--loc[currentSource].column;
|
||||||
@ -251,6 +254,8 @@ protected:
|
|||||||
TSourceLoc logicalSourceLoc;
|
TSourceLoc logicalSourceLoc;
|
||||||
bool singleLogical; // treats the strings as a single logical string.
|
bool singleLogical; // treats the strings as a single logical string.
|
||||||
// locations will be reported from the first string.
|
// locations will be reported from the first string.
|
||||||
|
|
||||||
|
bool endOfFileReached; // set to true once peak() returns EndOfFile.
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace glslang
|
} // end namespace glslang
|
||||||
|
Loading…
x
Reference in New Issue
Block a user