@@ -46,6 +46,7 @@ static int validate_pattern(struct validator *, pattern_ty, int);
4646static int
4747validate_name (PyObject * name )
4848{
49+ assert (!PyErr_Occurred ());
4950 assert (PyUnicode_Check (name ));
5051 static const char * const forbidden [] = {
5152 "None" ,
@@ -65,12 +66,12 @@ validate_name(PyObject *name)
6566static int
6667validate_comprehension (struct validator * state , asdl_comprehension_seq * gens )
6768{
68- Py_ssize_t i ;
69+ assert (! PyErr_Occurred ()) ;
6970 if (!asdl_seq_LEN (gens )) {
7071 PyErr_SetString (PyExc_ValueError , "comprehension with no generators" );
7172 return 0 ;
7273 }
73- for (i = 0 ; i < asdl_seq_LEN (gens ); i ++ ) {
74+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (gens ); i ++ ) {
7475 comprehension_ty comp = asdl_seq_GET (gens , i );
7576 if (!validate_expr (state , comp -> target , Store ) ||
7677 !validate_expr (state , comp -> iter , Load ) ||
@@ -83,8 +84,8 @@ validate_comprehension(struct validator *state, asdl_comprehension_seq *gens)
8384static int
8485validate_keywords (struct validator * state , asdl_keyword_seq * keywords )
8586{
86- Py_ssize_t i ;
87- for (i = 0 ; i < asdl_seq_LEN (keywords ); i ++ )
87+ assert (! PyErr_Occurred ()) ;
88+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (keywords ); i ++ )
8889 if (!validate_expr (state , (asdl_seq_GET (keywords , i ))-> value , Load ))
8990 return 0 ;
9091 return 1 ;
@@ -93,8 +94,8 @@ validate_keywords(struct validator *state, asdl_keyword_seq *keywords)
9394static int
9495validate_args (struct validator * state , asdl_arg_seq * args )
9596{
96- Py_ssize_t i ;
97- for (i = 0 ; i < asdl_seq_LEN (args ); i ++ ) {
97+ assert (! PyErr_Occurred ()) ;
98+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (args ); i ++ ) {
9899 arg_ty arg = asdl_seq_GET (args , i );
99100 VALIDATE_POSITIONS (arg );
100101 if (arg -> annotation && !validate_expr (state , arg -> annotation , Load ))
@@ -121,6 +122,7 @@ expr_context_name(expr_context_ty ctx)
121122static int
122123validate_arguments (struct validator * state , arguments_ty args )
123124{
125+ assert (!PyErr_Occurred ());
124126 if (!validate_args (state , args -> posonlyargs ) || !validate_args (state , args -> args )) {
125127 return 0 ;
126128 }
@@ -149,6 +151,7 @@ validate_arguments(struct validator *state, arguments_ty args)
149151static int
150152validate_constant (struct validator * state , PyObject * value )
151153{
154+ assert (!PyErr_Occurred ());
152155 if (value == Py_None || value == Py_Ellipsis )
153156 return 1 ;
154157
@@ -205,6 +208,7 @@ validate_constant(struct validator *state, PyObject *value)
205208static int
206209validate_expr (struct validator * state , expr_ty exp , expr_context_ty ctx )
207210{
211+ assert (!PyErr_Occurred ());
208212 VALIDATE_POSITIONS (exp );
209213 int ret = -1 ;
210214 if (++ state -> recursion_depth > state -> recursion_limit ) {
@@ -465,6 +469,7 @@ ensure_literal_complex(expr_ty exp)
465469static int
466470validate_pattern_match_value (struct validator * state , expr_ty exp )
467471{
472+ assert (!PyErr_Occurred ());
468473 if (!validate_expr (state , exp , Load )) {
469474 return 0 ;
470475 }
@@ -518,6 +523,7 @@ validate_pattern_match_value(struct validator *state, expr_ty exp)
518523static int
519524validate_capture (PyObject * name )
520525{
526+ assert (!PyErr_Occurred ());
521527 if (_PyUnicode_EqualToASCIIString (name , "_" )) {
522528 PyErr_Format (PyExc_ValueError , "can't capture name '_' in patterns" );
523529 return 0 ;
@@ -528,6 +534,7 @@ validate_capture(PyObject *name)
528534static int
529535validate_pattern (struct validator * state , pattern_ty p , int star_ok )
530536{
537+ assert (!PyErr_Occurred ());
531538 VALIDATE_POSITIONS (p );
532539 int ret = -1 ;
533540 if (++ state -> recursion_depth > state -> recursion_limit ) {
@@ -580,7 +587,9 @@ validate_pattern(struct validator *state, pattern_ty p, int star_ok)
580587 break ;
581588 }
582589 }
583-
590+ if (ret == 0 ) {
591+ break ;
592+ }
584593 ret = validate_patterns (state , p -> v .MatchMapping .patterns , /*star_ok=*/ 0 );
585594 break ;
586595 case MatchClass_kind :
@@ -611,6 +620,9 @@ validate_pattern(struct validator *state, pattern_ty p, int star_ok)
611620 break ;
612621 }
613622 }
623+ if (ret == 0 ) {
624+ break ;
625+ }
614626
615627 for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (p -> v .MatchClass .kwd_attrs ); i ++ ) {
616628 PyObject * identifier = asdl_seq_GET (p -> v .MatchClass .kwd_attrs , i );
@@ -619,6 +631,9 @@ validate_pattern(struct validator *state, pattern_ty p, int star_ok)
619631 break ;
620632 }
621633 }
634+ if (ret == 0 ) {
635+ break ;
636+ }
622637
623638 if (!validate_patterns (state , p -> v .MatchClass .patterns , /*star_ok=*/ 0 )) {
624639 ret = 0 ;
@@ -685,22 +700,24 @@ _validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
685700static int
686701validate_assignlist (struct validator * state , asdl_expr_seq * targets , expr_context_ty ctx )
687702{
703+ assert (!PyErr_Occurred ());
688704 return validate_nonempty_seq (targets , "targets" , ctx == Del ? "Delete" : "Assign" ) &&
689705 validate_exprs (state , targets , ctx , 0 );
690706}
691707
692708static int
693709validate_body (struct validator * state , asdl_stmt_seq * body , const char * owner )
694710{
711+ assert (!PyErr_Occurred ());
695712 return validate_nonempty_seq (body , "body" , owner ) && validate_stmts (state , body );
696713}
697714
698715static int
699716validate_stmt (struct validator * state , stmt_ty stmt )
700717{
718+ assert (!PyErr_Occurred ());
701719 VALIDATE_POSITIONS (stmt );
702720 int ret = -1 ;
703- Py_ssize_t i ;
704721 if (++ state -> recursion_depth > state -> recursion_limit ) {
705722 PyErr_SetString (PyExc_RecursionError ,
706723 "maximum recursion depth exceeded during compilation" );
@@ -771,7 +788,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
771788 case With_kind :
772789 if (!validate_nonempty_seq (stmt -> v .With .items , "items" , "With" ))
773790 return 0 ;
774- for (i = 0 ; i < asdl_seq_LEN (stmt -> v .With .items ); i ++ ) {
791+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (stmt -> v .With .items ); i ++ ) {
775792 withitem_ty item = asdl_seq_GET (stmt -> v .With .items , i );
776793 if (!validate_expr (state , item -> context_expr , Load ) ||
777794 (item -> optional_vars && !validate_expr (state , item -> optional_vars , Store )))
@@ -782,7 +799,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
782799 case AsyncWith_kind :
783800 if (!validate_nonempty_seq (stmt -> v .AsyncWith .items , "items" , "AsyncWith" ))
784801 return 0 ;
785- for (i = 0 ; i < asdl_seq_LEN (stmt -> v .AsyncWith .items ); i ++ ) {
802+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (stmt -> v .AsyncWith .items ); i ++ ) {
786803 withitem_ty item = asdl_seq_GET (stmt -> v .AsyncWith .items , i );
787804 if (!validate_expr (state , item -> context_expr , Load ) ||
788805 (item -> optional_vars && !validate_expr (state , item -> optional_vars , Store )))
@@ -795,7 +812,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
795812 || !validate_nonempty_seq (stmt -> v .Match .cases , "cases" , "Match" )) {
796813 return 0 ;
797814 }
798- for (i = 0 ; i < asdl_seq_LEN (stmt -> v .Match .cases ); i ++ ) {
815+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (stmt -> v .Match .cases ); i ++ ) {
799816 match_case_ty m = asdl_seq_GET (stmt -> v .Match .cases , i );
800817 if (!validate_pattern (state , m -> pattern , /*star_ok=*/ 0 )
801818 || (m -> guard && !validate_expr (state , m -> guard , Load ))
@@ -830,7 +847,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
830847 PyErr_SetString (PyExc_ValueError , "Try has orelse but no except handlers" );
831848 return 0 ;
832849 }
833- for (i = 0 ; i < asdl_seq_LEN (stmt -> v .Try .handlers ); i ++ ) {
850+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (stmt -> v .Try .handlers ); i ++ ) {
834851 excepthandler_ty handler = asdl_seq_GET (stmt -> v .Try .handlers , i );
835852 VALIDATE_POSITIONS (handler );
836853 if ((handler -> v .ExceptHandler .type &&
@@ -856,7 +873,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
856873 PyErr_SetString (PyExc_ValueError , "TryStar has orelse but no except handlers" );
857874 return 0 ;
858875 }
859- for (i = 0 ; i < asdl_seq_LEN (stmt -> v .TryStar .handlers ); i ++ ) {
876+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (stmt -> v .TryStar .handlers ); i ++ ) {
860877 excepthandler_ty handler = asdl_seq_GET (stmt -> v .TryStar .handlers , i );
861878 if ((handler -> v .ExceptHandler .type &&
862879 !validate_expr (state , handler -> v .ExceptHandler .type , Load )) ||
@@ -916,8 +933,8 @@ validate_stmt(struct validator *state, stmt_ty stmt)
916933static int
917934validate_stmts (struct validator * state , asdl_stmt_seq * seq )
918935{
919- Py_ssize_t i ;
920- for (i = 0 ; i < asdl_seq_LEN (seq ); i ++ ) {
936+ assert (! PyErr_Occurred ()) ;
937+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (seq ); i ++ ) {
921938 stmt_ty stmt = asdl_seq_GET (seq , i );
922939 if (stmt ) {
923940 if (!validate_stmt (state , stmt ))
@@ -935,8 +952,8 @@ validate_stmts(struct validator *state, asdl_stmt_seq *seq)
935952static int
936953validate_exprs (struct validator * state , asdl_expr_seq * exprs , expr_context_ty ctx , int null_ok )
937954{
938- Py_ssize_t i ;
939- for (i = 0 ; i < asdl_seq_LEN (exprs ); i ++ ) {
955+ assert (! PyErr_Occurred ()) ;
956+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (exprs ); i ++ ) {
940957 expr_ty expr = asdl_seq_GET (exprs , i );
941958 if (expr ) {
942959 if (!validate_expr (state , expr , ctx ))
@@ -955,8 +972,8 @@ validate_exprs(struct validator *state, asdl_expr_seq *exprs, expr_context_ty ct
955972static int
956973validate_patterns (struct validator * state , asdl_pattern_seq * patterns , int star_ok )
957974{
958- Py_ssize_t i ;
959- for (i = 0 ; i < asdl_seq_LEN (patterns ); i ++ ) {
975+ assert (! PyErr_Occurred ()) ;
976+ for (Py_ssize_t i = 0 ; i < asdl_seq_LEN (patterns ); i ++ ) {
960977 pattern_ty pattern = asdl_seq_GET (patterns , i );
961978 if (!validate_pattern (state , pattern , star_ok )) {
962979 return 0 ;
@@ -972,6 +989,7 @@ validate_patterns(struct validator *state, asdl_pattern_seq *patterns, int star_
972989int
973990_PyAST_Validate (mod_ty mod )
974991{
992+ assert (!PyErr_Occurred ());
975993 int res = -1 ;
976994 struct validator state ;
977995 PyThreadState * tstate ;
0 commit comments