diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index df766387dd4c72d..ea2467e8bd02da3 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -960,6 +960,37 @@ def unused_code_at_end(): 'RETURN_VALUE', list(dis.get_instructions(unused_code_at_end))[-1].opname) + def test_parser_stack_overflow_in_loop_rule(self): + # gh-150001: A parser stack overflow inside an f-string must not be + # followed by a SyntaxWarning emitted with the MemoryError still set + def overflows(source): + try: + compile(source, '', 'exec') + except MemoryError: + return True + except SyntaxError: + pass + return False + + # Find the shallowest nesting that overflows the parser stack + lo, hi = 1, 100_000 + while lo < hi: + mid = (lo + hi) // 2 + if overflows(b'~' * mid + b'x'): + hi = mid + else: + lo = mid + 1 + + # Overflow at every point around that depth, including inside the + # f-string with invalid escape sequences + tail = b'f"\\}{x}\\}"' + with warnings.catch_warnings(): + warnings.simplefilter('ignore', SyntaxWarning) + for depth in range(max(lo - 20, 1), lo + 20): + with self.subTest(depth=depth): + with self.assertRaises((MemoryError, SyntaxError)): + compile(b'~' * depth + tail, '', 'exec') + @support.cpython_only def test_docstring(self): src = textwrap.dedent(""" diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-05-23-17-27-51.gh-issue-150001.Dn9I-g.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-23-17-27-51.gh-issue-150001.Dn9I-g.rst new file mode 100644 index 000000000000000..2cf65788ccbca8a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-05-23-17-27-51.gh-issue-150001.Dn9I-g.rst @@ -0,0 +1,3 @@ +Fix a bug where parsing certain invalid Python code could raise a +:exc:`SystemError` instead of the expected :exc:`SyntaxError`. Patch by +Alexander Domenti. diff --git a/Parser/parser.c b/Parser/parser.c index 2300314a77888fa..b53a5ce7066ef82 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -19769,6 +19769,11 @@ _loop0_1_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_1[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "NEWLINE")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -19827,6 +19832,11 @@ _loop1_2_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_2[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "statement")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -19899,6 +19909,11 @@ _loop0_3_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_3[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "';' simple_stmt")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -20435,6 +20450,11 @@ _loop1_12_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_12[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -20507,6 +20527,11 @@ _loop0_13_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_13[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' NAME")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -20709,6 +20734,11 @@ _loop0_17_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_17[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -20767,6 +20797,11 @@ _loop1_18_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_18[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -20839,6 +20874,11 @@ _loop0_19_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_19[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' import_from_as_name")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -20993,6 +21033,11 @@ _loop0_22_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_22[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_as_name")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -21092,6 +21137,11 @@ _loop1_24_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_24[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('@' named_expression NEWLINE)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21250,6 +21300,11 @@ _loop0_27_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_27[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -21308,6 +21363,11 @@ _loop0_28_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_28[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -21366,6 +21426,11 @@ _loop1_29_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_29[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21429,6 +21494,11 @@ _loop1_30_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_30[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21492,6 +21562,11 @@ _loop0_31_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_31[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -21550,6 +21625,11 @@ _loop1_32_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_32[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21622,6 +21702,11 @@ _loop0_33_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_33[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' with_item")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -21797,6 +21882,11 @@ _loop1_36_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_36[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21860,6 +21950,11 @@ _loop1_37_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_37[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21923,6 +22018,11 @@ _loop1_38_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_38[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "case_block")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -21995,6 +22095,11 @@ _loop0_39_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_39[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "'|' closed_pattern")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -22312,6 +22417,11 @@ _loop0_44_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_44[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' maybe_star_pattern")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -22420,6 +22530,11 @@ _loop0_46_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_46[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' key_value_pattern")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -22585,6 +22700,11 @@ _loop0_49_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_49[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' pattern")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -22693,6 +22813,11 @@ _loop0_51_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_51[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' keyword_pattern")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -22801,6 +22926,11 @@ _loop0_53_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_53[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' type_param")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -22900,6 +23030,11 @@ _loop1_55_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_55[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' expression)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -22963,6 +23098,11 @@ _loop1_56_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_56[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_expression)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -23035,6 +23175,11 @@ _loop0_57_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_57[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -23134,6 +23279,11 @@ _loop1_59_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('or' conjunction)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -23197,6 +23347,11 @@ _loop1_60_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_60[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -23260,6 +23415,11 @@ _loop1_61_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_61[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -23375,6 +23535,11 @@ _loop0_63_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_63[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (slice | starred_expression)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -23805,6 +23970,11 @@ _loop0_70_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_70[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -23863,6 +24033,11 @@ _loop0_71_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_71[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -23921,6 +24096,11 @@ _loop1_72_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_72[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -23984,6 +24164,11 @@ _loop1_73_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_73[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -24047,6 +24232,11 @@ _loop0_74_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_74[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24105,6 +24295,11 @@ _loop1_75_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_75[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -24168,6 +24363,11 @@ _loop0_76_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_76[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24226,6 +24426,11 @@ _loop0_77_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_77[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_middle")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24284,6 +24489,11 @@ _loop0_78_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_78[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_format_spec")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24342,6 +24552,11 @@ _loop0_79_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_79[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_middle")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24400,6 +24615,11 @@ _loop1_80_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_80[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -24463,6 +24683,11 @@ _loop1_81_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_81[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -24535,6 +24760,11 @@ _loop0_82_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_82[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' display_item")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24692,6 +24922,11 @@ _loop0_85_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_85[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24791,6 +25026,11 @@ _loop1_87_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_87[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "for_if_clause")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -24854,6 +25094,11 @@ _loop0_88_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_88[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('if' disjunction)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -24999,6 +25244,11 @@ _loop0_90_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_90[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -25154,6 +25404,11 @@ _loop0_93_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_93[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_starred")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -25308,6 +25563,11 @@ _loop0_96_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_96[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -25407,6 +25667,11 @@ _loop0_98_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_98[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -25590,6 +25855,11 @@ _loop0_101_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_101[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -25698,6 +25968,11 @@ _loop0_103_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_103[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { diff --git a/Parser/parser_invalid.c b/Parser/parser_invalid.c index b306b9869a90dd7..4db8e9193191dbd 100644 --- a/Parser/parser_invalid.c +++ b/Parser/parser_invalid.c @@ -8328,6 +8328,11 @@ _loop0_107_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_107[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression !'=')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -8626,6 +8631,11 @@ _loop1_113_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_113[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(!STRING expression_without_invalid)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -9072,6 +9082,11 @@ _loop0_119_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_119[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -9130,6 +9145,11 @@ _loop0_120_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_120[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -9302,6 +9322,11 @@ _loop0_123_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_123[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -9360,6 +9385,11 @@ _loop0_124_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_124[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -9418,6 +9448,11 @@ _loop1_125_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_125[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -9538,6 +9573,11 @@ _loop1_127_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_127[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -9851,6 +9891,11 @@ _loop1_132_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_132[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "param_with_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -9971,6 +10016,11 @@ _loop0_134_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_134[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -10029,6 +10079,11 @@ _loop0_135_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_135[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -10096,6 +10151,11 @@ _loop0_136_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_136[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -10252,6 +10312,11 @@ _loop1_139_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_139[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -10315,6 +10380,11 @@ _loop1_140_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -10625,6 +10695,11 @@ _loop0_145_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_145[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_name")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -10765,6 +10840,11 @@ _loop0_148_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_148[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('.' | '...')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -10832,6 +10912,11 @@ _loop0_149_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_149[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -10940,6 +11025,11 @@ _loop0_151_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_151[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -11096,6 +11186,11 @@ _loop0_154_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_154[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "block")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -11154,6 +11249,11 @@ _loop1_155_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_155[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_block")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -11258,6 +11358,11 @@ _loop1_157_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_157[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "except_star_block")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -11597,6 +11702,11 @@ _loop0_164_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_164[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' double_starred_kvpair")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -12079,6 +12189,11 @@ _loop0_172_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_172[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "fstring_format_spec")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -12137,6 +12252,11 @@ _loop1_173_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_173[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -12200,6 +12320,11 @@ _loop1_174_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -12828,6 +12953,11 @@ _loop0_195_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_195[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' bitwise_or)")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -13131,6 +13261,11 @@ _loop0_201_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_201[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression | (assignment_expression | expression !':=') !'=')")); + if (p->error_indicator) { + PyMem_Free(_children); + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { diff --git a/Tools/peg_generator/pegen/c_generator_rules.py b/Tools/peg_generator/pegen/c_generator_rules.py index cc252ba30d291f0..eef05f7c182a46a 100644 --- a/Tools/peg_generator/pegen/c_generator_rules.py +++ b/Tools/peg_generator/pegen/c_generator_rules.py @@ -224,7 +224,7 @@ def _emit_loop_body(self) -> None: if rule.uses_locations: self._emit_token_start_metadata() alt, = rule.alternatives - with self._alternative(alt): + with self._alternative(alt, loop_returns=buffer.error_returns): self._emit_loop_alt(alt, buffer) result = buffer.finish(require_one=signature.kind is RuleKind.LOOP1) if rule.memoize: @@ -232,7 +232,9 @@ def _emit_loop_body(self) -> None: self._returns.emit(result) @contextmanager - def _alternative(self, alt: CAlternative) -> Iterator[None]: + def _alternative( + self, alt: CAlternative, loop_returns: _CReturnEmitter | None = None + ) -> Iterator[None]: rulename = self._rule.signature.name if alt.requires_invalid_rules: self._print(f"if (p->call_invalid_rules) {{ // {alt.text}") @@ -260,6 +262,11 @@ def _alternative(self, alt: CAlternative) -> Iterator[None]: f"D(fprintf(stderr, \"%*c%s {rulename}[%d-%d]: %s failed!\\n\", p->level, ' ',\n" f' p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "{node_str}"));' ) + if loop_returns is not None: + self._print("if (p->error_indicator) {") + with self._indent(): + loop_returns.emit("NULL") + self._print("}") if alt.cut_variable is not None: self._print(f"if ({alt.cut_variable}) {{") with self._indent():