| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											2021-03-17 23:50:50 +01:00
										 |  |  | #include "pycore_ast.h"           // _PyAST_GetDocString()
 | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined"
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 67028,67040,67044,67046,67052,67065,67070,67077,67082 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r67028 | benjamin.peterson | 2008-10-25 18:27:07 -0500 (Sat, 25 Oct 2008) | 1 line
  don't use a catch-all
........
  r67040 | armin.rigo | 2008-10-28 12:01:21 -0500 (Tue, 28 Oct 2008) | 5 lines
  Fix one of the tests: it relied on being present in an "output test" in
  order to actually test what it was supposed to test, i.e. that the code
  in the __del__ method did not crash.  Use instead the new helper
  test_support.captured_output().
........
  r67044 | amaury.forgeotdarc | 2008-10-29 18:15:57 -0500 (Wed, 29 Oct 2008) | 3 lines
  Correct error message in io.open():
  closefd=True is the only accepted value with a file name.
........
  r67046 | thomas.heller | 2008-10-30 15:18:13 -0500 (Thu, 30 Oct 2008) | 2 lines
  Fixed a modulefinder crash on certain relative imports.
........
  r67052 | christian.heimes | 2008-10-30 16:26:15 -0500 (Thu, 30 Oct 2008) | 1 line
  Issue #4237: io.FileIO() was raising invalid warnings caused by insufficient initialization of PyFileIOObject struct members.
........
  r67065 | benjamin.peterson | 2008-10-30 18:59:18 -0500 (Thu, 30 Oct 2008) | 1 line
  move unprefixed error into .c file
........
  r67070 | benjamin.peterson | 2008-10-31 15:41:44 -0500 (Fri, 31 Oct 2008) | 1 line
  rephrase has_key doc
........
  r67077 | benjamin.peterson | 2008-11-03 09:14:51 -0600 (Mon, 03 Nov 2008) | 1 line
  #4048 make the parser module accept relative imports as valid
........
  r67082 | hirokazu.yamamoto | 2008-11-03 12:03:06 -0600 (Mon, 03 Nov 2008) | 2 lines
  Issue #3774: Fixed an error when create a Tkinter menu item without command
  and then remove it. Written by Guilherme Polo (gpolo).
