diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 9edbca3c383b43..d0cf62d596e090 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -911,6 +911,29 @@ def unused_code_at_end(): 'RETURN_VALUE', list(dis.get_instructions(unused_code_at_end))[-1].opname) + # gh-150001: Test that this code does not raise SystemError + @support.cpython_only + def test_parser_stack_overflow_no_crash(self): + string = ( + b'(*h(((h(h(h(' + + b'[' * 35 + + b'*h(' + + b'[' * 38 + + b'**h(' + + b'[' * 31 + + b'(' * 4 + + b'~' * 20 + + b'F{' + + b'[' * 27 + + b'**h(' + + b'[' * 31 + + b'(' * 4 + + b'~' * 23 + + b'F{F"{F"{F"{F"{F"{F"{F"{FF""{{F"{""{F"{F{{F"{F"{F"\\}' + ) + with self.assertRaises((MemoryError, SyntaxError)): + compile(string, '', "single") + @support.cpython_only def test_docstring(self): src = textwrap.dedent(""" diff --git a/Parser/parser.c b/Parser/parser.c index c55c081dfc3d8e..c124737b5a9cc6 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -28486,6 +28486,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -28553,6 +28557,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -28634,6 +28642,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29179,6 +29191,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -29260,6 +29276,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29471,6 +29491,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29538,6 +29562,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -29619,6 +29647,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29782,6 +29814,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -29890,6 +29926,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30057,6 +30097,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30124,6 +30168,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30191,6 +30239,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30263,6 +30315,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30335,6 +30391,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30402,6 +30462,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30483,6 +30547,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -30667,6 +30735,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30739,6 +30811,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30811,6 +30887,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -30892,6 +30972,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31218,6 +31302,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31335,6 +31423,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31509,6 +31601,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31626,6 +31722,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31743,6 +31843,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -31851,6 +31955,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -31923,6 +32031,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -32004,6 +32116,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -32121,6 +32237,10 @@ _loop0_59_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_59[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' star_named_expression_sequence")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -32229,6 +32349,10 @@ _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, "('or' conjunction)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -32301,6 +32425,10 @@ _loop1_62_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_62[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "('and' inversion)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -32373,6 +32501,10 @@ _loop1_63_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_63[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "compare_op_bitwise_or_pair")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -32497,6 +32629,10 @@ _loop0_65_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_65[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (slice | starred_expression)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -32936,6 +33072,10 @@ _loop0_72_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_72[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33003,6 +33143,10 @@ _loop0_73_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_73[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_with_default")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33070,6 +33214,10 @@ _loop1_74_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_74[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_no_default")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -33142,6 +33290,10 @@ _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_with_default")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -33214,6 +33366,10 @@ _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, "lambda_param_maybe_default")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33281,6 +33437,10 @@ _loop1_77_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_77[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "lambda_param_maybe_default")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -33353,6 +33513,10 @@ _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, "fstring_format_spec")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33420,6 +33584,10 @@ _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, "fstring_middle")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33487,6 +33655,10 @@ _loop0_80_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_80[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_format_spec")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33554,6 +33726,10 @@ _loop0_81_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_81[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring_middle")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33621,6 +33797,10 @@ _loop1_82_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_82[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(fstring | string)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -33693,6 +33873,10 @@ _loop1_83_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_83[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "tstring")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -33823,6 +34007,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -33931,6 +34119,10 @@ _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) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -34003,6 +34195,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34157,6 +34353,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34321,6 +34521,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34438,6 +34642,10 @@ _loop0_95_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_95[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' kwarg_or_double_starred")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34546,6 +34754,10 @@ _loop0_97_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_97[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34622,6 +34834,10 @@ _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) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34730,6 +34946,10 @@ _loop1_100_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_100[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' star_target)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -34851,6 +35071,10 @@ _loop0_102_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_102[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' del_target")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -34968,6 +35192,10 @@ _loop0_104_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_104[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' expression")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -35185,6 +35413,10 @@ _loop0_108_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_108[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (starred_expression !'=')")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -35568,6 +35800,10 @@ _loop1_115_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop1_115[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(!STRING expression_without_invalid)")); + if (p->error_indicator) { + p->level--; + return NULL; + } } if (_n == 0 || p->error_indicator) { PyMem_Free(_children); @@ -36023,6 +36259,10 @@ _loop0_121_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_121[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "star_named_expressions")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -36090,6 +36330,10 @@ _loop0_122_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_122[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(star_targets '=')")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -36644,6 +36888,10 @@ _loop0_131_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_131[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' lambda_param")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -36980,6 +37228,10 @@ _loop0_137_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_137[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' dotted_name")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -37138,6 +37390,10 @@ _loop0_140_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_140[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expression ['as' star_target])")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -37255,6 +37511,10 @@ _loop0_142_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_142[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "',' (expressions ['as' star_target])")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -37420,6 +37680,10 @@ _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, "block")); + if (p->error_indicator) { + p->level--; + return NULL; + } } asdl_seq *_seq = (asdl_seq*)_Py_asdl_generic_seq_new(_n, p->arena); if (!_seq) { @@ -39073,6 +39337,10 @@ _loop0_174_rule(Parser *p) p->mark = _mark; D(fprintf(stderr, "%*c%s _loop0_174[%d-%d]: %s failed!\n", p->level, ' ', p->error_indicator ? "ERROR!" : "-", _mark, p->mark, "(',' bitwise_or)")); + if (p->error_indicator) { + 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.py b/Tools/peg_generator/pegen/c_generator.py index d9236dfb22835b..232776287cca46 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -870,6 +870,12 @@ def visit_Alt( 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 is_loop: + self.print("if (p->error_indicator) {") + with self.indent(): + self.print("p->level--;") + self.print("return NULL;") + self.print("}") if "_cut_var" in vars: self.print("if (_cut_var) {") with self.indent():