Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4beee0c

Browse files
authored
gh-91404: Revert "bpo-23689: re module, fix memory leak when a match is terminated by a signal or allocation failure (GH-32283) (#93882)
Revert "bpo-23689: re module, fix memory leak when a match is terminated by a signal or memory allocation failure (GH-32283)"This reverts commit6e3eee5.Manual fixups to increase the MAGIC number and to handle conflicts witha couple of changes that landed after that.Thanks for reviews by Ma Lin and Serhiy Storchaka.
1 parent538f289 commit4beee0c

File tree

9 files changed

+74
-146
lines changed

9 files changed

+74
-146
lines changed

‎Lib/re/_compiler.py‎

Lines changed: 21 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,14 @@
2828
POSSESSIVE_REPEAT: (POSSESSIVE_REPEAT,SUCCESS,POSSESSIVE_REPEAT_ONE),
2929
}
3030

31-
class_CompileData:
32-
__slots__= ('code','repeat_count')
33-
def__init__(self):
34-
self.code= []
35-
self.repeat_count=0
36-
3731
def_combine_flags(flags,add_flags,del_flags,
3832
TYPE_FLAGS=_parser.TYPE_FLAGS):
3933
ifadd_flags&TYPE_FLAGS:
4034
flags&=~TYPE_FLAGS
4135
return (flags|add_flags)&~del_flags
4236

43-
def_compile(data,pattern,flags):
37+
def_compile(code,pattern,flags):
4438
# internal: compile a (sub)pattern
45-
code=data.code
4639
emit=code.append
4740
_len=len
4841
LITERAL_CODES=_LITERAL_CODES
@@ -115,19 +108,15 @@ def _compile(data, pattern, flags):
115108
skip=_len(code);emit(0)
116109
emit(av[0])
117110
emit(av[1])
118-
_compile(data,av[2],flags)
111+
_compile(code,av[2],flags)
119112
emit(SUCCESS)
120113
code[skip]=_len(code)-skip
121114
else:
122115
emit(REPEATING_CODES[op][0])
123116
skip=_len(code);emit(0)
124117
emit(av[0])
125118
emit(av[1])
126-
# now op is in (MIN_REPEAT, MAX_REPEAT, POSSESSIVE_REPEAT)
127-
ifop!=POSSESSIVE_REPEAT:
128-
emit(data.repeat_count)
129-
data.repeat_count+=1
130-
_compile(data,av[2],flags)
119+
_compile(code,av[2],flags)
131120
code[skip]=_len(code)-skip
132121
emit(REPEATING_CODES[op][1])
133122
elifopisSUBPATTERN:
@@ -136,7 +125,7 @@ def _compile(data, pattern, flags):
136125
emit(MARK)
137126
emit((group-1)*2)
138127
# _compile_info(code, p, _combine_flags(flags, add_flags, del_flags))
139-
_compile(data,p,_combine_flags(flags,add_flags,del_flags))
128+
_compile(code,p,_combine_flags(flags,add_flags,del_flags))
140129
ifgroup:
141130
emit(MARK)
142131
emit((group-1)*2+1)
@@ -148,7 +137,7 @@ def _compile(data, pattern, flags):
148137
# pop their stack if they reach it
149138
emit(ATOMIC_GROUP)
150139
skip=_len(code);emit(0)
151-
_compile(data,av,flags)
140+
_compile(code,av,flags)
152141
emit(SUCCESS)
153142
code[skip]=_len(code)-skip
154143
elifopinSUCCESS_CODES:
@@ -163,7 +152,7 @@ def _compile(data, pattern, flags):
163152
iflo!=hi:
164153
raiseerror("look-behind requires fixed-width pattern")
165154
emit(lo)# look behind
166-
_compile(data,av[1],flags)
155+
_compile(code,av[1],flags)
167156
emit(SUCCESS)
168157
code[skip]=_len(code)-skip
169158
elifopisAT:
@@ -182,7 +171,7 @@ def _compile(data, pattern, flags):
182171
foravinav[1]:
183172
skip=_len(code);emit(0)
184173
# _compile_info(code, av, flags)
185-
_compile(data,av,flags)
174+
_compile(code,av,flags)
186175
emit(JUMP)
187176
tailappend(_len(code));emit(0)
188177
code[skip]=_len(code)-skip
@@ -210,12 +199,12 @@ def _compile(data, pattern, flags):
210199
emit(op)
211200
emit(av[0]-1)
212201
skipyes=_len(code);emit(0)
213-
_compile(data,av[1],flags)
202+
_compile(code,av[1],flags)
214203
ifav[2]:
215204
emit(JUMP)
216205
skipno=_len(code);emit(0)
217206
code[skipyes]=_len(code)-skipyes+1
218-
_compile(data,av[2],flags)
207+
_compile(code,av[2],flags)
219208
code[skipno]=_len(code)-skipno
220209
else:
221210
code[skipyes]=_len(code)-skipyes+1
@@ -582,17 +571,17 @@ def isstring(obj):
582571
def_code(p,flags):
583572

584573
flags=p.state.flags|flags
585-
data=_CompileData()
574+
code=[]
586575

