Skip to content

Commit 05dad18

Browse files
authored
Merge pull request antlr#1690 from mike-lischke/master
Fixed a number of data type + signedness issues in the C++ target
2 parents 4ec294f + cd6bb1f commit 05dad18

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

runtime/Cpp/runtime/src/UnbufferedCharStream.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ void UnbufferedCharStream::consume() {
4444
}
4545

4646
void UnbufferedCharStream::sync(size_t want) {
47-
size_t need = (_p + want - 1) - _data.size() + 1; // how many more elements we need?
48-
if (need > 0) {
49-
fill(need);
50-
}
47+
if (_p + want <= _data.size()) // Already enough data loaded?
48+
return;
49+
50+
fill(_p + want - _data.size());
5151
}
5252

5353
size_t UnbufferedCharStream::fill(size_t n) {
5454
for (size_t i = 0; i < n; i++) {
55-
if (_data.size() > 0 && (size_t)_data.back() == EOF) {
55+
if (_data.size() > 0 && _data.back() == (uint32_t)EOF) {
5656
return i;
5757
}
5858

@@ -87,16 +87,24 @@ size_t UnbufferedCharStream::LA(ssize_t i) {
8787
if (i == -1) { // special case
8888
return _lastChar;
8989
}
90-
sync((size_t)i);
90+
91+
// We can look back only as many chars as we have buffered.
9192
ssize_t index = (ssize_t)_p + i - 1;
9293
if (index < 0) {
9394
throw IndexOutOfBoundsException();
9495
}
9596

97+
if (i > 0) {
98+
sync((size_t)i); // No need to sync if we look back.
99+
}
96100
if ((size_t)index >= _data.size()) {
97101
return EOF;
98102
}
99103

104+
if (_data[(size_t)index] == (uint32_t)EOF) {
105+
return EOF;
106+
}
107+
100108
return _data[(size_t)index];
101109
}
102110

0 commit comments

Comments
 (0)