@@ -16,13 +16,16 @@ static node *parsetok(struct tok_state *, grammar *, int, perrdetail *, int *);
1616static int initerr (perrdetail * err_ret , PyObject * filename );
1717
1818typedef struct {
19- int * items ;
19+ struct {
20+ int lineno ;
21+ char * comment ;
22+ } * items ;
2023 size_t size ;
2124 size_t num_items ;
22- } growable_int_array ;
25+ } growable_comment_array ;
2326
2427static int
25- growable_int_array_init ( growable_int_array * arr , size_t initial_size ) {
28+ growable_comment_array_init ( growable_comment_array * arr , size_t initial_size ) {
2629 assert (initial_size > 0 );
2730 arr -> items = malloc (initial_size * sizeof (* arr -> items ));
2831 arr -> size = initial_size ;
@@ -32,7 +35,7 @@ growable_int_array_init(growable_int_array *arr, size_t initial_size) {
3235}
3336
3437static int
35- growable_int_array_add ( growable_int_array * arr , int item ) {
38+ growable_comment_array_add ( growable_comment_array * arr , int lineno , char * comment ) {
3639 if (arr -> num_items >= arr -> size ) {
3740 arr -> size *= 2 ;
3841 arr -> items = realloc (arr -> items , arr -> size * sizeof (* arr -> items ));
@@ -41,13 +44,17 @@ growable_int_array_add(growable_int_array *arr, int item) {
4144 }
4245 }
4346
44- arr -> items [arr -> num_items ] = item ;
47+ arr -> items [arr -> num_items ].lineno = lineno ;
48+ arr -> items [arr -> num_items ].comment = comment ;
4549 arr -> num_items ++ ;
4650 return 1 ;
4751}
4852
4953static void
50- growable_int_array_deallocate (growable_int_array * arr ) {
54+ growable_comment_array_deallocate (growable_comment_array * arr ) {
55+ for (unsigned i = 0 ; i < arr -> num_items ; i ++ ) {
56+ PyObject_FREE (arr -> items [i ].comment );
57+ }
5158 free (arr -> items );
5259}
5360
@@ -220,9 +227,9 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
220227 node * n ;
221228 int started = 0 ;
222229 int col_offset , end_col_offset ;
223- growable_int_array type_ignores ;
230+ growable_comment_array type_ignores ;
224231
225- if (!growable_int_array_init (& type_ignores , 10 )) {
232+ if (!growable_comment_array_init (& type_ignores , 10 )) {
226233 err_ret -> error = E_NOMEM ;
227234 PyTokenizer_Free (tok );
228235 return NULL ;
@@ -320,8 +327,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
320327 }
321328
322329 if (type == TYPE_IGNORE ) {
323- PyObject_FREE (str );
324- if (!growable_int_array_add (& type_ignores , tok -> lineno )) {
330+ if (!growable_comment_array_add (& type_ignores , tok -> lineno , str )) {
325331 err_ret -> error = E_NOMEM ;
326332 break ;
327333 }
@@ -355,17 +361,24 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
355361 REQ (ch , ENDMARKER );
356362
357363 for (i = 0 ; i < type_ignores .num_items ; i ++ ) {
358- PyNode_AddChild (ch , TYPE_IGNORE , NULL ,
359- type_ignores .items [i ], 0 ,
360- type_ignores .items [i ], 0 );
364+ int res = PyNode_AddChild (ch , TYPE_IGNORE , type_ignores .items [i ].comment ,
365+ type_ignores .items [i ].lineno , 0 ,
366+ type_ignores .items [i ].lineno , 0 );
367+ if (res != 0 ) {
368+ err_ret -> error = res ;
369+ PyNode_Free (n );
370+ n = NULL ;
371+ break ;
372+ }
373+ type_ignores .items [i ].comment = NULL ;
361374 }
362375 }
363376
364377 /* Check that the source for a single input statement really
365378 is a single statement by looking at what is left in the
366379 buffer after parsing. Trailing whitespace and comments
367380 are OK. */
368- if (start == single_input ) {
381+ if (err_ret -> error == E_DONE && start == single_input ) {
369382 char * cur = tok -> cur ;
370383 char c = * tok -> cur ;
371384
@@ -392,7 +405,7 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret,
392405 else
393406 n = NULL ;
394407
395- growable_int_array_deallocate (& type_ignores );
408+ growable_comment_array_deallocate (& type_ignores );
396409
397410#ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD
398411 * flags = ps -> p_flags ;
0 commit comments