........
											
										 
											2008-11-03 20:31:38 +00:00
										 |  |  | #define ERR_LATE_FUTURE \
 | 
					
						
							|  |  |  | "from __future__ imports must occur at the beginning of the file" | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							| 
									
										
										
										
											2013-08-26 22:28:21 +02:00
										 |  |  | future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert(s->kind == ImportFrom_kind); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-16 19:42:00 +01:00
										 |  |  |     asdl_alias_seq *names = s->v.ImportFrom.names; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     for (i = 0; i < asdl_seq_LEN(names); i++) { | 
					
						
							|  |  |  |         alias_ty name = (alias_ty)asdl_seq_GET(names, i); | 
					
						
							| 
									
										
										
										
											2016-11-20 09:13:07 +02:00
										 |  |  |         const char *feature = PyUnicode_AsUTF8(name->name); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         if (!feature) | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_GENERATORS) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_DIVISION) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_ABSOLUTE_IMPORT) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_WITH_STATEMENT) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_PRINT_FUNCTION) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_UNICODE_LITERALS) == 0) { | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         } else if (strcmp(feature, FUTURE_BARRY_AS_BDFL) == 0) { | 
					
						
							|  |  |  |             ff->ff_features |= CO_FUTURE_BARRY_AS_BDFL; | 
					
						
							| 
									
										
										
										
											2015-05-09 11:44:30 -04:00
										 |  |  |         } else if (strcmp(feature, FUTURE_GENERATOR_STOP) == 0) { | 
					
						
							| 
									
										
										
										
											2018-01-26 15:24:24 -05:00
										 |  |  |             continue; | 
					
						
							| 
									
										
										
										
											2018-01-26 08:20:18 -08:00
										 |  |  |         } else if (strcmp(feature, FUTURE_ANNOTATIONS) == 0) { | 
					
						
							| 
									
										
										
										
											2021-04-21 12:41:19 +01:00
										 |  |  |             ff->ff_features |= CO_FUTURE_ANNOTATIONS; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } else if (strcmp(feature, "braces") == 0) { | 
					
						
							|  |  |  |             PyErr_SetString(PyExc_SyntaxError, | 
					
						
							|  |  |  |                             "not a chance"); | 
					
						
							| 
									
										
										
										
											2018-09-24 17:12:49 -04:00
										 |  |  |             PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             PyErr_Format(PyExc_SyntaxError, | 
					
						
							|  |  |  |                          UNDEFINED_FUTURE_FEATURE, feature); | 
					
						
							| 
									
										
										
										
											2018-09-24 17:12:49 -04:00
										 |  |  |             PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-11-13 18:41:28 +00:00
										 |  |  | static int | 
					
						
							| 
									
										
										
										
											2013-08-26 22:28:21 +02:00
										 |  |  | future_parse(PyFutureFeatures *ff, mod_ty mod, PyObject *filename) | 
					
						
							| 
									
										
										
										
											2001-02-28 01:58:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-03-16 09:15:47 -07:00
										 |  |  |     int i, done = 0, prev_line = 0; | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!(mod->kind == Module_kind || mod->kind == Interactive_kind)) | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-16 09:15:47 -07:00
										 |  |  |     if (asdl_seq_LEN(mod->v.Module.body) == 0) | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* A subsequent pass will detect future imports that don't
 | 
					
						
							|  |  |  |        appear at the beginning of the file.  There's one case, | 
					
						
							|  |  |  |        however, that is easier to handle here: A series of imports | 
					
						
							|  |  |  |        joined by semi-colons, where the first import is a future | 
					
						
							|  |  |  |        statement but some subsequent import has the future form | 
					
						
							|  |  |  |        but is preceded by a regular import. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 12:04:55 +03:00
										 |  |  |     i = 0; | 
					
						
							| 
									
										
										
										
											2018-05-30 10:56:16 +03:00
										 |  |  |     if (_PyAST_GetDocString(mod->v.Module.body) != NULL) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:04:55 +03:00
										 |  |  |         i++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; i < asdl_seq_LEN(mod->v.Module.body); i++) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         stmt_ty s = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (done && s->lineno > prev_line) | 
					
						
							|  |  |  |             return 1; | 
					
						
							|  |  |  |         prev_line = s->lineno; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /* The tests below will return from this function unless it is
 | 
					
						
							|  |  |  |            still possible to find a future statement.  The only things | 
					
						
							|  |  |  |            that can precede a future statement are another future | 
					
						
							|  |  |  |            statement and a doc string. | 
					
						
							|  |  |  |         */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (s->kind == ImportFrom_kind) { | 
					
						
							| 
									
										
										
										
											2012-03-23 12:50:53 +00:00
										 |  |  |             identifier modname = s->v.ImportFrom.module; | 
					
						
							| 
									
										
										
										
											2012-03-22 08:56:15 -04:00
										 |  |  |             if (modname && | 
					
						
							| 
									
										
										
										
											2016-11-16 10:17:58 +02:00
										 |  |  |                 _PyUnicode_EqualToASCIIString(modname, "__future__")) { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                 if (done) { | 
					
						
							|  |  |  |                     PyErr_SetString(PyExc_SyntaxError, | 
					
						
							|  |  |  |                                     ERR_LATE_FUTURE); | 
					
						
							| 
									
										
										
										
											2013-08-26 22:28:21 +02:00
										 |  |  |                     PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset); | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                     return 0; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 if (!future_check_features(ff, s, filename)) | 
					
						
							|  |  |  |                     return 0; | 
					
						
							|  |  |  |                 ff->ff_lineno = s->lineno; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2013-03-16 09:15:47 -07:00
										 |  |  |             else { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |                 done = 1; | 
					
						
							| 
									
										
										
										
											2013-03-16 09:15:47 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-03-16 09:15:47 -07:00
										 |  |  |         else { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |             done = 1; | 
					
						
							| 
									
										
										
										
											2013-03-16 09:15:47 -07:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |     return 1; | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-10-20 19:59:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | PyFutureFeatures * | 
					
						
							| 
									
										
										
										
											2021-03-24 00:51:50 +01:00
										 |  |  | _PyFuture_FromAST(mod_ty mod, PyObject *filename) | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyFutureFeatures *ff; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ff = (PyFutureFeatures *)PyObject_Malloc(sizeof(PyFutureFeatures)); | 
					
						
							|  |  |  |     if (ff == NULL) { | 
					
						
							|  |  |  |         PyErr_NoMemory(); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ff->ff_features = 0; | 
					
						
							|  |  |  |     ff->ff_lineno = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!future_parse(ff, mod, filename)) { | 
					
						
							|  |  |  |         PyObject_Free(ff); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ff; | 
					
						
							| 
									
										
										
										
											2001-02-27 19:07:02 +00:00
										 |  |  | } |