@@ -132,14 +132,15 @@ pub fn (ss &TextScanner) peek_u8() u8 {
132
132
// ts.peek_n(1) == ts.peek() .
133
133
@[direct_array_access; inline]
134
134
pub fn (ss &TextScanner) peek_n (n int ) int {
135
- if ss.pos + n < ss.ilen {
136
- if ss.config.force_rune_mode {
137
- return int (ss.input_runes[ss.pos + n])
138
- } else {
139
- return ss.input_bytes[ss.pos + n]
140
- }
135
+ new_pos := ss.pos + n
136
+ if new_pos < 0 || new_pos > = ss.ilen {
137
+ return - 1
138
+ }
139
+ if ss.config.force_rune_mode {
140
+ return int (ss.input_runes[ss.pos + n])
141
+ } else {
142
+ return ss.input_bytes[ss.pos + n]
141
143
}
142
- return - 1
143
144
}
144
145
145
146
// peek_n_u8 returns the character code from the input text, at position + `n`,
@@ -149,14 +150,15 @@ pub fn (ss &TextScanner) peek_n(n int) int {
149
150
// legitimately contain bytes with value `0`.
150
151
@[direct_array_access; inline]
151
152
pub fn (ss &TextScanner) peek_n_u8 (n int ) u8 {
152
- if ss.pos + n < ss.ilen {
153
- if ss.config.force_rune_mode {
154
- return u8 (ss.input_runes[ss.pos + n])
155
- } else {
156
- return ss.input_bytes[ss.pos + n]
157
- }
153
+ new_pos := ss.pos + n
154
+ if new_pos < 0 || new_pos > = ss.ilen {
155
+ return 0
156
+ }
157
+ if ss.config.force_rune_mode {
158
+ return u8 (ss.input_runes[ss.pos + n])
159
+ } else {
160
+ return ss.input_bytes[ss.pos + n]
158
161
}
159
- return 0
160
162
}
161
163
162
164
// back goes back one character from the current scanner position.
0 commit comments