Staging
v0.5.1
https://github.com/python/cpython
Revision dcdc87235161b7641c76723fbab4153f5f21767b authored by Georg Brandl on 06 October 2010, 09:01:31 UTC, committed by Georg Brandl on 06 October 2010, 09:01:31 UTC
svn+ssh://svn.python.org/python/branches/py3k

................
  r77835 | martin.v.loewis | 2010-01-30 01:16:49 +0100 (Sa, 30 Jan 2010) | 9 lines

  Merged revisions 77834 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r77834 | martin.v.loewis | 2010-01-30 01:15:44 +0100 (Sa, 30 Jan 2010) | 2 lines

    Add Victor Stinner.
  ........
................
  r78455 | martin.v.loewis | 2010-02-25 21:45:06 +0100 (Do, 25 Feb 2010) | 17 lines

  Merged revisions 78327,78399,78454 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r78327 | andrew.kuchling | 2010-02-22 18:21:54 +0100 (Mo, 22 Feb 2010) | 1 line

    Note granting of commit privileges to Larry Hastings
  ........
    r78399 | brett.cannon | 2010-02-24 02:38:04 +0100 (Mi, 24 Feb 2010) | 1 line

    Record that Dino Viehland got commit privs.
  ........
    r78454 | martin.v.loewis | 2010-02-25 21:42:40 +0100 (Do, 25 Feb 2010) | 2 lines

    Add Florent Xicluna.
  ........
................
  r79375 | martin.v.loewis | 2010-03-24 16:07:12 +0100 (Mi, 24 Mär 2010) | 9 lines

  Merged revisions 79374 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r79374 | martin.v.loewis | 2010-03-24 16:05:53 +0100 (Mi, 24 Mär 2010) | 2 lines

    Add Brian Curtin.
  ........
................
  r80153 | martin.v.loewis | 2010-04-17 19:11:55 +0200 (Sa, 17 Apr 2010) | 9 lines

  Merged revisions 80152 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r80152 | martin.v.loewis | 2010-04-17 19:10:55 +0200 (Sa, 17 Apr 2010) | 2 lines

    Add Giampaolo.
  ........
................
  r80302 | martin.v.loewis | 2010-04-21 08:38:30 +0200 (Mi, 21 Apr 2010) | 9 lines

  Merged revisions 80301 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r80301 | martin.v.loewis | 2010-04-21 08:37:48 +0200 (Mi, 21 Apr 2010) | 2 lines

    Add Tim Golden.
  ........
................
  r81532 | martin.v.loewis | 2010-05-25 22:07:11 +0200 (Di, 25 Mai 2010) | 9 lines

  Merged revisions 81531 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r81531 | martin.v.loewis | 2010-05-25 22:06:02 +0200 (Di, 25 Mai 2010) | 2 lines

    Add Alexander Belopolsky.
  ........
................
  r83735 | martin.v.loewis | 2010-08-04 21:08:20 +0200 (Mi, 04 Aug 2010) | 2 lines

  Add Terry Reedy.
................
  r83939 | brett.cannon | 2010-08-11 02:18:19 +0200 (Mi, 11 Aug 2010) | 2 lines

  Note that Éric Araujo has been given commit privileges.
................
  r83943 | martin.v.loewis | 2010-08-11 07:48:57 +0200 (Mi, 11 Aug 2010) | 2 lines

  Add George Boutsioukis, from the GSoC project.
................
  r84166 | martin.v.loewis | 2010-08-18 00:58:42 +0200 (Mi, 18 Aug 2010) | 2 lines

  Add Ask Solem.
................
  r84167 | martin.v.loewis | 2010-08-18 01:16:51 +0200 (Mi, 18 Aug 2010) | 2 lines

  Correct library name that Ask will work on.
................
  r84257 | martin.v.loewis | 2010-08-22 10:46:19 +0200 (So, 22 Aug 2010) | 2 lines

  Add Daniel Stutzbach.
................
  r85215 | martin.v.loewis | 2010-10-04 17:48:14 +0200 (Mo, 04 Okt 2010) | 2 lines

  Add Tal Einat.
................
1 parent f243dad
Raw File
Tip revision: dcdc87235161b7641c76723fbab4153f5f21767b authored by Georg Brandl on 06 October 2010, 09:01:31 UTC
Merged revisions 77835,78455,79375,80153,80302,81532,83735,83939,83943,84166-84167,84257,85215 via svnmerge from
Tip revision: dcdc872
future.c
#include "Python.h"
#include "Python-ast.h"
#include "node.h"
#include "token.h"
#include "graminit.h"
#include "code.h"
#include "compile.h"
#include "symtable.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, const char *filename)
{
    int i;
    asdl_seq *names;

    assert(s->kind == ImportFrom_kind);

    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_AsString(name->name);
        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;
        } else if (strcmp(feature, "braces") == 0) {
            PyErr_SetString(PyExc_SyntaxError,
                            "not a chance");
            PyErr_SyntaxLocation(filename, s->lineno);
            return 0;
        } else {
            PyErr_Format(PyExc_SyntaxError,
                         UNDEFINED_FUTURE_FEATURE, feature);
            PyErr_SyntaxLocation(filename, s->lineno);
            return 0;
        }
    }
    return 1;
}

static int
future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
{
    int i, found_docstring = 0, done = 0, prev_line = 0;

    static PyObject *future;
    if (!future) {
        future = PyUnicode_InternFromString("__future__");
        if (!future)
            return 0;
    }

    if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
        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
       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.
    */


    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)
            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) {
            if (s->v.ImportFrom.module == future) {
                if (done) {
                    PyErr_SetString(PyExc_SyntaxError,
                                    ERR_LATE_FUTURE);
                    PyErr_SyntaxLocation(filename,
                                         s->lineno);
                    return 0;
                }
                if (!future_check_features(ff, s, filename))
                    return 0;
                ff->ff_lineno = s->lineno;
            }
            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_FromAST(mod_ty mod, const char *filename)
{
    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;
}
back to top