File tree Expand file tree Collapse file tree 1 file changed +14
-6
lines changed Expand file tree Collapse file tree 1 file changed +14
-6
lines changed Original file line number Diff line number Diff line change @@ -44,15 +44,15 @@ void UnbufferedCharStream::consume() {
44
44
}
45
45
46
46
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 ());
51
51
}
52
52
53
53
size_t UnbufferedCharStream::fill (size_t n) {
54
54
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) {
56
56
return i;
57
57
}
58
58
@@ -87,16 +87,24 @@ size_t UnbufferedCharStream::LA(ssize_t i) {
87
87
if (i == -1 ) { // special case
88
88
return _lastChar;
89
89
}
90
- sync ((size_t )i);
90
+
91
+ // We can look back only as many chars as we have buffered.
91
92
ssize_t index = (ssize_t )_p + i - 1 ;
92
93
if (index < 0 ) {
93
94
throw IndexOutOfBoundsException ();
94
95
}
95
96
97
+ if (i > 0 ) {
98
+ sync ((size_t )i); // No need to sync if we look back.
99
+ }
96
100
if ((size_t )index >= _data.size ()) {
97
101
return EOF;
98
102
}
99
103
104
+ if (_data[(size_t )index] == (uint32_t )EOF) {
105
+ return EOF;
106
+ }
107
+
100
108
return _data[(size_t )index];
101
109
}
102
110
You can’t perform that action at this time.
0 commit comments