Skip to content

Commit 8d10a01

Browse files
gh-158780: Collect header defects without repeated copying
1 parent 69efd73 commit 8d10a01

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

‎Lib/email/_header_value_parser.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ def value(self):
152152

153153
@property
154154
def all_defects(self):
155-
return sum((x.all_defects for x in self), self.defects)
155+
if not self:
156+
return self.defects
157+
return self.defects + [
158+
defect for token in self for defect in token.all_defects]
156159

157160
def startswith_fws(self):
158161
return self[0].startswith_fws()

‎Lib/test/test_email/test__header_value_parser.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,23 @@
77

88
class TestTokens(TestEmailBase):
99

10+
# TokenList
11+
12+
def test_all_defects_empty(self):
13+
token = parser.TokenList()
14+
self.assertIs(token.all_defects, token.defects)
15+
token.defects.append(errors.InvalidHeaderDefect())
16+
self.assertIs(token.all_defects, token.defects)
17+
18+
def test_all_defects(self):
19+
leaf = parser.ValueTerminal('text\x00', 'utext')
20+
leaf.defects.append(errors.NonPrintableDefect('\x00'))
21+
token = parser.TokenList([parser.TokenList([leaf]), leaf])
22+
token.defects.append(errors.InvalidHeaderDefect())
23+
self.assertEqual(token.all_defects, token.defects + leaf.defects * 2)
24+
self.assertEqual(len(token.defects), 1)
25+
self.assertEqual(len(leaf.defects), 1)
26+
1027
# EWWhiteSpaceTerminal
1128

1229
def test_EWWhiteSpaceTerminal(self):

0 commit comments

Comments
 (0)