annotate Python/future.c @ 61184:4fd3ab5fa71d

Make (most of) Python's tests pass under Thread Sanitizer. http://code.google.com/p/data-race-test/wiki/ThreadSanitizer is a dynamic data race detector that runs on top of valgrind. With this patch, the binaries at http://code.google.com/p/data-race-test/wiki/ThreadSanitizer#Binaries pass many but not all of the Python tests. All of regrtest still passes outside of tsan. I've implemented part of the C1x atomic types so that we can explicitly mark variables that are used across threads, and get defined behavior as compilers advance. I've added tsan's client header and implementation to the codebase in dynamic_annotations.{h,c} (docs at http://code.google.com/p/data-race-test/wiki/DynamicAnnotations). Unfortunately, I haven't been able to get helgrind and drd to give sensible error messages, even when I use their client annotations, so I'm not supporting them.
author Jeffrey Yasskin <jyasskin@gmail.com>
date Mon, 03 May 2010 19:29:34 +0000
parents 0530aadff696
children cab14be0ada1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
1 #include "Python.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
2 #include "Python-ast.h"
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
3 #include "node.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
4 #include "token.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
5 #include "graminit.h"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
6 #include "code.h"
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
7 #include "compile.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
8 #include "symtable.h"
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
9
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
10 #define UNDEFINED_FUTURE_FEATURE "future feature %.100s is not defined"
49633
bd0e9a9cd283 Merged revisions 67028,67040,67044,67046,67052,67065,67070,67077,67082 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
11 #define ERR_LATE_FUTURE \
bd0e9a9cd283 Merged revisions 67028,67040,67044,67046,67052,67065,67070,67077,67082 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48660
diff changeset
12 "from __future__ imports must occur at the beginning of the file"
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
13
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
14 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
15 future_check_features(PyFutureFeatures *ff, stmt_ty s, const char *filename)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
16 {
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
17 int i;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
18 asdl_seq *names;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
19
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
20 assert(s->kind == ImportFrom_kind);
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
21
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
22 names = s->v.ImportFrom.names;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
23 for (i = 0; i < asdl_seq_LEN(names); i++) {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
24 alias_ty name = (alias_ty)asdl_seq_GET(names, i);
48660
85b67fb5672b Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents: 46120
diff changeset
25 const char *feature = _PyUnicode_AsString(name->name);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
26 if (!feature)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
27 return 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
28 if (strcmp(feature, FUTURE_NESTED_SCOPES) == 0) {
19158
97a3d3d7029f Refactor future feature handling
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19051
diff changeset
29 continue;
18609
59446d0f8341 Preliminary support for "from __future__ import generators" to enable
Guido van Rossum <guido@python.org>
parents: 17018
diff changeset
30 } else if (strcmp(feature, FUTURE_GENERATORS) == 0) {
22968
ba0236f84318 Removed more hair in support of future-generator stmts.
Tim Peters <tim.peters@gmail.com>
parents: 19407
diff changeset
31 continue;
19051
f20727cc3d0f Implement PEP 238 in its (almost) full glory.
Guido van Rossum <guido@python.org>
parents: 18612
diff changeset
32 } else if (strcmp(feature, FUTURE_DIVISION) == 0) {
36988
49c6eb688906 Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents: 36726
diff changeset
33 continue;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
34 } else if (strcmp(feature, FUTURE_ABSOLUTE_IMPORT) == 0) {
36988
49c6eb688906 Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents: 36726
diff changeset
35 continue;
36726
bbf16fd024df from __future__ import with_statement addon for 'with', mostly written by
Thomas Wouters <thomas@python.org>
parents: 36712
diff changeset
36 } else if (strcmp(feature, FUTURE_WITH_STATEMENT) == 0) {
36988
49c6eb688906 Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents: 36726
diff changeset
37 continue;
45965
91ac8049e709 Add __future__ import for print_function. It's a no-op in 3.0, but it needs to not be a syntax error.
Eric Smith <eric@trueblade.com>
parents: 44568
diff changeset
38 } else if (strcmp(feature, FUTURE_PRINT_FUNCTION) == 0) {
91ac8049e709 Add __future__ import for print_function. It's a no-op in 3.0, but it needs to not be a syntax error.
Eric Smith <eric@trueblade.com>
parents: 44568
diff changeset
39 continue;
46120
78504d604b44 Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45965
diff changeset
40 } else if (strcmp(feature, FUTURE_UNICODE_LITERALS) == 0) {
78504d604b44 Merged revisions 61952-61953 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45965
diff changeset
41 continue;
52641
0530aadff696 The BDFL has retired! Long live the FLUFL (Friendly Language Uncle For Life)!
Brett Cannon <bcannon@gmail.com>
parents: 49633
diff changeset
42 } else if (strcmp(feature, FUTURE_BARRY_AS_BDFL) == 0) {
0530aadff696 The BDFL has retired! Long live the FLUFL (Friendly Language Uncle For Life)!
Brett Cannon <bcannon@gmail.com>
parents: 49633
diff changeset
43 ff->ff_features |= CO_FUTURE_BARRY_AS_BDFL;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16824
diff changeset
44 } else if (strcmp(feature, "braces") == 0) {
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16824
diff changeset
45 PyErr_SetString(PyExc_SyntaxError,
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16824
diff changeset
46 "not a chance");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
47 PyErr_SyntaxLocation(filename, s->lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
48 return 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
49 } else {
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
50 PyErr_Format(PyExc_SyntaxError,
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
51 UNDEFINED_FUTURE_FEATURE, feature);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
52 PyErr_SyntaxLocation(filename, s->lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
53 return 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
54 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
55 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
56 return 1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
57 }
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
58
35862
6867995a18a7 Prevent name pollution by making lots of internal functions static.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35742
diff changeset
59 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
60 future_parse(PyFutureFeatures *ff, mod_ty mod, const char *filename)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
61 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
62 int i, found_docstring = 0, done = 0, prev_line = 0;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
63
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
64 static PyObject *future;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
65 if (!future) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 39442
diff changeset
66 future = PyUnicode_InternFromString("__future__");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
67 if (!future)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
68 return 0;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
69 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
70
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
71 if (!(mod->kind == Module_kind || mod->kind == Interactive_kind))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
72 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
73
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
74 /* A subsequent pass will detect future imports that don't
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
75 appear at the beginning of the file. There's one case,
44568
305d7d2ce047 Copied doc for reload() from trunk's function.rst to imp.rst
Christian Heimes <christian@cheimes.de>
parents: 42822
diff changeset
76 however, that is easier to handle here: A series of imports
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
77 joined by semi-colons, where the first import is a future
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
78 statement but some subsequent import has the future form
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
79 but is preceded by a regular import.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
80 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
81
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
82
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
83 for (i = 0; i < asdl_seq_LEN(mod->v.Module.body); i++) {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
84 stmt_ty s = (stmt_ty)asdl_seq_GET(mod->v.Module.body, i);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
85
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
86 if (done && s->lineno > prev_line)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
87 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
88 prev_line = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
89
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
90 /* The tests below will return from this function unless it is
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
91 still possible to find a future statement. The only things
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
92 that can precede a future statement are another future
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
93 statement and a doc string.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
94 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
95
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
96 if (s->kind == ImportFrom_kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
97 if (s->v.ImportFrom.module == future) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
98 if (done) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
99 PyErr_SetString(PyExc_SyntaxError,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
100 ERR_LATE_FUTURE);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
101 PyErr_SyntaxLocation(filename,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
102 s->lineno);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
103 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
104 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
105 if (!future_check_features(ff, s, filename))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
106 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
107 ff->ff_lineno = s->lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
108 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
109 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
110 done = 1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
111 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
112 else if (s->kind == Expr_kind && !found_docstring) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
113 expr_ty e = s->v.Expr.value;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
114 if (e->kind != Str_kind)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
115 done = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
116 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
117 found_docstring = 1;
16823
acbe74f3a786 Presumed correct compiler pass for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16799
diff changeset
118 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
119 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
120 done = 1;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
121 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
122 return 1;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
123 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
124
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
125
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
126 PyFutureFeatures *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
127 PyFuture_FromAST(mod_ty mod, const char *filename)
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
128 {
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
129 PyFutureFeatures *ff;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
130
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
131 ff = (PyFutureFeatures *)PyObject_Malloc(sizeof(PyFutureFeatures));
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
132 if (ff == NULL) {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
133 PyErr_NoMemory();
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
134 return NULL;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
135 }
19158
97a3d3d7029f Refactor future feature handling
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19051
diff changeset
136 ff->ff_features = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
137 ff->ff_lineno = -1;
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
138
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 34539
diff changeset
139 if (!future_parse(ff, mod, filename)) {
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36988
diff changeset
140 PyObject_Free(ff);
16799
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
141 return NULL;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
142 }
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
143 return ff;
08d937107fe6 Improved __future__ parser; still more to do
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff changeset
144 }