Commit 49d5b5f
committed
Reject a byte position the lexer cannot start on
`rbs_lexer_new` reaches `start_pos` by stepping one character at a time
from the beginning of the buffer, so only the first byte of a character
is a position it can stand on.
Inside a character the step goes over `start_pos` and lexing quietly
begins at the next one. Nothing downstream can tell: the walk keeps
`line`, `column` and `char_pos` consistent, so the result points at a
real position that simply is not the one asked for. The shift is caught
by accident when what it lands on cannot open a token, but an ASCII
letter right after the multibyte character parses cleanly in the wrong
place -- and #3082 gives the non-ASCII characters tokens of
their own, taking even the accident away.
Past the end of the buffer there is nothing left to step over, so the
walk never finishes: `rbs_skip` stops moving at EOF while the loop
waits for a position it will never reach. `parse_type("Integer",
byte_range: 20...30)` hangs on master.
`rbs_lexer_new` returns `NULL` for a `start_pos` it cannot reach, and
the extension turns that into an `ArgumentError` alongside the reversed
and negative ranges, since all are the caller's mistake rather than
anything about the source text. Starting past the end is plain from the
buffer's size, so the extension rejects it before parsing; a `NULL`
that comes back after that check can only mean a start inside a
character.
`end_pos` keeps taking any value: clamping with a large number instead
of measuring the buffer is ordinary, and the lexer stops at the end on
its own.1 parent 023fa8a commit 49d5b5f
4 files changed
Lines changed: 98 additions & 14 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
149 | | - | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
150 | 155 | | |
151 | 156 | | |
152 | 157 | | |
153 | 158 | | |
154 | 159 | | |
155 | 160 | | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
156 | 166 | | |
157 | 167 | | |
158 | 168 | | |
159 | | - | |
| 169 | + | |
160 | 170 | | |
161 | 171 | | |
162 | 172 | | |
163 | | - | |
| 173 | + | |
164 | 174 | | |
165 | 175 | | |
166 | 176 | | |
167 | 177 | | |
168 | 178 | | |
169 | 179 | | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
170 | 186 | | |
171 | 187 | | |
172 | 188 | | |
173 | | - | |
174 | | - | |
175 | 189 | | |
176 | 190 | | |
177 | 191 | | |
| 192 | + | |
| 193 | + | |
178 | 194 | | |
179 | 195 | | |
180 | 196 | | |
181 | | - | |
| 197 | + | |
182 | 198 | | |
183 | 199 | | |
184 | 200 | | |
185 | 201 | | |
186 | 202 | | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
187 | 209 | | |
188 | 210 | | |
189 | 211 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
89 | 89 | | |
90 | 90 | | |
91 | 91 | | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
92 | 97 | | |
93 | | - | |
| 98 | + | |
94 | 99 | | |
95 | 100 | | |
96 | 101 | | |
97 | 102 | | |
98 | 103 | | |
99 | 104 | | |
100 | 105 | | |
| 106 | + | |
| 107 | + | |
101 | 108 | | |
102 | | - | |
| 109 | + | |
103 | 110 | | |
104 | 111 | | |
105 | 112 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3539 | 3539 | | |
3540 | 3540 | | |
3541 | 3541 | | |
3542 | | - | |
3543 | | - | |
3544 | | - | |
3545 | | - | |
| 3542 | + | |
| 3543 | + | |
| 3544 | + | |
| 3545 | + | |
| 3546 | + | |
3546 | 3547 | | |
3547 | 3548 | | |
| 3549 | + | |
| 3550 | + | |
| 3551 | + | |
| 3552 | + | |
| 3553 | + | |
3548 | 3554 | | |
3549 | 3555 | | |
3550 | 3556 | | |
| |||
3554 | 3560 | | |
3555 | 3561 | | |
3556 | 3562 | | |
| 3563 | + | |
| 3564 | + | |
| 3565 | + | |
| 3566 | + | |
| 3567 | + | |
3557 | 3568 | | |
3558 | 3569 | | |
3559 | 3570 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1019 | 1019 | | |
1020 | 1020 | | |
1021 | 1021 | | |
1022 | | - | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
1023 | 1025 | | |
1024 | 1026 | | |
1025 | 1027 | | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
1026 | 1039 | | |
1027 | | - | |
| 1040 | + | |
1028 | 1041 | | |
1029 | 1042 | | |
1030 | 1043 | | |
1031 | 1044 | | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
1032 | 1076 | | |
0 commit comments