mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-40619: Correctly handle error lines in programs without file mode (GH-20090)
This commit is contained in:
		
							parent
							
								
									a482dc500b
								
							
						
					
					
						commit
						bcc3036095
					
				
					 2 changed files with 7 additions and 25 deletions
				
			
		|  | @ -228,6 +228,8 @@ def bar(): | |||
|             def baz(): | ||||
|                 '''quux''' | ||||
|             """, 9, 20) | ||||
|         check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4) | ||||
|         check("(1+)", 1, 4) | ||||
| 
 | ||||
|         # Errors thrown by symtable.c | ||||
|         check('x = [(yield i) for i in range(3)]', 1, 5) | ||||
|  |  | |||
|  | @ -300,30 +300,6 @@ raise_tokenizer_init_error(PyObject *filename) | |||
|     Py_XDECREF(tuple); | ||||
| } | ||||
| 
 | ||||
| static inline PyObject * | ||||
| get_error_line(char *buffer, int is_file) | ||||
| { | ||||
|     const char *newline; | ||||
|     if (is_file) { | ||||
|         newline = strrchr(buffer, '\n'); | ||||
|     } else { | ||||
|         newline = strchr(buffer, '\n'); | ||||
|     } | ||||
| 
 | ||||
|     if (is_file) { | ||||
|         while (newline > buffer && newline[-1] == '\n') { | ||||
|             --newline; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (newline) { | ||||
|         return PyUnicode_DecodeUTF8(buffer, newline - buffer, "replace"); | ||||
|     } | ||||
|     else { | ||||
|         return PyUnicode_DecodeUTF8(buffer, strlen(buffer), "replace"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| tokenizer_error(Parser *p) | ||||
| { | ||||
|  | @ -422,7 +398,11 @@ _PyPegen_raise_error_known_location(Parser *p, PyObject *errtype, | |||
|     } | ||||
| 
 | ||||
|     if (!error_line) { | ||||
|         error_line = get_error_line(p->tok->buf, p->start_rule == Py_file_input); | ||||
|         Py_ssize_t size = p->tok->inp - p->tok->buf; | ||||
|         if (size && p->tok->buf[size-1] == '\n') { | ||||
|             size--; | ||||
|         } | ||||
|         error_line = PyUnicode_DecodeUTF8(p->tok->buf, size, "replace"); | ||||
|         if (!error_line) { | ||||
|             goto error; | ||||
|         } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Pablo Galindo
						Pablo Galindo