mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
gh-94675: Add a regression test for rjsmin re slowdown (GH-94685)
Adds a regression test for an re slowdown observed by rjsmin. Uses multiprocessing to kill the test after SHORT_TIMEOUT. Co-authored-by: Oleg Iarygin <dralife@yandex.ru> Co-authored-by: Christian Heimes <christian@python.org>
This commit is contained in:
parent
dc2757accd
commit
fe23c0061d
2 changed files with 31 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
|||
from test.support import (gc_collect, bigmemtest, _2G,
|
||||
cpython_only, captured_stdout,
|
||||
check_disallow_instantiation, is_emscripten, is_wasi)
|
||||
check_disallow_instantiation, is_emscripten, is_wasi,
|
||||
SHORT_TIMEOUT)
|
||||
import locale
|
||||
import re
|
||||
import string
|
||||
|
@ -11,6 +12,14 @@ import warnings
|
|||
from re import Scanner
|
||||
from weakref import proxy
|
||||
|
||||
# some platforms lack working multiprocessing
|
||||
try:
|
||||
import _multiprocessing
|
||||
except ImportError:
|
||||
multiprocessing = None
|
||||
else:
|
||||
import multiprocessing
|
||||
|
||||
# Misc tests from Tim Peters' re.doc
|
||||
|
||||
# WARNING: Don't change details in these tests if you don't know
|
||||
|
@ -2407,6 +2416,26 @@ class ReTests(unittest.TestCase):
|
|||
self.assertTrue(template_re1.match('ahoy'))
|
||||
self.assertFalse(template_re1.match('nope'))
|
||||
|
||||
@unittest.skipIf(multiprocessing is None, 'test requires multiprocessing')
|
||||
def test_regression_gh94675(self):
|
||||
pattern = re.compile(r'(?<=[({}])(((//[^\n]*)?[\n])([\000-\040])*)*'
|
||||
r'((/[^/\[\n]*(([^\n]|(\[\n]*(]*)*\]))'
|
||||
r'[^/\[]*)*/))((((//[^\n]*)?[\n])'
|
||||
r'([\000-\040]|(/\*[^*]*\*+'
|
||||
r'([^/*]\*+)*/))*)+(?=[^\000-\040);\]}]))')
|
||||
input_js = '''a(function() {
|
||||
///////////////////////////////////////////////////////////////////
|
||||
});'''
|
||||
p = multiprocessing.Process(target=pattern.sub, args=('', input_js))
|
||||
p.start()
|
||||
p.join(SHORT_TIMEOUT)
|
||||
try:
|
||||
self.assertFalse(p.is_alive(), 'pattern.sub() timed out')
|
||||
finally:
|
||||
if p.is_alive():
|
||||
p.terminate()
|
||||
p.join()
|
||||
|
||||
|
||||
def get_debug_out(pat):
|
||||
with captured_stdout() as out:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue