bpo-40334: Rename PyConfig.use_peg to _use_peg_parser (GH-19670)
* Rename PyConfig.use_peg to _use_peg_parser * Document PyConfig._use_peg_parser and mark it a deprecated * Mark -X oldparser option and PYTHONOLDPARSER env var as deprecated in the documentation. * Add use_old_parser() and skip_if_new_parser() to test.support * Remove sys.flags.use_peg: use_old_parser() uses _testinternalcapi.get_configs() instead. * Enhance test_embed tests * subprocess._args_from_interpreter_flags() copies -X oldparser
This commit is contained in:
parent
a25f3c4c8f
commit
1def7754b7
|
@ -686,6 +686,16 @@ PyConfig
|
||||||
|
|
||||||
:data:`sys._xoptions`.
|
:data:`sys._xoptions`.
|
||||||
|
|
||||||
|
.. c:member:: int _use_peg_parser
|
||||||
|
|
||||||
|
Enable PEG parser? Default: 1.
|
||||||
|
|
||||||
|
Set to 0 by :option:`-X oldparser <-X>` and :envvar:`PYTHONOLDPARSER`.
|
||||||
|
|
||||||
|
See also :pep:`617`.
|
||||||
|
|
||||||
|
.. deprecated-removed:: 3.9 3.10
|
||||||
|
|
||||||
If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same
|
If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same
|
||||||
way the regular Python parses command line arguments, and Python
|
way the regular Python parses command line arguments, and Python
|
||||||
arguments are stripped from ``argv``: see :ref:`Command Line Arguments
|
arguments are stripped from ``argv``: see :ref:`Command Line Arguments
|
||||||
|
|
|
@ -427,7 +427,7 @@ Miscellaneous options
|
||||||
|
|
||||||
* ``-X faulthandler`` to enable :mod:`faulthandler`;
|
* ``-X faulthandler`` to enable :mod:`faulthandler`;
|
||||||
* ``-X oldparser``: enable the traditional LL(1) parser. See also
|
* ``-X oldparser``: enable the traditional LL(1) parser. See also
|
||||||
:envvar:`PYTHONOLDPARSER`.
|
:envvar:`PYTHONOLDPARSER` and :pep:`617`.
|
||||||
* ``-X showrefcount`` to output the total reference count and number of used
|
* ``-X showrefcount`` to output the total reference count and number of used
|
||||||
memory blocks when the program finishes or after each statement in the
|
memory blocks when the program finishes or after each statement in the
|
||||||
interactive interpreter. This only works on debug builds.
|
interactive interpreter. This only works on debug builds.
|
||||||
|
@ -480,6 +480,9 @@ Miscellaneous options
|
||||||
|
|
||||||
The ``-X showalloccount`` option has been removed.
|
The ``-X showalloccount`` option has been removed.
|
||||||
|
|
||||||
|
.. deprecated-removed:: 3.9 3.10
|
||||||
|
The ``-X oldparser`` option.
|
||||||
|
|
||||||
|
|
||||||
Options you shouldn't use
|
Options you shouldn't use
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -578,8 +581,11 @@ conflict.
|
||||||
|
|
||||||
.. envvar:: PYTHONOLDPARSER
|
.. envvar:: PYTHONOLDPARSER
|
||||||
|
|
||||||
If this is set it is equivalent to specifying the :option:`-X`
|
If this is set to a non-empty string, enable the traditional LL(1) parser.
|
||||||
``oldparser`` option.
|
|
||||||
|
See also the :option:`-X` ``oldparser`` option and :pep:`617`.
|
||||||
|
|
||||||
|
.. deprecated-removed:: 3.9 3.10
|
||||||
|
|
||||||
|
|
||||||
.. envvar:: PYTHONINSPECT
|
.. envvar:: PYTHONINSPECT
|
||||||
|
|
|
@ -149,7 +149,7 @@ typedef struct {
|
||||||
|
|
||||||
/* Enable PEG parser?
|
/* Enable PEG parser?
|
||||||
1 by default, set to 0 by -X oldparser and PYTHONOLDPARSER */
|
1 by default, set to 0 by -X oldparser and PYTHONOLDPARSER */
|
||||||
int use_peg;
|
int _use_peg_parser;
|
||||||
|
|
||||||
/* Enable tracemalloc?
|
/* Enable tracemalloc?
|
||||||
Set by -X tracemalloc=N and PYTHONTRACEMALLOC. -1 means unset */
|
Set by -X tracemalloc=N and PYTHONTRACEMALLOC. -1 means unset */
|
||||||
|
|
|
@ -326,7 +326,7 @@ def _args_from_interpreter_flags():
|
||||||
if dev_mode:
|
if dev_mode:
|
||||||
args.extend(('-X', 'dev'))
|
args.extend(('-X', 'dev'))
|
||||||
for opt in ('faulthandler', 'tracemalloc', 'importtime',
|
for opt in ('faulthandler', 'tracemalloc', 'importtime',
|
||||||
'showrefcount', 'utf8'):
|
'showrefcount', 'utf8', 'oldparser'):
|
||||||
if opt in xoptions:
|
if opt in xoptions:
|
||||||
value = xoptions[opt]
|
value = xoptions[opt]
|
||||||
if value is True:
|
if value is True:
|
||||||
|
|
|
@ -3454,3 +3454,13 @@ def wait_process(pid, *, exitcode, timeout=None):
|
||||||
# sanity check: it should not fail in practice
|
# sanity check: it should not fail in practice
|
||||||
if pid2 != pid:
|
if pid2 != pid:
|
||||||
raise AssertionError(f"pid {pid2} != pid {pid}")
|
raise AssertionError(f"pid {pid2} != pid {pid}")
|
||||||
|
|
||||||
|
|
||||||
|
def use_old_parser():
|
||||||
|
import _testinternalcapi
|
||||||
|
config = _testinternalcapi.get_configs()
|
||||||
|
return (config['config']['_use_peg_parser'] == 0)
|
||||||
|
|
||||||
|
|
||||||
|
def skip_if_new_parser(msg):
|
||||||
|
return unittest.skipIf(not use_old_parser(), msg)
|
||||||
|
|
|
@ -4,12 +4,12 @@
|
||||||
"""
|
"""
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
from test.support import is_jython
|
from test import support
|
||||||
|
|
||||||
from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
|
from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
|
||||||
import io
|
import io
|
||||||
|
|
||||||
if is_jython:
|
if support.is_jython:
|
||||||
|
|
||||||
def unify_callables(d):
|
def unify_callables(d):
|
||||||
for n,v in d.items():
|
for n,v in d.items():
|
||||||
|
@ -21,7 +21,7 @@ class CodeopTests(unittest.TestCase):
|
||||||
|
|
||||||
def assertValid(self, str, symbol='single'):
|
def assertValid(self, str, symbol='single'):
|
||||||
'''succeed iff str is a valid piece of code'''
|
'''succeed iff str is a valid piece of code'''
|
||||||
if is_jython:
|
if support.is_jython:
|
||||||
code = compile_command(str, "<input>", symbol)
|
code = compile_command(str, "<input>", symbol)
|
||||||
self.assertTrue(code)
|
self.assertTrue(code)
|
||||||
if symbol == "single":
|
if symbol == "single":
|
||||||
|
@ -60,7 +60,7 @@ class CodeopTests(unittest.TestCase):
|
||||||
av = self.assertValid
|
av = self.assertValid
|
||||||
|
|
||||||
# special case
|
# special case
|
||||||
if not is_jython:
|
if not support.is_jython:
|
||||||
self.assertEqual(compile_command(""),
|
self.assertEqual(compile_command(""),
|
||||||
compile("pass", "<input>", 'single',
|
compile("pass", "<input>", 'single',
|
||||||
PyCF_DONT_IMPLY_DEDENT))
|
PyCF_DONT_IMPLY_DEDENT))
|
||||||
|
@ -122,7 +122,7 @@ class CodeopTests(unittest.TestCase):
|
||||||
av("def f():\n pass\n#foo\n")
|
av("def f():\n pass\n#foo\n")
|
||||||
av("@a.b.c\ndef f():\n pass\n")
|
av("@a.b.c\ndef f():\n pass\n")
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Pegen does not support PyCF_DONT_INPLY_DEDENT yet")
|
@support.skip_if_new_parser("Pegen does not support PyCF_DONT_INPLY_DEDENT yet")
|
||||||
def test_incomplete(self):
|
def test_incomplete(self):
|
||||||
ai = self.assertIncomplete
|
ai = self.assertIncomplete
|
||||||
|
|
||||||
|
|
|
@ -501,7 +501,7 @@ if 1:
|
||||||
self.compile_single("if x:\n f(x)\nelse:\n g(x)")
|
self.compile_single("if x:\n f(x)\nelse:\n g(x)")
|
||||||
self.compile_single("class T:\n pass")
|
self.compile_single("class T:\n pass")
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, 'Pegen does not disallow multiline single stmts')
|
@support.skip_if_new_parser('Pegen does not disallow multiline single stmts')
|
||||||
def test_bad_single_statement(self):
|
def test_bad_single_statement(self):
|
||||||
self.assertInvalidSingle('1\n2')
|
self.assertInvalidSingle('1\n2')
|
||||||
self.assertInvalidSingle('def f(): pass')
|
self.assertInvalidSingle('def f(): pass')
|
||||||
|
|
|
@ -347,7 +347,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
'isolated': 0,
|
'isolated': 0,
|
||||||
'use_environment': 1,
|
'use_environment': 1,
|
||||||
'dev_mode': 0,
|
'dev_mode': 0,
|
||||||
'use_peg': 1,
|
'_use_peg_parser': 1,
|
||||||
|
|
||||||
'install_signal_handlers': 1,
|
'install_signal_handlers': 1,
|
||||||
'use_hash_seed': 0,
|
'use_hash_seed': 0,
|
||||||
|
@ -729,7 +729,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
'import_time': 1,
|
'import_time': 1,
|
||||||
'show_ref_count': 1,
|
'show_ref_count': 1,
|
||||||
'malloc_stats': 1,
|
'malloc_stats': 1,
|
||||||
'use_peg': 0,
|
'_use_peg_parser': 0,
|
||||||
|
|
||||||
'stdio_encoding': 'iso8859-1',
|
'stdio_encoding': 'iso8859-1',
|
||||||
'stdio_errors': 'replace',
|
'stdio_errors': 'replace',
|
||||||
|
@ -792,6 +792,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
'user_site_directory': 0,
|
'user_site_directory': 0,
|
||||||
'faulthandler': 1,
|
'faulthandler': 1,
|
||||||
'warnoptions': ['EnvVar'],
|
'warnoptions': ['EnvVar'],
|
||||||
|
'_use_peg_parser': 0,
|
||||||
}
|
}
|
||||||
self.check_all_configs("test_init_compat_env", config, preconfig,
|
self.check_all_configs("test_init_compat_env", config, preconfig,
|
||||||
api=API_COMPAT)
|
api=API_COMPAT)
|
||||||
|
@ -819,6 +820,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||||
'user_site_directory': 0,
|
'user_site_directory': 0,
|
||||||
'faulthandler': 1,
|
'faulthandler': 1,
|
||||||
'warnoptions': ['EnvVar'],
|
'warnoptions': ['EnvVar'],
|
||||||
|
'_use_peg_parser': 0,
|
||||||
}
|
}
|
||||||
self.check_all_configs("test_init_python_env", config, preconfig,
|
self.check_all_configs("test_init_python_env", config, preconfig,
|
||||||
api=API_PYTHON)
|
api=API_PYTHON)
|
||||||
|
|
|
@ -26,7 +26,7 @@ class EOFTestCase(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
raise support.TestFailed
|
raise support.TestFailed
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "TODO for PEG -- fails with new parser")
|
@support.skip_if_new_parser("TODO for PEG -- fails with new parser")
|
||||||
def test_line_continuation_EOF(self):
|
def test_line_continuation_EOF(self):
|
||||||
"""A continuation at the end of input must be an error; bpo2180."""
|
"""A continuation at the end of input must be an error; bpo2180."""
|
||||||
expect = 'unexpected EOF while parsing (<string>, line 1)'
|
expect = 'unexpected EOF while parsing (<string>, line 1)'
|
||||||
|
|
|
@ -178,7 +178,7 @@ class ExceptionTests(unittest.TestCase):
|
||||||
s = '''if True:\n print()\n\texec "mixed tabs and spaces"'''
|
s = '''if True:\n print()\n\texec "mixed tabs and spaces"'''
|
||||||
ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError)
|
ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError)
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Pegen column offsets might be different")
|
@support.skip_if_new_parser("Pegen column offsets might be different")
|
||||||
def testSyntaxErrorOffset(self):
|
def testSyntaxErrorOffset(self):
|
||||||
def check(src, lineno, offset, encoding='utf-8'):
|
def check(src, lineno, offset, encoding='utf-8'):
|
||||||
with self.assertRaises(SyntaxError) as cm:
|
with self.assertRaises(SyntaxError) as cm:
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import __future__
|
import __future__
|
||||||
import unittest
|
import unittest
|
||||||
import sys
|
import sys
|
||||||
|
from test import support
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Not supported by pegen yet")
|
@support.skip_if_new_parser("Not supported by pegen yet")
|
||||||
class FLUFLTests(unittest.TestCase):
|
class FLUFLTests(unittest.TestCase):
|
||||||
|
|
||||||
def test_barry_as_bdfl(self):
|
def test_barry_as_bdfl(self):
|
||||||
|
|
|
@ -12,6 +12,7 @@ import types
|
||||||
import decimal
|
import decimal
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
from test import support
|
||||||
|
|
||||||
a_global = 'global variable'
|
a_global = 'global variable'
|
||||||
|
|
||||||
|
@ -206,7 +207,7 @@ f'{a * f"-{x()}-"}'"""
|
||||||
call = binop.right.values[1].value
|
call = binop.right.values[1].value
|
||||||
self.assertEqual(type(call), ast.Call)
|
self.assertEqual(type(call), ast.Call)
|
||||||
self.assertEqual(call.lineno, 3)
|
self.assertEqual(call.lineno, 3)
|
||||||
if not sys.flags.use_peg:
|
if support.use_old_parser():
|
||||||
self.assertEqual(call.col_offset, 11)
|
self.assertEqual(call.col_offset, 11)
|
||||||
|
|
||||||
def test_ast_line_numbers_duplicate_expression(self):
|
def test_ast_line_numbers_duplicate_expression(self):
|
||||||
|
|
|
@ -900,7 +900,7 @@ class ParserStackLimitTestCase(unittest.TestCase):
|
||||||
st = parser.expr(e)
|
st = parser.expr(e)
|
||||||
st.compile()
|
st.compile()
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Pegen does not trigger memory error with this many parenthesis")
|
@support.skip_if_new_parser("Pegen does not trigger memory error with this many parenthesis")
|
||||||
def test_trigger_memory_error(self):
|
def test_trigger_memory_error(self):
|
||||||
e = self._nested_expression(100)
|
e = self._nested_expression(100)
|
||||||
rc, out, err = assert_python_failure('-Xoldparser', '-c', e)
|
rc, out, err = assert_python_failure('-Xoldparser', '-c', e)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import unittest
|
||||||
from pathlib import PurePath
|
from pathlib import PurePath
|
||||||
from typing import Any, Union, Iterable, Tuple
|
from typing import Any, Union, Iterable, Tuple
|
||||||
from textwrap import dedent
|
from textwrap import dedent
|
||||||
|
from test import support
|
||||||
|
|
||||||
|
|
||||||
TEST_CASES = [
|
TEST_CASES = [
|
||||||
|
@ -720,7 +721,7 @@ class ASTGenerationTest(unittest.TestCase):
|
||||||
f"Actual error message does not match expexted for {source}"
|
f"Actual error message does not match expexted for {source}"
|
||||||
)
|
)
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "This tests nothing for now, since compile uses pegen as well")
|
@support.skip_if_new_parser("This tests nothing for now, since compile uses pegen as well")
|
||||||
@unittest.expectedFailure
|
@unittest.expectedFailure
|
||||||
def test_correct_but_known_to_fail_ast_generation_on_source_files(self) -> None:
|
def test_correct_but_known_to_fail_ast_generation_on_source_files(self) -> None:
|
||||||
for source in GOOD_BUT_FAIL_SOURCES:
|
for source in GOOD_BUT_FAIL_SOURCES:
|
||||||
|
|
|
@ -5,7 +5,7 @@ import pickle
|
||||||
import unittest
|
import unittest
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from test.support import check_syntax_error
|
from test.support import check_syntax_error, use_old_parser
|
||||||
|
|
||||||
|
|
||||||
def global_pos_only_f(a, b, /):
|
def global_pos_only_f(a, b, /):
|
||||||
|
@ -24,7 +24,7 @@ class PositionalOnlyTestCase(unittest.TestCase):
|
||||||
compile(codestr + "\n", "<test>", "single")
|
compile(codestr + "\n", "<test>", "single")
|
||||||
|
|
||||||
def test_invalid_syntax_errors(self):
|
def test_invalid_syntax_errors(self):
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
check_syntax_error(self, "def f(a, b = 5, /, c): pass", "non-default argument follows default argument")
|
check_syntax_error(self, "def f(a, b = 5, /, c): pass", "non-default argument follows default argument")
|
||||||
check_syntax_error(self, "def f(a = 5, b, /, c): pass", "non-default argument follows default argument")
|
check_syntax_error(self, "def f(a = 5, b, /, c): pass", "non-default argument follows default argument")
|
||||||
check_syntax_error(self, "def f(a = 5, b=1, /, c, *, d=2): pass", "non-default argument follows default argument")
|
check_syntax_error(self, "def f(a = 5, b=1, /, c, *, d=2): pass", "non-default argument follows default argument")
|
||||||
|
@ -47,7 +47,7 @@ class PositionalOnlyTestCase(unittest.TestCase):
|
||||||
check_syntax_error(self, "def f(a, *, c, /, d, e): pass")
|
check_syntax_error(self, "def f(a, *, c, /, d, e): pass")
|
||||||
|
|
||||||
def test_invalid_syntax_errors_async(self):
|
def test_invalid_syntax_errors_async(self):
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
check_syntax_error(self, "async def f(a, b = 5, /, c): pass", "non-default argument follows default argument")
|
check_syntax_error(self, "async def f(a, b = 5, /, c): pass", "non-default argument follows default argument")
|
||||||
check_syntax_error(self, "async def f(a = 5, b, /, c): pass", "non-default argument follows default argument")
|
check_syntax_error(self, "async def f(a = 5, b, /, c): pass", "non-default argument follows default argument")
|
||||||
check_syntax_error(self, "async def f(a = 5, b=1, /, c, d=2): pass", "non-default argument follows default argument")
|
check_syntax_error(self, "async def f(a = 5, b=1, /, c, d=2): pass", "non-default argument follows default argument")
|
||||||
|
@ -236,7 +236,7 @@ class PositionalOnlyTestCase(unittest.TestCase):
|
||||||
self.assertEqual(x(1, 2), 3)
|
self.assertEqual(x(1, 2), 3)
|
||||||
|
|
||||||
def test_invalid_syntax_lambda(self):
|
def test_invalid_syntax_lambda(self):
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
check_syntax_error(self, "lambda a, b = 5, /, c: None", "non-default argument follows default argument")
|
check_syntax_error(self, "lambda a, b = 5, /, c: None", "non-default argument follows default argument")
|
||||||
check_syntax_error(self, "lambda a = 5, b, /, c: None", "non-default argument follows default argument")
|
check_syntax_error(self, "lambda a = 5, b, /, c: None", "non-default argument follows default argument")
|
||||||
check_syntax_error(self, "lambda a = 5, b, /: None", "non-default argument follows default argument")
|
check_syntax_error(self, "lambda a = 5, b, /: None", "non-default argument follows default argument")
|
||||||
|
|
|
@ -33,6 +33,7 @@ import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
import warnings
|
import warnings
|
||||||
|
from test.support import check_syntax_warning, use_old_parser
|
||||||
|
|
||||||
|
|
||||||
TEMPLATE = r"""# coding: %s
|
TEMPLATE = r"""# coding: %s
|
||||||
|
@ -63,8 +64,6 @@ def byte(i):
|
||||||
|
|
||||||
class TestLiterals(unittest.TestCase):
|
class TestLiterals(unittest.TestCase):
|
||||||
|
|
||||||
from test.support import check_syntax_warning
|
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.save_path = sys.path[:]
|
self.save_path = sys.path[:]
|
||||||
self.tmpdir = tempfile.mkdtemp()
|
self.tmpdir = tempfile.mkdtemp()
|
||||||
|
@ -119,7 +118,7 @@ class TestLiterals(unittest.TestCase):
|
||||||
eval("'''\n\\z'''")
|
eval("'''\n\\z'''")
|
||||||
self.assertEqual(len(w), 1)
|
self.assertEqual(len(w), 1)
|
||||||
self.assertEqual(w[0].filename, '<string>')
|
self.assertEqual(w[0].filename, '<string>')
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
self.assertEqual(w[0].lineno, 1)
|
self.assertEqual(w[0].lineno, 1)
|
||||||
|
|
||||||
with warnings.catch_warnings(record=True) as w:
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
@ -129,7 +128,7 @@ class TestLiterals(unittest.TestCase):
|
||||||
exc = cm.exception
|
exc = cm.exception
|
||||||
self.assertEqual(w, [])
|
self.assertEqual(w, [])
|
||||||
self.assertEqual(exc.filename, '<string>')
|
self.assertEqual(exc.filename, '<string>')
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
self.assertEqual(exc.lineno, 1)
|
self.assertEqual(exc.lineno, 1)
|
||||||
|
|
||||||
def test_eval_str_raw(self):
|
def test_eval_str_raw(self):
|
||||||
|
@ -170,7 +169,7 @@ class TestLiterals(unittest.TestCase):
|
||||||
eval("b'''\n\\z'''")
|
eval("b'''\n\\z'''")
|
||||||
self.assertEqual(len(w), 1)
|
self.assertEqual(len(w), 1)
|
||||||
self.assertEqual(w[0].filename, '<string>')
|
self.assertEqual(w[0].filename, '<string>')
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
self.assertEqual(w[0].lineno, 1)
|
self.assertEqual(w[0].lineno, 1)
|
||||||
|
|
||||||
with warnings.catch_warnings(record=True) as w:
|
with warnings.catch_warnings(record=True) as w:
|
||||||
|
@ -180,7 +179,7 @@ class TestLiterals(unittest.TestCase):
|
||||||
exc = cm.exception
|
exc = cm.exception
|
||||||
self.assertEqual(w, [])
|
self.assertEqual(w, [])
|
||||||
self.assertEqual(exc.filename, '<string>')
|
self.assertEqual(exc.filename, '<string>')
|
||||||
if not sys.flags.use_peg:
|
if use_old_parser():
|
||||||
self.assertEqual(exc.lineno, 1)
|
self.assertEqual(exc.lineno, 1)
|
||||||
|
|
||||||
def test_eval_bytes_raw(self):
|
def test_eval_bytes_raw(self):
|
||||||
|
|
|
@ -678,7 +678,7 @@ class SyntaxTestCase(unittest.TestCase):
|
||||||
def test_assign_call(self):
|
def test_assign_call(self):
|
||||||
self._check_error("f() = 1", "assign")
|
self._check_error("f() = 1", "assign")
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Pegen does not produce a specialized error "
|
@support.skip_if_new_parser("Pegen does not produce a specialized error "
|
||||||
"message yet")
|
"message yet")
|
||||||
def test_assign_del(self):
|
def test_assign_del(self):
|
||||||
self._check_error("del f()", "delete")
|
self._check_error("del f()", "delete")
|
||||||
|
|
|
@ -545,7 +545,7 @@ class SysModuleTest(unittest.TestCase):
|
||||||
def test_sys_flags(self):
|
def test_sys_flags(self):
|
||||||
self.assertTrue(sys.flags)
|
self.assertTrue(sys.flags)
|
||||||
attrs = ("debug",
|
attrs = ("debug",
|
||||||
"inspect", "interactive", "optimize", "use_peg",
|
"inspect", "interactive", "optimize",
|
||||||
"dont_write_bytecode", "no_user_site", "no_site",
|
"dont_write_bytecode", "no_user_site", "no_site",
|
||||||
"ignore_environment", "verbose", "bytes_warning", "quiet",
|
"ignore_environment", "verbose", "bytes_warning", "quiet",
|
||||||
"hash_randomization", "isolated", "dev_mode", "utf8_mode")
|
"hash_randomization", "isolated", "dev_mode", "utf8_mode")
|
||||||
|
|
|
@ -656,8 +656,7 @@ class BaseExceptionReportingTests:
|
||||||
self.assertIn('inner_raise() # Marker', blocks[2])
|
self.assertIn('inner_raise() # Marker', blocks[2])
|
||||||
self.check_zero_div(blocks[2])
|
self.check_zero_div(blocks[2])
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg,
|
@support.skip_if_new_parser("Pegen is arguably better here, so no need to fix this")
|
||||||
"Pegen is arguably better here, so no need to fix this")
|
|
||||||
def test_syntax_error_offset_at_eol(self):
|
def test_syntax_error_offset_at_eol(self):
|
||||||
# See #10186.
|
# See #10186.
|
||||||
def e():
|
def e():
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import ast
|
import ast
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
|
from test import support
|
||||||
|
|
||||||
|
|
||||||
funcdef = """\
|
funcdef = """\
|
||||||
|
@ -218,7 +219,7 @@ def favk(
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Pegen does not support type comments yet")
|
@support.skip_if_new_parser("Pegen does not support type comments yet")
|
||||||
class TypeCommentTests(unittest.TestCase):
|
class TypeCommentTests(unittest.TestCase):
|
||||||
|
|
||||||
lowest = 4 # Lowest minor version supported
|
lowest = 4 # Lowest minor version supported
|
||||||
|
|
|
@ -328,7 +328,7 @@ class UnparseTestCase(ASTTestCase):
|
||||||
ast.Constant(value=(1, 2, 3), kind=None), "(1, 2, 3)"
|
ast.Constant(value=(1, 2, 3), kind=None), "(1, 2, 3)"
|
||||||
)
|
)
|
||||||
|
|
||||||
@unittest.skipIf(sys.flags.use_peg, "Pegen does not support type annotation yet")
|
@test.support.skip_if_new_parser("Pegen does not support type annotation yet")
|
||||||
def test_function_type(self):
|
def test_function_type(self):
|
||||||
for function_type in (
|
for function_type in (
|
||||||
"() -> int",
|
"() -> int",
|
||||||
|
|
|
@ -485,8 +485,8 @@ static int test_init_from_config(void)
|
||||||
|
|
||||||
config.install_signal_handlers = 0;
|
config.install_signal_handlers = 0;
|
||||||
|
|
||||||
putenv("PYTHONOLDPARSER=");
|
putenv("PYTHONOLDPARSER=1");
|
||||||
config.use_peg = 0;
|
config._use_peg_parser = 0;
|
||||||
|
|
||||||
/* FIXME: test use_environment */
|
/* FIXME: test use_environment */
|
||||||
|
|
||||||
|
@ -665,6 +665,7 @@ static void set_most_env_vars(void)
|
||||||
putenv("PYTHONNOUSERSITE=1");
|
putenv("PYTHONNOUSERSITE=1");
|
||||||
putenv("PYTHONFAULTHANDLER=1");
|
putenv("PYTHONFAULTHANDLER=1");
|
||||||
putenv("PYTHONIOENCODING=iso8859-1:replace");
|
putenv("PYTHONIOENCODING=iso8859-1:replace");
|
||||||
|
putenv("PYTHONOLDPARSER=1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -816,12 +816,12 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename,
|
||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
int current_use_peg = PyInterpreterState_Get()->config.use_peg;
|
int current_use_peg = PyInterpreterState_Get()->config._use_peg_parser;
|
||||||
if (flags & PyCF_TYPE_COMMENTS || feature_version >= 0) {
|
if (flags & PyCF_TYPE_COMMENTS || feature_version >= 0) {
|
||||||
PyInterpreterState_Get()->config.use_peg = 0;
|
PyInterpreterState_Get()->config._use_peg_parser = 0;
|
||||||
}
|
}
|
||||||
result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize);
|
result = Py_CompileStringObject(str, filename, start[compile_mode], &cf, optimize);
|
||||||
PyInterpreterState_Get()->config.use_peg = current_use_peg;
|
PyInterpreterState_Get()->config._use_peg_parser = current_use_peg;
|
||||||
Py_XDECREF(source_copy);
|
Py_XDECREF(source_copy);
|
||||||
goto finally;
|
goto finally;
|
||||||
|
|
||||||
|
|
|
@ -635,7 +635,7 @@ _PyConfig_InitCompatConfig(PyConfig *config)
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
config->legacy_windows_stdio = -1;
|
config->legacy_windows_stdio = -1;
|
||||||
#endif
|
#endif
|
||||||
config->use_peg = 1;
|
config->_use_peg_parser = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -793,7 +793,7 @@ _PyConfig_Copy(PyConfig *config, const PyConfig *config2)
|
||||||
COPY_ATTR(isolated);
|
COPY_ATTR(isolated);
|
||||||
COPY_ATTR(use_environment);
|
COPY_ATTR(use_environment);
|
||||||
COPY_ATTR(dev_mode);
|
COPY_ATTR(dev_mode);
|
||||||
COPY_ATTR(use_peg);
|
COPY_ATTR(_use_peg_parser);
|
||||||
COPY_ATTR(install_signal_handlers);
|
COPY_ATTR(install_signal_handlers);
|
||||||
COPY_ATTR(use_hash_seed);
|
COPY_ATTR(use_hash_seed);
|
||||||
COPY_ATTR(hash_seed);
|
COPY_ATTR(hash_seed);
|
||||||
|
@ -897,7 +897,7 @@ config_as_dict(const PyConfig *config)
|
||||||
SET_ITEM_INT(isolated);
|
SET_ITEM_INT(isolated);
|
||||||
SET_ITEM_INT(use_environment);
|
SET_ITEM_INT(use_environment);
|
||||||
SET_ITEM_INT(dev_mode);
|
SET_ITEM_INT(dev_mode);
|
||||||
SET_ITEM_INT(use_peg);
|
SET_ITEM_INT(_use_peg_parser);
|
||||||
SET_ITEM_INT(install_signal_handlers);
|
SET_ITEM_INT(install_signal_handlers);
|
||||||
SET_ITEM_INT(use_hash_seed);
|
SET_ITEM_INT(use_hash_seed);
|
||||||
SET_ITEM_UINT(hash_seed);
|
SET_ITEM_UINT(hash_seed);
|
||||||
|
@ -1434,7 +1434,7 @@ config_read_complex_options(PyConfig *config)
|
||||||
|
|
||||||
if (config_get_env(config, "PYTHONOLDPARSER")
|
if (config_get_env(config, "PYTHONOLDPARSER")
|
||||||
|| config_get_xoption(config, L"oldparser")) {
|
|| config_get_xoption(config, L"oldparser")) {
|
||||||
config->use_peg = 0;
|
config->_use_peg_parser = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyStatus status;
|
PyStatus status;
|
||||||
|
@ -2516,7 +2516,7 @@ PyConfig_Read(PyConfig *config)
|
||||||
assert(config->isolated >= 0);
|
assert(config->isolated >= 0);
|
||||||
assert(config->use_environment >= 0);
|
assert(config->use_environment >= 0);
|
||||||
assert(config->dev_mode >= 0);
|
assert(config->dev_mode >= 0);
|
||||||
assert(config->use_peg >= 0);
|
assert(config->_use_peg_parser >= 0);
|
||||||
assert(config->install_signal_handlers >= 0);
|
assert(config->install_signal_handlers >= 0);
|
||||||
assert(config->use_hash_seed >= 0);
|
assert(config->use_hash_seed >= 0);
|
||||||
assert(config->faulthandler >= 0);
|
assert(config->faulthandler >= 0);
|
||||||
|
|
|
@ -185,7 +185,7 @@ PyRun_InteractiveOneObjectEx(FILE *fp, PyObject *filename,
|
||||||
PyArena *arena;
|
PyArena *arena;
|
||||||
const char *ps1 = "", *ps2 = "", *enc = NULL;
|
const char *ps1 = "", *ps2 = "", *enc = NULL;
|
||||||
int errcode = 0;
|
int errcode = 0;
|
||||||
int use_peg = _PyInterpreterState_GET()->config.use_peg;
|
int use_peg = _PyInterpreterState_GET()->config._use_peg_parser;
|
||||||
_Py_IDENTIFIER(encoding);
|
_Py_IDENTIFIER(encoding);
|
||||||
_Py_IDENTIFIER(__main__);
|
_Py_IDENTIFIER(__main__);
|
||||||
|
|
||||||
|
@ -1030,7 +1030,7 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals,
|
||||||
mod_ty mod;
|
mod_ty mod;
|
||||||
PyArena *arena;
|
PyArena *arena;
|
||||||
PyObject *filename;
|
PyObject *filename;
|
||||||
int use_peg = _PyInterpreterState_GET()->config.use_peg;
|
int use_peg = _PyInterpreterState_GET()->config._use_peg_parser;
|
||||||
|
|
||||||
filename = _PyUnicode_FromId(&PyId_string); /* borrowed */
|
filename = _PyUnicode_FromId(&PyId_string); /* borrowed */
|
||||||
if (filename == NULL)
|
if (filename == NULL)
|
||||||
|
@ -1061,7 +1061,7 @@ PyRun_FileExFlags(FILE *fp, const char *filename_str, int start, PyObject *globa
|
||||||
mod_ty mod;
|
mod_ty mod;
|
||||||
PyArena *arena = NULL;
|
PyArena *arena = NULL;
|
||||||
PyObject *filename;
|
PyObject *filename;
|
||||||
int use_peg = _PyInterpreterState_GET()->config.use_peg;
|
int use_peg = _PyInterpreterState_GET()->config._use_peg_parser;
|
||||||
|
|
||||||
filename = PyUnicode_DecodeFSDefault(filename_str);
|
filename = PyUnicode_DecodeFSDefault(filename_str);
|
||||||
if (filename == NULL)
|
if (filename == NULL)
|
||||||
|
@ -1222,7 +1222,7 @@ Py_CompileStringObject(const char *str, PyObject *filename, int start,
|
||||||
{
|
{
|
||||||
PyCodeObject *co;
|
PyCodeObject *co;
|
||||||
mod_ty mod;
|
mod_ty mod;
|
||||||
int use_peg = _PyInterpreterState_GET()->config.use_peg;
|
int use_peg = _PyInterpreterState_GET()->config._use_peg_parser;
|
||||||
PyArena *arena = PyArena_New();
|
PyArena *arena = PyArena_New();
|
||||||
if (arena == NULL)
|
if (arena == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1329,7 +1329,7 @@ _Py_SymtableStringObjectFlags(const char *str, PyObject *filename, int start, Py
|
||||||
{
|
{
|
||||||
struct symtable *st;
|
struct symtable *st;
|
||||||
mod_ty mod;
|
mod_ty mod;
|
||||||
int use_peg = _PyInterpreterState_GET()->config.use_peg;
|
int use_peg = _PyInterpreterState_GET()->config._use_peg_parser;
|
||||||
PyArena *arena;
|
PyArena *arena;
|
||||||
|
|
||||||
arena = PyArena_New();
|
arena = PyArena_New();
|
||||||
|
|
|
@ -2427,7 +2427,6 @@ static PyStructSequence_Field flags_fields[] = {
|
||||||
{"inspect", "-i"},
|
{"inspect", "-i"},
|
||||||
{"interactive", "-i"},
|
{"interactive", "-i"},
|
||||||
{"optimize", "-O or -OO"},
|
{"optimize", "-O or -OO"},
|
||||||
{"use_peg", "-p old or -p new"},
|
|
||||||
{"dont_write_bytecode", "-B"},
|
{"dont_write_bytecode", "-B"},
|
||||||
{"no_user_site", "-s"},
|
{"no_user_site", "-s"},
|
||||||
{"no_site", "-S"},
|
{"no_site", "-S"},
|
||||||
|
@ -2448,7 +2447,7 @@ static PyStructSequence_Desc flags_desc = {
|
||||||
"sys.flags", /* name */
|
"sys.flags", /* name */
|
||||||
flags__doc__, /* doc */
|
flags__doc__, /* doc */
|
||||||
flags_fields, /* fields */
|
flags_fields, /* fields */
|
||||||
16
|
15
|
||||||
};
|
};
|
||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
|
@ -2471,7 +2470,6 @@ make_flags(PyThreadState *tstate)
|
||||||
SetFlag(config->inspect);
|
SetFlag(config->inspect);
|
||||||
SetFlag(config->interactive);
|
SetFlag(config->interactive);
|
||||||
SetFlag(config->optimization_level);
|
SetFlag(config->optimization_level);
|
||||||
SetFlag(config->use_peg);
|
|
||||||
SetFlag(!config->write_bytecode);
|
SetFlag(!config->write_bytecode);
|
||||||
SetFlag(!config->user_site_directory);
|
SetFlag(!config->user_site_directory);
|
||||||
SetFlag(!config->site_import);
|
SetFlag(!config->site_import);
|
||||||
|
|
Loading…
Reference in New Issue