diff options
Diffstat (limited to 'Python/future.c')
-rw-r--r-- | Python/future.c | 75 |
1 files changed, 27 insertions, 48 deletions
diff --git a/Python/future.c b/Python/future.c index 1663a38..0e68845 100644 --- a/Python/future.c +++ b/Python/future.c @@ -4,15 +4,15 @@ #include "token.h" #include "graminit.h" #include "code.h" +#include "compile.h" #include "symtable.h" -#include "ast.h" #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined" #define ERR_LATE_FUTURE \ "from __future__ imports must occur at the beginning of the file" static int -future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) +future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename) { int i; asdl_seq *names; @@ -22,7 +22,7 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) names = s->v.ImportFrom.names; for (i = 0; i < asdl_seq_LEN(names); i++) { alias_ty name = (alias_ty)asdl_seq_GET(names, i); - const char *feature = PyUnicode_AsUTF8(name->name); + const char *feature = PyString_AsString(name->name); if (!feature) return 0; if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) { @@ -30,30 +30,24 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) } else if (strcmp(feature, FUTURE_GENERATORS) == 0) { continue; } else if (strcmp(feature, FUTURE_DIVISION) == 0) { - continue; + ff->ff_features |= CO_FUTURE_DIVISION; } else if (strcmp(feature, FUTURE_ABSOLUTE_IMPORT) == 0) { - continue; + ff->ff_features |= CO_FUTURE_ABSOLUTE_IMPORT; } else if (strcmp(feature, FUTURE_WITH_STATEMENT) == 0) { - continue; + ff->ff_features |= CO_FUTURE_WITH_STATEMENT; } else if (strcmp(feature, FUTURE_PRINT_FUNCTION) == 0) { - continue; + ff->ff_features |= CO_FUTURE_PRINT_FUNCTION; } 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; - } else if (strcmp(feature, FUTURE_GENERATOR_STOP) == 0) { - continue; - } else if (strcmp(feature, FUTURE_ANNOTATIONS) == 0) { - ff->ff_features |= CO_FUTURE_ANNOTATIONS; + ff->ff_features |= CO_FUTURE_UNICODE_LITERALS; } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); - PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); + PyErr_SyntaxLocation(filename, s->lineno); return 0; } else { PyErr_Format(PyExc_SyntaxError, UNDEFINED_FUTURE_FEATURE, feature); - PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset + 1); + PyErr_SyntaxLocation(filename, s->lineno); return 0; } } @@ -61,16 +55,13 @@ future_check_features(PyFutureFeatures *ff, stmt_ty s, PyObject *filename) } static int -future_parse(PyFutureFeatures *ff, mod_ty mod, PyObject *filename) +future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename) { - int i, done = 0, prev_line = 0; + int i, found_docstring = 0, done = 0, prev_line = 0; if (!(mod->kind == Module_kind || mod->kind == Interactive_kind)) return 1; - if (asdl_seq_LEN(mod->v.Module.body) == 0) - return 1; - /* 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 @@ -79,11 +70,8 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, PyObject *filename) but is preceded by a regular import. */ - i = 0; - if (_PyAST_GetDocString(mod->v.Module.body) != NULL) - i++; - for (; i < asdl_seq_LEN(mod->v.Module.body); i++) { + for (i = 0; i < asdl_seq_LEN(mod->v.Module.body); i++) { stmt_ty s = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i); if (done && s->lineno > prev_line) @@ -98,32 +86,38 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, PyObject *filename) if (s->kind == ImportFrom_kind) { identifier modname = s->v.ImportFrom.module; - if (modname && - _PyUnicode_EqualToASCIIString(modname, "__future__")) { + if (modname && PyString_GET_SIZE(modname) == 10 && + !strcmp(PyString_AS_STRING(modname), "__future__")) { if (done) { PyErr_SetString(PyExc_SyntaxError, ERR_LATE_FUTURE); - PyErr_SyntaxLocationObject(filename, s->lineno, s->col_offset); + PyErr_SyntaxLocation(filename, + s->lineno); return 0; } if (!future_check_features(ff, s, filename)) return 0; ff->ff_lineno = s->lineno; } - else { + else done = 1; - } } - else { - done = 1; + else if (s->kind == Expr_kind && !found_docstring) { + expr_ty e = s->v.Expr.value; + if (e->kind != Str_kind) + done = 1; + else + found_docstring = 1; } + else + done = 1; } return 1; } PyFutureFeatures * -PyFuture_FromASTObject(mod_ty mod, PyObject *filename) +PyFuture_FromAST(mod_ty mod, const char *filename) { PyFutureFeatures *ff; @@ -141,18 +135,3 @@ PyFuture_FromASTObject(mod_ty mod, PyObject *filename) } return ff; } - - -PyFutureFeatures * -PyFuture_FromAST(mod_ty mod, const char *filename_str) -{ - PyFutureFeatures *ff; - PyObject *filename; - - filename = PyUnicode_DecodeFSDefault(filename_str); - if (filename == NULL) - return NULL; - ff = PyFuture_FromASTObject(mod, filename); - Py_DECREF(filename); - return ff; -} |