587576
# compile info block
588-
_compile_info(data.code,p,flags)
577+
_compile_info(code,p,flags)
589578

590579
# compile the pattern
591-
_compile(data,p.data,flags)
580+
_compile(code,p.data,flags)
592581

593-
data.code.append(SUCCESS)
582+
code.append(SUCCESS)
594583

595-
returndata
584+
returncode
596585

597586
def_hex_code(code):
598587
return'[%s]'%', '.join('%#0*x'% (_sre.CODESIZE*2+2,x)forxincode)
@@ -693,21 +682,14 @@ def print_2(*args):
693682
else:
694683
print_(FAILURE)
695684
i+=1
696-
elifopin (REPEAT_ONE,MIN_REPEAT_ONE,
685+
elifopin (REPEAT,REPEAT_ONE,MIN_REPEAT_ONE,
697686
POSSESSIVE_REPEAT,POSSESSIVE_REPEAT_ONE):
698687
skip,min,max=code[i:i+3]
699688
ifmax==MAXREPEAT:
700689
max='MAXREPEAT'
701690
print_(op,skip,min,max,to=i+skip)
702691
dis_(i+3,i+skip)
703692
i+=skip
704-
elifopisREPEAT:
705-
skip,min,max,repeat_index=code[i:i+4]
706-
ifmax==MAXREPEAT:
707-
max='MAXREPEAT'
708-
print_(op,skip,min,max,repeat_index,to=i+skip)
709-
dis_(i+4,i+skip)
710-
i+=skip
711693
elifopisGROUPREF_EXISTS:
712694
arg,skip=code[i:i+2]
713695
print_(op,arg,skip,to=i+skip)
@@ -762,11 +744,11 @@ def compile(p, flags=0):
762744
else:
763745
pattern=None
764746

765-
data=_code(p,flags)
747+
code=_code(p,flags)
766748

767749
ifflags&SRE_FLAG_DEBUG:
768750
print()
769-
dis(data.code)
751+
dis(code)
770752

771753
# map in either direction
772754
groupindex=p.state.groupdict
@@ -775,6 +757,7 @@ def compile(p, flags=0):
775757
indexgroup[i]=k
776758

777759
return_sre.compile(
778-
pattern,flags|p.state.flags,data.code,
779-
p.state.groups-1,groupindex,tuple(indexgroup),
780-
data.repeat_count)
760+
pattern,flags|p.state.flags,code,
761+
p.state.groups-1,
762+
groupindex,tuple(indexgroup)
763+
)

‎Lib/re/_constants.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
# update when constants are added or removed
1515

16-
MAGIC=20220423
16+
MAGIC=20220615
1717

1818
from_sreimportMAXREPEAT,MAXGROUPS
1919

‎Lib/test/test_re.py‎

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,12 +1765,9 @@ def test_dealloc(self):
17651765
long_overflow=2**128
17661766
self.assertRaises(TypeError,re.finditer,"a", {})
17671767
withself.assertRaises(OverflowError):
1768-
_sre.compile("abc",0, [long_overflow],0, {}, (),0)
1768+
_sre.compile("abc",0, [long_overflow],0, {}, ())
17691769
withself.assertRaises(TypeError):
1770-
_sre.compile({},0, [],0, [], [],0)
1771-
withself.assertRaises(RuntimeError):
1772-
# invalid repeat_count -1
1773-
_sre.compile("abc",0, [1],0, {}, (),-1)
1770+
_sre.compile({},0, [],0, [], [])
17741771

17751772
deftest_search_dot_unicode(self):
17761773
self.assertTrue(re.search("123.*-",'123abc-'))
@@ -2509,27 +2506,6 @@ def test_possesive_repeat(self):
25092506
14. SUCCESS
25102507
''')
25112508

2512-
deftest_repeat_index(self):
2513-
self.assertEqual(get_debug_out(r'(?:ab)*?(?:cd)*'),'''\
2514-
MIN_REPEAT 0 MAXREPEAT
2515-
LITERAL 97
2516-
LITERAL 98
2517-
MAX_REPEAT 0 MAXREPEAT
2518-
LITERAL 99
2519-
LITERAL 100
2520-
2521-
0. INFO 4 0b0 0 MAXREPEAT (to 5)
2522-
5: REPEAT 8 0 MAXREPEAT 0 (to 14)
2523-
10. LITERAL 0x61 ('a')
2524-
12. LITERAL 0x62 ('b')
2525-
14: MIN_UNTIL
2526-
15. REPEAT 8 0 MAXREPEAT 1 (to 24)
2527-
20. LITERAL 0x63 ('c')
2528-
22. LITERAL 0x64 ('d')
2529-
24: MAX_UNTIL
2530-
25. SUCCESS
2531-
''')
2532-
25332509

25342510
classPatternReprTests(unittest.TestCase):
25352511
defcheck(self,pattern,expected):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Revert the:mod:`re` memory leak when a match is terminated by a signal or
2+
memory allocation failure as the implemented fix caused a major performance
3+
regression.

‎Modules/_sre/clinic/sre.c.h‎

Lines changed: 7 additions & 20 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp