Skip to content

Commit 12e11ac

Browse files
Merge pull request #50 from MarcellPerger1/fix-hex-escape
Fix crash in negative hex escape
2 parents aebd6c3 + 2af75c4 commit 12e11ac

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

parser/astgen/eval_literal.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,12 @@ def _handle_hex_escape(self, length, i, start_i):
6464
raise self.err(
6565
f"Unterminated escape in string (expected {length}"
6666
f" hex digits)", StrRegion(start_i, i))
67-
try:
68-
value = int(digits, base=16)
69-
except ValueError:
67+
if set(digits) - _HEX_DIGITS:
7068
# Just report entire escape as error region
7169
raise self.err(
7270
f"Invalid escape in string (expected {length} hex digits)",
73-
StrRegion(start_i, i)) from None
71+
StrRegion(start_i, i))
72+
value = int(digits, base=16) # Should never be error here (only hex digits here)
7473
return chr(value), i
7574

7675
# the Very Special Case: \N{......}
@@ -129,3 +128,4 @@ def err(self, msg: str, subregion: StrRegion):
129128
'u': 4, # \uHHHH
130129
'U': 8, # \Uhhhhhhhh
131130
}
131+
_HEX_DIGITS = set('0123456789abcdef')

test/coverage/inject_me.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,28 @@ function linkifyRow(tr) {
3636
function linkifyAll() {
3737
document.querySelectorAll('tr.region').forEach(linkifyRow);
3838
}
39+
const PREVENT_FILTER_TOTAL = true;
40+
function preventUpdateTotalCell(cell) {
41+
let target = cell.classList;
42+
let oldContains = target.contains.bind(target);
43+
function newContains(value) {
44+
// Tell the Coverage.py code that all entries in total row are 'name'
45+
// so it doesn't try to modify them.
46+
if (value == "name") return true;
47+
return oldContains(value);
48+
}
49+
target.contains = newContains;
50+
}
51+
function preventUpdateTotal() {
52+
[...document.querySelector('table.index').tFoot.rows[0].cells]
53+
.forEach(preventUpdateTotalCell);
54+
}
3955
addEventListener('load', () => {
4056
if(document.body.classList.contains("indexfile")) {
4157
setColors();
4258
linkifyAll();
59+
if(PREVENT_FILTER_TOTAL) {
60+
preventUpdateTotal();
61+
}
4362
}
4463
});

test/test_eval_literal.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ def test_error(self):
6969
r'tests would break}"', StrRegion(3, 3 + 73))
7070
self.assertContains(msg.lower(), "unknown unicode character name")
7171

72+
def test_bad_hex_escape_2(self):
73+
msg = self._assert_err_and_region(r'"\x-9"', StrRegion(3, 7))
74+
self.assertContains(msg, "expected 2")
75+
76+
msg = self._assert_err_and_region(r'"\u 4fe1"', StrRegion(3, 9))
77+
self.assertContains(msg, "expected 4")
78+
7279
def test_py_consistency(self):
7380
base = r'a\\\a\b\v\f\0\n\rq\t' '\\"' "\\'"
7481
for x in (*range(0, 34, 3), *range(34, 256, 9), 255):

0 commit comments

Comments
 (0)