mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	bpo-33308: Fix a crash in the parser module when convert an ST object. (#6519)
Converting with line_info=False and col_info=True crashed before.
This commit is contained in:
		
							parent
							
								
									c127a86e18
								
							
						
					
					
						commit
						e5362eaa75
					
				
					 3 changed files with 27 additions and 10 deletions
				
			
		|  | @ -322,21 +322,19 @@ def test_position(self): | |||
|         # An absolutely minimal test of position information.  Better | ||||
|         # tests would be a big project. | ||||
|         code = "def f(x):\n    return x + 1" | ||||
|         st1 = parser.suite(code) | ||||
|         st2 = st1.totuple(line_info=1, col_info=1) | ||||
|         st = parser.suite(code) | ||||
| 
 | ||||
|         def walk(tree): | ||||
|             node_type = tree[0] | ||||
|             next = tree[1] | ||||
|             if isinstance(next, tuple): | ||||
|             if isinstance(next, (tuple, list)): | ||||
|                 for elt in tree[1:]: | ||||
|                     for x in walk(elt): | ||||
|                         yield x | ||||
|             else: | ||||
|                 yield tree | ||||
| 
 | ||||
|         terminals = list(walk(st2)) | ||||
|         self.assertEqual([ | ||||
|         expected = [ | ||||
|             (1, 'def', 1, 0), | ||||
|             (1, 'f', 1, 4), | ||||
|             (7, '(', 1, 5), | ||||
|  | @ -352,8 +350,25 @@ def walk(tree): | |||
|             (4, '', 2, 16), | ||||
|             (6, '', 2, -1), | ||||
|             (4, '', 2, -1), | ||||
|             (0, '', 2, -1)], | ||||
|                          terminals) | ||||
|             (0, '', 2, -1), | ||||
|         ] | ||||
| 
 | ||||
|         self.assertEqual(list(walk(st.totuple(line_info=True, col_info=True))), | ||||
|                          expected) | ||||
|         self.assertEqual(list(walk(st.totuple())), | ||||
|                          [(t, n) for t, n, l, c in expected]) | ||||
|         self.assertEqual(list(walk(st.totuple(line_info=True))), | ||||
|                          [(t, n, l) for t, n, l, c in expected]) | ||||
|         self.assertEqual(list(walk(st.totuple(col_info=True))), | ||||
|                          [(t, n, c) for t, n, l, c in expected]) | ||||
|         self.assertEqual(list(walk(st.tolist(line_info=True, col_info=True))), | ||||
|                          [list(x) for x in expected]) | ||||
|         self.assertEqual(list(walk(parser.st2tuple(st, line_info=True, | ||||
|                                                    col_info=True))), | ||||
|                          expected) | ||||
|         self.assertEqual(list(walk(parser.st2list(st, line_info=True, | ||||
|                                                   col_info=True))), | ||||
|                          [list(x) for x in expected]) | ||||
| 
 | ||||
|     def test_extended_unpacking(self): | ||||
|         self.check_suite("*a = y") | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Fixed a crash in the :mod:`parser` module when converting an ST object to a | ||||
| tree of tuples or lists with ``line_info=False`` and ``col_info=True``. | ||||
|  | @ -135,18 +135,18 @@ node2tuple(node *n,                     /* node to convert               */ | |||
|             goto error; | ||||
|         (void) addelem(result, 1, w); | ||||
| 
 | ||||
|         if (lineno == 1) { | ||||
|         if (lineno) { | ||||
|             w = PyLong_FromLong(n->n_lineno); | ||||
|             if (w == NULL) | ||||
|                 goto error; | ||||
|             (void) addelem(result, 2, w); | ||||
|         } | ||||
| 
 | ||||
|         if (col_offset == 1) { | ||||
|         if (col_offset) { | ||||
|             w = PyLong_FromLong(n->n_col_offset); | ||||
|             if (w == NULL) | ||||
|                 goto error; | ||||
|             (void) addelem(result, 3, w); | ||||
|             (void) addelem(result, 2 + lineno, w); | ||||
|         } | ||||
|     } | ||||
|     else { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka