Mercurial > cpython-lru_cache-weakref
annotate Python/compile.c @ 50620:e987e0df8f48 3.0
Merged revisions 68363 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
r68363 | antoine.pitrou | 2009-01-06 20:02:24 +0100 (mar., 06 janv. 2009) | 17 lines
Merged revisions 68360-68361 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r68360 | antoine.pitrou | 2009-01-06 19:10:47 +0100 (mar., 06 janv. 2009) | 7 lines
Issue #1180193: When importing a module from a .pyc (or .pyo) file with
an existing .py counterpart, override the co_filename attributes of all
code objects if the original filename is obsolete (which can happen if the
file has been renamed, moved, or if it is accessed through different paths).
Patch by Ziga Seilnacht and Jean-Paul Calderone.
........
r68361 | antoine.pitrou | 2009-01-06 19:34:08 +0100 (mar., 06 janv. 2009) | 3 lines
Use shutil.rmtree rather than os.rmdir.
........
................
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Tue, 06 Jan 2009 19:08:18 +0000 |
| parents | cddd9180b8c8 |
| children | 581d8602f3f7 2ee4653927f7 |
| rev | line source |
|---|---|
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1 /* |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2 * This file compiles an abstract syntax tree (AST) into Python bytecode. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3 * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4 * The primary entry point is PyAST_Compile(), which returns a |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
5 * PyCodeObject. The compiler makes several passes to build the code |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
6 * object: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
7 * 1. Checks for future statements. See future.c |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
8 * 2. Builds a symbol table. See symtable.c. |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
9 * 3. Generate code for basic blocks. See compiler_mod() in this file. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
10 * 4. Assemble the basic blocks into final code. See assemble() in |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
11 * this file. |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
12 * 5. Optimize the byte code (peephole optimizations). See peephole.c |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
13 * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
14 * Note that compiler_mod() suggests module, but the module ast type |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
15 * (mod_ty) has cases for expressions and interactive statements. |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
16 * |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
17 * CAUTION: The VISIT_* macros abort the current function when they |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
18 * encounter a problem. So don't invoke them when there is memory |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
19 * which needs to be released. Code blocks are OK, as the compiler |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
20 * structure takes care of releasing those. Use the arena to manage |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
21 * objects. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
22 */ |
| 69 | 23 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
24 #include "Python.h" |
| 86 | 25 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
26 #include "Python-ast.h" |
| 69 | 27 #include "node.h" |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
28 #include "pyarena.h" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
29 #include "ast.h" |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
30 #include "code.h" |
| 69 | 31 #include "compile.h" |
|
16421
aa844711463a
Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16408
diff
changeset
|
32 #include "symtable.h" |
| 69 | 33 #include "opcode.h" |
|
5438
e926c331ebbf
Instead of importing graminit.h whenever one of the three grammar 'root'
Guido van Rossum <guido@python.org>
parents:
5373
diff
changeset
|
34 |
|
5164
8c277f29b535
Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents:
5119
diff
changeset
|
35 int Py_OptimizeFlag = 0; |
|
8c277f29b535
Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents:
5119
diff
changeset
|
36 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
37 #define DEFAULT_BLOCK_SIZE 16 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
38 #define DEFAULT_BLOCKS 8 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
39 #define DEFAULT_CODE_SIZE 128 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
40 #define DEFAULT_LNOTAB_SIZE 16 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
41 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
42 #define COMP_GENEXP 0 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
43 #define COMP_LISTCOMP 1 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
44 #define COMP_SETCOMP 2 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
45 #define COMP_DICTCOMP 3 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
46 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
47 struct instr { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
48 unsigned i_jabs : 1; |
|
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
49 unsigned i_jrel : 1; |
|
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
50 unsigned i_hasarg : 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
51 unsigned char i_opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
52 int i_oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
53 struct basicblock_ *i_target; /* target block (if jump instruction) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
54 int i_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
55 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
56 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
57 typedef struct basicblock_ { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
58 /* Each basicblock in a compilation unit is linked via b_list in the |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
59 reverse order that the block are allocated. b_list points to the next |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
60 block, not to be confused with b_next, which is next by control flow. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
61 struct basicblock_ *b_list; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
62 /* number of instructions used */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
63 int b_iused; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
64 /* length of instruction array (b_instr) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
65 int b_ialloc; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
66 /* pointer to an array of instructions, initially NULL */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
67 struct instr *b_instr; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
68 /* If b_next is non-NULL, it is a pointer to the next |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
69 block reached by normal control flow. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
70 struct basicblock_ *b_next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
71 /* b_seen is used to perform a DFS of basicblocks. */ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
72 unsigned b_seen : 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
73 /* b_return is true if a RETURN_VALUE opcode is inserted. */ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
74 unsigned b_return : 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
75 /* depth of stack upon entry of block, computed by stackdepth() */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
76 int b_startdepth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
77 /* instruction offset for block, computed by assemble_jump_offsets() */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
78 int b_offset; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
79 } basicblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
80 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
81 /* fblockinfo tracks the current frame block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
82 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
83 A frame block is used to handle loops, try/except, and try/finally. |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
84 It's called a frame block to distinguish it from a basic block in the |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
85 compiler IR. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
86 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
87 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
88 enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
89 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
90 struct fblockinfo { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
91 enum fblocktype fb_type; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
92 basicblock *fb_block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
93 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
94 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
95 /* The following items change on entry and exit of code blocks. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
96 They must be saved and restored when returning to a block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
97 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
98 struct compiler_unit { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
99 PySTEntryObject *u_ste; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
100 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
101 PyObject *u_name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
102 /* The following fields are dicts that map objects to |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
103 the index of them in co_XXX. The index is used as |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
104 the argument for opcodes that refer to those collections. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
105 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
106 PyObject *u_consts; /* all constants */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
107 PyObject *u_names; /* all names */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
108 PyObject *u_varnames; /* local variables */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
109 PyObject *u_cellvars; /* cell variables */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
110 PyObject *u_freevars; /* free variables */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
111 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
112 PyObject *u_private; /* for private name mangling */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
113 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
114 int u_argcount; /* number of arguments for block */ |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
115 int u_kwonlyargcount; /* number of keyword only arguments for block */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
116 /* Pointer to the most recently allocated block. By following b_list |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
117 members, you can reach all early allocated blocks. */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
118 basicblock *u_blocks; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
119 basicblock *u_curblock; /* pointer to current block */ |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
120 int u_tmpname; /* temporary variables for list comps */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
121 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
122 int u_nfblocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
123 struct fblockinfo u_fblock[CO_MAXBLOCKS]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
124 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
125 int u_firstlineno; /* the first lineno of the block */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
126 int u_lineno; /* the lineno for the current stmt */ |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
127 int u_lineno_set; /* boolean to indicate whether instr |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
128 has been generated with current lineno */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
129 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
130 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
131 /* This struct captures the global state of a compilation. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
132 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
133 The u pointer points to the current compilation unit, while units |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
134 for enclosing blocks are stored in c_stack. The u and c_stack are |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
135 managed by compiler_enter_scope() and compiler_exit_scope(). |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
136 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
137 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
138 struct compiler { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
139 const char *c_filename; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
140 struct symtable *c_st; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
141 PyFutureFeatures *c_future; /* pointer to module's __future__ */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
142 PyCompilerFlags *c_flags; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
143 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
144 int c_interactive; /* true if in interactive mode */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
145 int c_nestlevel; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
146 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
147 struct compiler_unit *u; /* compiler state for current block */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
148 PyObject *c_stack; /* Python list holding compiler_unit ptrs */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
149 char *c_encoding; /* source encoding (a borrowed reference) */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
150 PyArena *c_arena; /* pointer to memory allocation arena */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
151 }; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
152 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
153 static int compiler_enter_scope(struct compiler *, identifier, void *, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
154 static void compiler_free(struct compiler *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
155 static basicblock *compiler_new_block(struct compiler *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
156 static int compiler_next_instr(struct compiler *, basicblock *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
157 static int compiler_addop(struct compiler *, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
158 static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
159 static int compiler_addop_i(struct compiler *, int, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
160 static int compiler_addop_j(struct compiler *, int, basicblock *, int); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
161 static basicblock *compiler_use_new_block(struct compiler *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
162 static int compiler_error(struct compiler *, const char *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
163 static int compiler_nameop(struct compiler *, identifier, expr_context_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
164 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
165 static PyCodeObject *compiler_mod(struct compiler *, mod_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
166 static int compiler_visit_stmt(struct compiler *, stmt_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
167 static int compiler_visit_keyword(struct compiler *, keyword_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
168 static int compiler_visit_expr(struct compiler *, expr_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
169 static int compiler_augassign(struct compiler *, stmt_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
170 static int compiler_visit_slice(struct compiler *, slice_ty, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
171 expr_context_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
172 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
173 static int compiler_push_fblock(struct compiler *, enum fblocktype, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
174 basicblock *); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
175 static void compiler_pop_fblock(struct compiler *, enum fblocktype, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
176 basicblock *); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
177 /* Returns true if there is a loop on the fblock stack. */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
178 static int compiler_in_loop(struct compiler *); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
179 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
180 static int inplace_binop(struct compiler *, operator_ty); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
181 static int expr_constant(expr_ty e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
182 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
183 static int compiler_with(struct compiler *, stmt_ty); |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
184 static int compiler_call_helper(struct compiler *c, int n, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
185 asdl_seq *args, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
186 asdl_seq *keywords, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
187 expr_ty starargs, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
188 expr_ty kwargs); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
189 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
190 static PyCodeObject *assemble(struct compiler *, int addNone); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
191 static PyObject *__doc__; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
192 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
193 PyObject * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
194 _Py_Mangle(PyObject *privateobj, PyObject *ident) |
| 33100 | 195 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
196 /* Name mangling: __private becomes _classname__private. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
197 This is independent from how the name is used. */ |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
198 const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
199 Py_UNICODE *buffer; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
200 size_t nlen, plen; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
201 if (privateobj == NULL || !PyUnicode_Check(privateobj) || |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
202 name == NULL || name[0] != '_' || name[1] != '_') { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
203 Py_INCREF(ident); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
204 return ident; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
205 } |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
206 p = PyUnicode_AS_UNICODE(privateobj); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
207 nlen = Py_UNICODE_strlen(name); |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
208 /* Don't mangle __id__ or names with dots. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
209 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
210 The only time a name with a dot can occur is when |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
211 we are compiling an import statement that has a |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
212 package name. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
213 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
214 TODO(jhylton): Decide whether we want to support |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
215 mangling of the module name, e.g. __M.X. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
216 */ |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
217 if ((name[nlen-1] == '_' && name[nlen-2] == '_') |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
218 || Py_UNICODE_strchr(name, '.')) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
219 Py_INCREF(ident); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
220 return ident; /* Don't mangle __whatever__ */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
221 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
222 /* Strip leading underscores from class name */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
223 while (*p == '_') |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
224 p++; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
225 if (*p == 0) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
226 Py_INCREF(ident); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
227 return ident; /* Don't mangle if class is just underscores */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
228 } |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
229 plen = Py_UNICODE_strlen(p); |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
230 |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
231 assert(1 <= PY_SSIZE_T_MAX - nlen); |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
232 assert(1 + nlen <= PY_SSIZE_T_MAX - plen); |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
233 |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
234 ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
235 if (!ident) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
236 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
237 /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
238 buffer = PyUnicode_AS_UNICODE(ident); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
239 buffer[0] = '_'; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
240 Py_UNICODE_strncpy(buffer+1, p, plen); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
241 Py_UNICODE_strcpy(buffer+1+plen, name); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
242 return ident; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
243 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
244 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
245 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
246 compiler_init(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
247 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
248 memset(c, 0, sizeof(struct compiler)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
249 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
250 c->c_stack = PyList_New(0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
251 if (!c->c_stack) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
252 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
253 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
254 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
255 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
256 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
257 PyCodeObject * |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
258 PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
259 PyArena *arena) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
260 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
261 struct compiler c; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
262 PyCodeObject *co = NULL; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
263 PyCompilerFlags local_flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
264 int merged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
265 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
266 if (!__doc__) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
267 __doc__ = PyUnicode_InternFromString("__doc__"); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
268 if (!__doc__) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
269 return NULL; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
270 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
271 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
272 if (!compiler_init(&c)) |
| 36696 | 273 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
274 c.c_filename = filename; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
275 c.c_arena = arena; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
276 c.c_future = PyFuture_FromAST(mod, filename); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
277 if (c.c_future == NULL) |
|
36697
78de5f6b2f67
Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents:
36696
diff
changeset
|
278 goto finally; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
279 if (!flags) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
280 local_flags.cf_flags = 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
281 flags = &local_flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
282 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
283 merged = c.c_future->ff_features | flags->cf_flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
284 c.c_future->ff_features = merged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
285 flags->cf_flags = merged; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
286 c.c_flags = flags; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
287 c.c_nestlevel = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
288 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
289 c.c_st = PySymtable_Build(mod, filename, c.c_future); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
290 if (c.c_st == NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
291 if (!PyErr_Occurred()) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
292 PyErr_SetString(PyExc_SystemError, "no symtable"); |
|
36697
78de5f6b2f67
Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents:
36696
diff
changeset
|
293 goto finally; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
294 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
295 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
296 /* XXX initialize to NULL for now, need to handle */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
297 c.c_encoding = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
298 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
299 co = compiler_mod(&c, mod); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
300 |
|
36697
78de5f6b2f67
Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents:
36696
diff
changeset
|
301 finally: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
302 compiler_free(&c); |
| 36696 | 303 assert(co || PyErr_Occurred()); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
304 return co; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
305 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
306 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
307 PyCodeObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
308 PyNode_Compile(struct _node *n, const char *filename) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
309 { |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
310 PyCodeObject *co = NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
311 mod_ty mod; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
312 PyArena *arena = PyArena_New(); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
313 if (!arena) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
314 return NULL; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
315 mod = PyAST_FromNode(n, NULL, filename, arena); |
|
36065
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
316 if (mod) |
|
ea083efdc96c
Merge from ast-arena. This reduces the code in Python/ast.c by ~300 lines,
Neal Norwitz <nnorwitz@gmail.com>
parents:
35993
diff
changeset
|
317 co = PyAST_Compile(mod, filename, NULL, arena); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
318 PyArena_Free(arena); |
|
30428
c2c10f1eb8e2
Fix leak discovered in test_new by Michael Hudson.
Raymond Hettinger <python@rcn.com>
parents:
30226
diff
changeset
|
319 return co; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23589
diff
changeset
|
320 } |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
23589
diff
changeset
|
321 |
| 69 | 322 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
323 compiler_free(struct compiler *c) |
| 69 | 324 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
325 if (c->c_st) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
326 PySymtable_Free(c->c_st); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
327 if (c->c_future) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
328 PyObject_Free(c->c_future); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
329 Py_DECREF(c->c_stack); |
| 69 | 330 } |
| 331 | |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
332 static PyObject * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
333 list2dict(PyObject *list) |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1369
diff
changeset
|
334 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
335 Py_ssize_t i, n; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
336 PyObject *v, *k; |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
337 PyObject *dict = PyDict_New(); |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
338 if (!dict) return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
339 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
340 n = PyList_Size(list); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
341 for (i = 0; i < n; i++) { |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
342 v = PyLong_FromLong(i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
343 if (!v) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
344 Py_DECREF(dict); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
345 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
346 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
347 k = PyList_GET_ITEM(list, i); |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
348 k = PyTuple_Pack(2, k, k->ob_type); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
349 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
350 Py_XDECREF(k); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
351 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
352 Py_DECREF(dict); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
353 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
354 } |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
355 Py_DECREF(k); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
356 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
357 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
358 return dict; |
|
1399
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1369
diff
changeset
|
359 } |
|
cc172ce05561
Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents:
1369
diff
changeset
|
360 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
361 /* Return new dict containing names from src that match scope(s). |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
362 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
363 src is a symbol table dictionary. If the scope of a name matches |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
364 either scope_type or flag is set, insert it into the new dict. The |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
365 values are integers, starting at offset and increasing by one for |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
366 each key. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
367 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
368 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
369 static PyObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
370 dictbytype(PyObject *src, int scope_type, int flag, int offset) |
|
16006
51811d78a9da
SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents:
15438
diff
changeset
|
371 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
372 Py_ssize_t pos = 0, i = offset, scope; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
373 PyObject *k, *v, *dest = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
374 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
375 assert(offset >= 0); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
376 if (dest == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
377 return NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
378 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
379 while (PyDict_Next(src, &pos, &k, &v)) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
380 /* XXX this should probably be a macro in symtable.h */ |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
381 long vi; |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
382 assert(PyLong_Check(v)); |
|
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
383 vi = PyLong_AS_LONG(v); |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
384 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK; |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
385 |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
386 if (scope == scope_type || vi & flag) { |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
387 PyObject *tuple, *item = PyLong_FromLong(i); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
388 if (item == NULL) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
389 Py_DECREF(dest); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
390 return NULL; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
391 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
392 i++; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
393 tuple = PyTuple_Pack(2, k, k->ob_type); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
394 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
395 Py_DECREF(item); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
396 Py_DECREF(dest); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
397 Py_XDECREF(tuple); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
398 return NULL; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
399 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
400 Py_DECREF(item); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
401 Py_DECREF(tuple); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
402 } |
|
16523
9d625303f914
Reindent a function that was somehow indented by 7 spaces. Also did a
Guido van Rossum <guido@python.org>
parents:
16428
diff
changeset
|
403 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
404 return dest; |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
405 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
406 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
407 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
408 compiler_unit_check(struct compiler_unit *u) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
409 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
410 basicblock *block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
411 for (block = u->u_blocks; block != NULL; block = block->b_list) { |
|
45244
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
412 assert((void *)block != (void *)0xcbcbcbcb); |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
413 assert((void *)block != (void *)0xfbfbfbfb); |
|
2a821e001a2b
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45192
diff
changeset
|
414 assert((void *)block != (void *)0xdbdbdbdb); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
415 if (block->b_instr != NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
416 assert(block->b_ialloc > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
417 assert(block->b_iused > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
418 assert(block->b_ialloc >= block->b_iused); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
419 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
420 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
421 assert (block->b_iused == 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
422 assert (block->b_ialloc == 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
423 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
424 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
425 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
426 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
427 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
428 compiler_unit_free(struct compiler_unit *u) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
429 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
430 basicblock *b, *next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
431 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
432 compiler_unit_check(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
433 b = u->u_blocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
434 while (b != NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
435 if (b->b_instr) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
436 PyObject_Free((void *)b->b_instr); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
437 next = b->b_list; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
438 PyObject_Free((void *)b); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
439 b = next; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
440 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
441 Py_CLEAR(u->u_ste); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
442 Py_CLEAR(u->u_name); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
443 Py_CLEAR(u->u_consts); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
444 Py_CLEAR(u->u_names); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
445 Py_CLEAR(u->u_varnames); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
446 Py_CLEAR(u->u_freevars); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
447 Py_CLEAR(u->u_cellvars); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
448 Py_CLEAR(u->u_private); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
449 PyObject_Free(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
450 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
451 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
452 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
453 compiler_enter_scope(struct compiler *c, identifier name, void *key, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
454 int lineno) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
455 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
456 struct compiler_unit *u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
457 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
458 u = (struct compiler_unit *)PyObject_Malloc(sizeof( |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
459 struct compiler_unit)); |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
460 if (!u) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
461 PyErr_NoMemory(); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
462 return 0; |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
463 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
464 memset(u, 0, sizeof(struct compiler_unit)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
465 u->u_argcount = 0; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
466 u->u_kwonlyargcount = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
467 u->u_ste = PySymtable_Lookup(c->c_st, key); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
468 if (!u->u_ste) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
469 compiler_unit_free(u); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
470 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
471 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
472 Py_INCREF(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
473 u->u_name = name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
474 u->u_varnames = list2dict(u->u_ste->ste_varnames); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
475 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
476 if (!u->u_varnames || !u->u_cellvars) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
477 compiler_unit_free(u); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
478 return 0; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
479 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
480 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
481 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
482 PyDict_Size(u->u_cellvars)); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
483 if (!u->u_freevars) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
484 compiler_unit_free(u); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
485 return 0; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
486 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
487 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
488 u->u_blocks = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
489 u->u_tmpname = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
490 u->u_nfblocks = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
491 u->u_firstlineno = lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
492 u->u_lineno = 0; |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
493 u->u_lineno_set = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
494 u->u_consts = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
495 if (!u->u_consts) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
496 compiler_unit_free(u); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
497 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
498 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
499 u->u_names = PyDict_New(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
500 if (!u->u_names) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
501 compiler_unit_free(u); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
502 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
503 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
504 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
505 u->u_private = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
506 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
507 /* Push the old compiler_unit on the stack. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
508 if (c->u) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
509 PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
510 if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
511 Py_XDECREF(wrapper); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
512 compiler_unit_free(u); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
513 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
514 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
515 Py_DECREF(wrapper); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
516 u->u_private = c->u->u_private; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
517 Py_XINCREF(u->u_private); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
518 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
519 c->u = u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
520 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
521 c->c_nestlevel++; |
|
36173
ade46371f04b
Adjust usage of compiler_use_new_block to its return type.
Martin v. Löwis <martin@v.loewis.de>
parents:
36084
diff
changeset
|
522 if (compiler_use_new_block(c) == NULL) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
523 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
524 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
525 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
526 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
527 |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
528 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
529 compiler_exit_scope(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
530 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
531 int n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
532 PyObject *wrapper; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
533 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
534 c->c_nestlevel--; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
535 compiler_unit_free(c->u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
536 /* Restore c->u to the parent unit. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
537 n = PyList_GET_SIZE(c->c_stack) - 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
538 if (n >= 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
539 wrapper = PyList_GET_ITEM(c->c_stack, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
540 c->u = (struct compiler_unit *)PyCObject_AsVoidPtr(wrapper); |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
541 assert(c->u); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
542 /* we are deleting from a list so this really shouldn't fail */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
543 if (PySequence_DelItem(c->c_stack, n) < 0) |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
544 Py_FatalError("compiler_exit_scope()"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
545 compiler_unit_check(c->u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
546 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
547 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
548 c->u = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
549 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
550 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
551 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
552 /* Allocate a new "anonymous" local variable. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
553 Used by list comprehensions and with statements. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
554 */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
555 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
556 static PyObject * |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
557 compiler_new_tmpname(struct compiler *c) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
558 { |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
559 char tmpname[256]; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
560 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->u->u_tmpname); |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
561 return PyUnicode_FromString(tmpname); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
562 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
563 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
564 /* Allocate a new block and return a pointer to it. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
565 Returns NULL on error. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
566 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
567 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
568 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
569 compiler_new_block(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
570 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
571 basicblock *b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
572 struct compiler_unit *u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
573 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
574 u = c->u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
575 b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
576 if (b == NULL) { |
|
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
577 PyErr_NoMemory(); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
578 return NULL; |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
579 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
580 memset((void *)b, 0, sizeof(basicblock)); |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
581 /* Extend the singly linked list of blocks with new block. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
582 b->b_list = u->u_blocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
583 u->u_blocks = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
584 return b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
585 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
586 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
587 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
588 compiler_use_new_block(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
589 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
590 basicblock *block = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
591 if (block == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
592 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
593 c->u->u_curblock = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
594 return block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
595 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
596 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
597 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
598 compiler_next_block(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
599 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
600 basicblock *block = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
601 if (block == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
602 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
603 c->u->u_curblock->b_next = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
604 c->u->u_curblock = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
605 return block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
606 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
607 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
608 static basicblock * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
609 compiler_use_next_block(struct compiler *c, basicblock *block) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
610 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
611 assert(block != NULL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
612 c->u->u_curblock->b_next = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
613 c->u->u_curblock = block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
614 return block; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
615 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
616 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
617 /* Returns the offset of the next instruction in the current block's |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
618 b_instr array. Resizes the b_instr as necessary. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
619 Returns -1 on failure. |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
620 */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
621 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
622 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
623 compiler_next_instr(struct compiler *c, basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
624 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
625 assert(b != NULL); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
626 if (b->b_instr == NULL) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
627 b->b_instr = (struct instr *)PyObject_Malloc( |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
628 sizeof(struct instr) * DEFAULT_BLOCK_SIZE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
629 if (b->b_instr == NULL) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
630 PyErr_NoMemory(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
631 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
632 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
633 b->b_ialloc = DEFAULT_BLOCK_SIZE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
634 memset((char *)b->b_instr, 0, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
635 sizeof(struct instr) * DEFAULT_BLOCK_SIZE); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
636 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
637 else if (b->b_iused == b->b_ialloc) { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
638 struct instr *tmp; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
639 size_t oldsize, newsize; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
640 oldsize = b->b_ialloc * sizeof(struct instr); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
641 newsize = oldsize << 1; |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
642 |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
643 if (oldsize > (PY_SIZE_MAX >> 1)) { |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
644 PyErr_NoMemory(); |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
645 return -1; |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
646 } |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
647 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
648 if (newsize == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
649 PyErr_NoMemory(); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
650 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
651 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
652 b->b_ialloc <<= 1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
653 tmp = (struct instr *)PyObject_Realloc( |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
654 (void *)b->b_instr, newsize); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
655 if (tmp == NULL) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
656 PyErr_NoMemory(); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
657 return -1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
658 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
659 b->b_instr = tmp; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
660 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
661 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
662 return b->b_iused++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
663 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
664 |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
665 /* Set the i_lineno member of the instruction at offset off if the |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
666 line number for the current expression/statement has not |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
667 already been set. If it has been set, the call has no effect. |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
668 |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
669 The line number is reset in the following cases: |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
670 - when entering a new scope |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
671 - on each statement |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
672 - on each expression that start a new line |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
673 - before the "except" clause |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
674 - before the "for" and "while" expressions |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
675 */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
676 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
677 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
678 compiler_set_lineno(struct compiler *c, int off) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
679 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
680 basicblock *b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
681 if (c->u->u_lineno_set) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
682 return; |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
683 c->u->u_lineno_set = 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
684 b = c->u->u_curblock; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
685 b->b_instr[off].i_lineno = c->u->u_lineno; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
686 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
687 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
688 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
689 opcode_stack_effect(int opcode, int oparg) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
690 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
691 switch (opcode) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
692 case POP_TOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
693 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
694 case ROT_TWO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
695 case ROT_THREE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
696 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
697 case DUP_TOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
698 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
699 case ROT_FOUR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
700 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
701 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
702 case UNARY_POSITIVE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
703 case UNARY_NEGATIVE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
704 case UNARY_NOT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
705 case UNARY_INVERT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
706 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
707 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
708 case SET_ADD: |
|
36824
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
709 case LIST_APPEND: |
|
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
710 return -2; |
|
07f330ad1b47
SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents:
36804
diff
changeset
|
711 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
712 case BINARY_POWER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
713 case BINARY_MULTIPLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
714 case BINARY_MODULO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
715 case BINARY_ADD: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
716 case BINARY_SUBTRACT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
717 case BINARY_SUBSCR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
718 case BINARY_FLOOR_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
719 case BINARY_TRUE_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
720 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
721 case INPLACE_FLOOR_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
722 case INPLACE_TRUE_DIVIDE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
723 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
724 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
725 case INPLACE_ADD: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
726 case INPLACE_SUBTRACT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
727 case INPLACE_MULTIPLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
728 case INPLACE_MODULO: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
729 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
730 case STORE_SUBSCR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
731 return -3; |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
732 case STORE_MAP: |
|
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
733 return -2; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
734 case DELETE_SUBSCR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
735 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
736 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
737 case BINARY_LSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
738 case BINARY_RSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
739 case BINARY_AND: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
740 case BINARY_XOR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
741 case BINARY_OR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
742 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
743 case INPLACE_POWER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
744 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
745 case GET_ITER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
746 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
747 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
748 case PRINT_EXPR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
749 return -1; |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
750 case LOAD_BUILD_CLASS: |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
751 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
752 case INPLACE_LSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
753 case INPLACE_RSHIFT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
754 case INPLACE_AND: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
755 case INPLACE_XOR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
756 case INPLACE_OR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
757 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
758 case BREAK_LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
759 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
760 case WITH_CLEANUP: |
|
36926
fc10ff322df1
Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents:
36824
diff
changeset
|
761 return -1; /* XXX Sometimes more */ |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
762 case STORE_LOCALS: |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
763 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
764 case RETURN_VALUE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
765 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
766 case IMPORT_STAR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
767 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
768 case YIELD_VALUE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
769 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
770 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
771 case POP_BLOCK: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
772 return 0; |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
773 case POP_EXCEPT: |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
774 return 0; /* -3 except if bad bytecode */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
775 case END_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
776 return -1; /* or -2 or -3 if exception occurred */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
777 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
778 case STORE_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
779 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
780 case DELETE_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
781 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
782 case UNPACK_SEQUENCE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
783 return oparg-1; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
784 case UNPACK_EX: |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
785 return (oparg&0xFF) + (oparg>>8); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
786 case FOR_ITER: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
787 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
788 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
789 case STORE_ATTR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
790 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
791 case DELETE_ATTR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
792 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
793 case STORE_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
794 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
795 case DELETE_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
796 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
797 case DUP_TOPX: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
798 return oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
799 case LOAD_CONST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
800 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
801 case LOAD_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
802 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
803 case BUILD_TUPLE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
804 case BUILD_LIST: |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39676
diff
changeset
|
805 case BUILD_SET: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
806 return 1-oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
807 case BUILD_MAP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
808 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
809 case LOAD_ATTR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
810 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
811 case COMPARE_OP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
812 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
813 case IMPORT_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
814 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
815 case IMPORT_FROM: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
816 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
817 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
818 case JUMP_FORWARD: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
819 case JUMP_IF_FALSE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
820 case JUMP_IF_TRUE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
821 case JUMP_ABSOLUTE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
822 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
823 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
824 case LOAD_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
825 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
826 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
827 case CONTINUE_LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
828 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
829 case SETUP_LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
830 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
831 case SETUP_EXCEPT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
832 case SETUP_FINALLY: |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
833 return 6; /* can push 3 values for the new exception |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
834 + 3 others for the previous exception state */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
835 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
836 case LOAD_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
837 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
838 case STORE_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
839 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
840 case DELETE_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
841 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
842 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
843 case RAISE_VARARGS: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
844 return -oparg; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
845 #define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
846 case CALL_FUNCTION: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
847 return -NARGS(oparg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
848 case CALL_FUNCTION_VAR: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
849 case CALL_FUNCTION_KW: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
850 return -NARGS(oparg)-1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
851 case CALL_FUNCTION_VAR_KW: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
852 return -NARGS(oparg)-2; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
853 case MAKE_FUNCTION: |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
854 return -NARGS(oparg) - ((oparg >> 16) & 0xffff); |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
855 case MAKE_CLOSURE: |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
856 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
857 #undef NARGS |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
858 case BUILD_SLICE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
859 if (oparg == 3) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
860 return -2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
861 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
862 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
863 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
864 case LOAD_CLOSURE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
865 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
866 case LOAD_DEREF: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
867 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
868 case STORE_DEREF: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
869 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
870 default: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
871 fprintf(stderr, "opcode = %d\n", opcode); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
872 Py_FatalError("opcode_stack_effect()"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
873 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
874 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
875 return 0; /* not reachable */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
876 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
877 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
878 /* Add an opcode with no argument. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
879 Returns 0 on failure, 1 on success. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
880 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
881 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
882 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
883 compiler_addop(struct compiler *c, int opcode) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
884 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
885 basicblock *b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
886 struct instr *i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
887 int off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
888 off = compiler_next_instr(c, c->u->u_curblock); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
889 if (off < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
890 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
891 b = c->u->u_curblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
892 i = &b->b_instr[off]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
893 i->i_opcode = opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
894 i->i_hasarg = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
895 if (opcode == RETURN_VALUE) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
896 b->b_return = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
897 compiler_set_lineno(c, off); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
898 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
899 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
900 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
901 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
902 compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
903 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
904 PyObject *t, *v; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
905 Py_ssize_t arg; |
|
45082
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
906 unsigned char *p, *q; |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
907 Py_complex z; |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
908 double d; |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
909 int real_part_zero, imag_part_zero; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
910 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
911 /* necessary to make sure types aren't coerced (e.g., int and long) */ |
|
42775
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
912 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */ |
|
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
913 if (PyFloat_Check(o)) { |
|
45082
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
914 d = PyFloat_AS_DOUBLE(o); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
915 p = (unsigned char*) &d; |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
916 /* all we need is to make the tuple different in either the 0.0 |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
917 * or -0.0 case from all others, just to avoid the "coercion". |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
918 */ |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
919 if (*p==0 && p[sizeof(double)-1]==0) |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
920 t = PyTuple_Pack(3, o, o->ob_type, Py_None); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
921 else |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
922 t = PyTuple_Pack(2, o, o->ob_type); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
923 } |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
924 else if (PyComplex_Check(o)) { |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
925 /* complex case is even messier: we need to make complex(x, |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
926 0.) different from complex(x, -0.) and complex(0., y) |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
927 different from complex(-0., y), for any x and y. In |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
928 particular, all four complex zeros should be |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
929 distinguished.*/ |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
930 z = PyComplex_AsCComplex(o); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
931 p = (unsigned char*) &(z.real); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
932 q = (unsigned char*) &(z.imag); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
933 /* all that matters here is that on IEEE platforms |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
934 real_part_zero will be true if z.real == 0., and false if |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
935 z.real == -0. In fact, real_part_zero will also be true |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
936 for some other rarely occurring nonzero floats, but this |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
937 doesn't matter. Similar comments apply to |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
938 imag_part_zero. */ |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
939 real_part_zero = *p==0 && p[sizeof(double)-1]==0; |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
940 imag_part_zero = *q==0 && q[sizeof(double)-1]==0; |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
941 if (real_part_zero && imag_part_zero) { |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
942 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_True); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
943 } |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
944 else if (real_part_zero && !imag_part_zero) { |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
945 t = PyTuple_Pack(4, o, o->ob_type, Py_True, Py_False); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
946 } |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
947 else if (!real_part_zero && imag_part_zero) { |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
948 t = PyTuple_Pack(4, o, o->ob_type, Py_False, Py_True); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
949 } |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
950 else { |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
951 t = PyTuple_Pack(2, o, o->ob_type); |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
952 } |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
953 } |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
954 else { |
|
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
955 t = PyTuple_Pack(2, o, o->ob_type); |
|
42775
d7517c306791
Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42193
diff
changeset
|
956 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
957 if (t == NULL) |
|
45082
d7540031b959
Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45029
diff
changeset
|
958 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
959 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
960 v = PyDict_GetItem(dict, t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
961 if (!v) { |
|
39637
472ca7006f70
Check for exceptions set by PyDict_GetItem().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
39610
diff
changeset
|
962 if (PyErr_Occurred()) |
|
472ca7006f70
Check for exceptions set by PyDict_GetItem().
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
39610
diff
changeset
|
963 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
964 arg = PyDict_Size(dict); |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
965 v = PyLong_FromLong(arg); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
966 if (!v) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
967 Py_DECREF(t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
968 return -1; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
969 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
970 if (PyDict_SetItem(dict, t, v) < 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
971 Py_DECREF(t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
972 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
973 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
974 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
975 Py_DECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
976 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
977 else |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
978 arg = PyLong_AsLong(v); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
979 Py_DECREF(t); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
980 return arg; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
981 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
982 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
983 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
984 compiler_addop_o(struct compiler *c, int opcode, PyObject *dict, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
985 PyObject *o) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
986 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
987 int arg = compiler_add_o(c, dict, o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
988 if (arg < 0) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
989 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
990 return compiler_addop_i(c, opcode, arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
991 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
992 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
993 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
994 compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
995 PyObject *o) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
996 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
997 int arg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
998 PyObject *mangled = _Py_Mangle(c->u->u_private, o); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
999 if (!mangled) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1000 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1001 arg = compiler_add_o(c, dict, mangled); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1002 Py_DECREF(mangled); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1003 if (arg < 0) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1004 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1005 return compiler_addop_i(c, opcode, arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1006 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1007 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1008 /* Add an opcode with an integer argument. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1009 Returns 0 on failure, 1 on success. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1010 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1011 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1012 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1013 compiler_addop_i(struct compiler *c, int opcode, int oparg) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1014 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1015 struct instr *i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1016 int off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1017 off = compiler_next_instr(c, c->u->u_curblock); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1018 if (off < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1019 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1020 i = &c->u->u_curblock->b_instr[off]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1021 i->i_opcode = opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1022 i->i_oparg = oparg; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1023 i->i_hasarg = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1024 compiler_set_lineno(c, off); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1025 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1026 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1027 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1028 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1029 compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1030 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1031 struct instr *i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1032 int off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1033 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1034 assert(b != NULL); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1035 off = compiler_next_instr(c, c->u->u_curblock); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1036 if (off < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1037 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1038 i = &c->u->u_curblock->b_instr[off]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1039 i->i_opcode = opcode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1040 i->i_target = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1041 i->i_hasarg = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1042 if (absolute) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1043 i->i_jabs = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1044 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1045 i->i_jrel = 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1046 compiler_set_lineno(c, off); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1047 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1048 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1049 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1050 /* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1051 like to find better names.) NEW_BLOCK() creates a new block and sets |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1052 it as the current block. NEXT_BLOCK() also creates an implicit jump |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1053 from the current block to the new block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1054 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1055 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1056 /* The returns inside these macros make it impossible to decref objects |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1057 created in the local function. Local objects should use the arena. |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1058 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1059 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1060 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1061 #define NEW_BLOCK(C) { \ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1062 if (compiler_use_new_block((C)) == NULL) \ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1063 return 0; \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1064 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1065 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1066 #define NEXT_BLOCK(C) { \ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1067 if (compiler_next_block((C)) == NULL) \ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1068 return 0; \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1069 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1070 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1071 #define ADDOP(C, OP) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1072 if (!compiler_addop((C), (OP))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1073 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1074 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1075 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1076 #define ADDOP_IN_SCOPE(C, OP) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1077 if (!compiler_addop((C), (OP))) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1078 compiler_exit_scope(c); \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1079 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1080 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1081 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1082 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1083 #define ADDOP_O(C, OP, O, TYPE) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1084 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1085 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1086 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1087 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1088 #define ADDOP_NAME(C, OP, O, TYPE) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1089 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1090 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1091 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1092 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1093 #define ADDOP_I(C, OP, O) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1094 if (!compiler_addop_i((C), (OP), (O))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1095 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1096 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1097 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1098 #define ADDOP_JABS(C, OP, O) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1099 if (!compiler_addop_j((C), (OP), (O), 1)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1100 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1101 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1102 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1103 #define ADDOP_JREL(C, OP, O) { \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1104 if (!compiler_addop_j((C), (OP), (O), 0)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1105 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1106 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1107 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1108 /* VISIT and VISIT_SEQ takes an ASDL type as their second argument. They use |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1109 the ASDL name to synthesize the name of the C type and the visit function. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1110 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1111 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1112 #define VISIT(C, TYPE, V) {\ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1113 if (!compiler_visit_ ## TYPE((C), (V))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1114 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1115 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1116 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1117 #define VISIT_IN_SCOPE(C, TYPE, V) {\ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1118 if (!compiler_visit_ ## TYPE((C), (V))) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1119 compiler_exit_scope(c); \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1120 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1121 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1122 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1123 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1124 #define VISIT_SLICE(C, V, CTX) {\ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1125 if (!compiler_visit_slice((C), (V), (CTX))) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1126 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1127 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1128 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1129 #define VISIT_SEQ(C, TYPE, SEQ) { \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1130 int _i; \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1131 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1132 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1133 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1134 if (!compiler_visit_ ## TYPE((C), elt)) \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1135 return 0; \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1136 } \ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1137 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1138 |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1139 #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1140 int _i; \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1141 asdl_seq *seq = (SEQ); /* avoid variable capture */ \ |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
1142 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1143 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1144 if (!compiler_visit_ ## TYPE((C), elt)) { \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1145 compiler_exit_scope(c); \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1146 return 0; \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1147 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1148 } \ |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1149 } |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1150 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1151 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1152 compiler_isdocstring(stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1153 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1154 if (s->kind != Expr_kind) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1155 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1156 return s->v.Expr.value->kind == Str_kind; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1157 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1158 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1159 /* Compile a sequence of statements, checking for a docstring. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1160 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1161 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1162 compiler_body(struct compiler *c, asdl_seq *stmts) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1163 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1164 int i = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1165 stmt_ty st; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1166 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1167 if (!asdl_seq_LEN(stmts)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1168 return 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1169 st = (stmt_ty)asdl_seq_GET(stmts, 0); |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1170 if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) { |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1171 /* don't generate docstrings if -OO */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1172 i = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1173 VISIT(c, expr, st->v.Expr.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1174 if (!compiler_nameop(c, __doc__, Store)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1175 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1176 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1177 for (; i < asdl_seq_LEN(stmts); i++) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1178 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1179 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1180 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1181 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1182 static PyCodeObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1183 compiler_mod(struct compiler *c, mod_ty mod) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1184 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1185 PyCodeObject *co; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1186 int addNone = 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1187 static PyObject *module; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1188 if (!module) { |
|
45029
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1189 module = PyUnicode_InternFromString("<module>"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1190 if (!module) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1191 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1192 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
1193 /* Use 0 for firstlineno initially, will fixup in assemble(). */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
1194 if (!compiler_enter_scope(c, module, mod, 0)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1195 return NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1196 switch (mod->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1197 case Module_kind: |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1198 if (!compiler_body(c, mod->v.Module.body)) { |
|
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1199 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1200 return 0; |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1201 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1202 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1203 case Interactive_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1204 c->c_interactive = 1; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1205 VISIT_SEQ_IN_SCOPE(c, stmt, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1206 mod->v.Interactive.body); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1207 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1208 case Expression_kind: |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1209 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1210 addNone = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1211 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1212 case Suite_kind: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1213 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1214 "suite should not be possible"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1215 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1216 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1217 PyErr_Format(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1218 "module kind %d should not be possible", |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1219 mod->kind); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1220 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1221 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1222 co = assemble(c, addNone); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1223 compiler_exit_scope(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1224 return co; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1225 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1226 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1227 /* The test for LOCAL must come before the test for FREE in order to |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1228 handle classes where name is both local and free. The local var is |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1229 a method and the free var is a free var referenced within a method. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1230 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1231 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1232 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1233 get_ref_type(struct compiler *c, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1234 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1235 int scope = PyST_GetScope(c->u->u_ste, name); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1236 if (scope == 0) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1237 char buf[350]; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1238 PyOS_snprintf(buf, sizeof(buf), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1239 "unknown scope for %.100s in %.100s(%s) in %s\n" |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1240 "symbols: %s\nlocals: %s\nglobals: %s\n", |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
1241 PyBytes_AS_STRING(name), |
|
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
1242 PyBytes_AS_STRING(c->u->u_name), |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1243 PyObject_REPR(c->u->u_ste->ste_id), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1244 c->c_filename, |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1245 PyObject_REPR(c->u->u_ste->ste_symbols), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1246 PyObject_REPR(c->u->u_varnames), |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1247 PyObject_REPR(c->u->u_names) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1248 ); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1249 Py_FatalError(buf); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1250 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1251 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1252 return scope; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1253 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1254 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1255 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1256 compiler_lookup_arg(PyObject *dict, PyObject *name) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1257 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1258 PyObject *k, *v; |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
1259 k = PyTuple_Pack(2, name, name->ob_type); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1260 if (k == NULL) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1261 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1262 v = PyDict_GetItem(dict, k); |
|
35939
79374eb6db51
Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents:
35895
diff
changeset
|
1263 Py_DECREF(k); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1264 if (v == NULL) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1265 return -1; |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
1266 return PyLong_AS_LONG(v); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1267 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1268 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1269 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1270 compiler_make_closure(struct compiler *c, PyCodeObject *co, int args) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1271 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1272 int i, free = PyCode_GetNumFree(co); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1273 if (free == 0) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1274 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1275 ADDOP_I(c, MAKE_FUNCTION, args); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1276 return 1; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1277 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1278 for (i = 0; i < free; ++i) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1279 /* Bypass com_addop_varname because it will generate |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1280 LOAD_DEREF but LOAD_CLOSURE is needed. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1281 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1282 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1283 int arg, reftype; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1284 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1285 /* Special case: If a class contains a method with a |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1286 free variable that has the same name as a method, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1287 the name will be considered free *and* local in the |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1288 class. It should be handled by the closure, as |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1289 well as by the normal name loookup logic. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1290 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1291 reftype = get_ref_type(c, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1292 if (reftype == CELL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1293 arg = compiler_lookup_arg(c->u->u_cellvars, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1294 else /* (reftype == FREE) */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1295 arg = compiler_lookup_arg(c->u->u_freevars, name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1296 if (arg == -1) { |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1297 fprintf(stderr, |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1298 "lookup %s in %s %d %d\n" |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1299 "freevars of %s: %s\n", |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1300 PyObject_REPR(name), |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
1301 PyBytes_AS_STRING(c->u->u_name), |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1302 reftype, arg, |
|
48660
85b67fb5672b
Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents:
48330
diff
changeset
|
1303 _PyUnicode_AsString(co->co_name), |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1304 PyObject_REPR(co->co_freevars)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1305 Py_FatalError("compiler_make_closure()"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1306 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1307 ADDOP_I(c, LOAD_CLOSURE, arg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1308 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1309 ADDOP_I(c, BUILD_TUPLE, free); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1310 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1311 ADDOP_I(c, MAKE_CLOSURE, args); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1312 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1313 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1314 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1315 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1316 compiler_decorators(struct compiler *c, asdl_seq* decos) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1317 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1318 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1319 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1320 if (!decos) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1321 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1322 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1323 for (i = 0; i < asdl_seq_LEN(decos); i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1324 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1325 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1326 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1327 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1328 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1329 static int |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1330 compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1331 asdl_seq *kw_defaults) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1332 { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1333 int i, default_count = 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1334 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) { |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1335 arg_ty arg = asdl_seq_GET(kwonlyargs, i); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1336 expr_ty default_ = asdl_seq_GET(kw_defaults, i); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1337 if (default_) { |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
1338 ADDOP_O(c, LOAD_CONST, arg->arg, consts); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1339 if (!compiler_visit_expr(c, default_)) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1340 return -1; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1341 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1342 default_count++; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1343 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1344 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1345 return default_count; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1346 } |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1347 |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1348 static int |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1349 compiler_visit_argannotation(struct compiler *c, identifier id, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1350 expr_ty annotation, PyObject *names) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1351 { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1352 if (annotation) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1353 VISIT(c, expr, annotation); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1354 if (PyList_Append(names, id)) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1355 return -1; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1356 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1357 return 0; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1358 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1359 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1360 static int |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1361 compiler_visit_argannotations(struct compiler *c, asdl_seq* args, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1362 PyObject *names) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1363 { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1364 int i, error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1365 for (i = 0; i < asdl_seq_LEN(args); i++) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1366 arg_ty arg = (arg_ty)asdl_seq_GET(args, i); |
|
41717
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
1367 error = compiler_visit_argannotation( |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
1368 c, |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
1369 arg->arg, |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
1370 arg->annotation, |
|
9ad84070b22d
Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41699
diff
changeset
|
1371 names); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1372 if (error) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1373 return error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1374 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1375 return 0; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1376 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1377 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1378 static int |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1379 compiler_visit_annotations(struct compiler *c, arguments_ty args, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1380 expr_ty returns) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1381 { |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1382 /* Push arg annotations and a list of the argument names. Return the # |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1383 of items pushed. The expressions are evaluated out-of-order wrt the |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1384 source code. |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1385 |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1386 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error. |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1387 */ |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1388 static identifier return_str; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1389 PyObject *names; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1390 int len; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1391 names = PyList_New(0); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1392 if (!names) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1393 return -1; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1394 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1395 if (compiler_visit_argannotations(c, args->args, names)) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1396 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1397 if (args->varargannotation && |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1398 compiler_visit_argannotation(c, args->vararg, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1399 args->varargannotation, names)) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1400 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1401 if (compiler_visit_argannotations(c, args->kwonlyargs, names)) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1402 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1403 if (args->kwargannotation && |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1404 compiler_visit_argannotation(c, args->kwarg, |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1405 args->kwargannotation, names)) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1406 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1407 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1408 if (!return_str) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
1409 return_str = PyUnicode_InternFromString("return"); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1410 if (!return_str) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1411 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1412 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1413 if (compiler_visit_argannotation(c, return_str, returns, names)) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1414 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1415 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1416 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1417 len = PyList_GET_SIZE(names); |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1418 if (len > 65534) { |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1419 /* len must fit in 16 bits, and len is incremented below */ |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1420 PyErr_SetString(PyExc_SyntaxError, |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1421 "too many annotations"); |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1422 goto error; |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1423 } |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1424 if (len) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1425 /* convert names to a tuple and place on stack */ |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1426 PyObject *elt; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1427 int i; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1428 PyObject *s = PyTuple_New(len); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1429 if (!s) |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1430 goto error; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1431 for (i = 0; i < len; i++) { |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1432 elt = PyList_GET_ITEM(names, i); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1433 Py_INCREF(elt); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1434 PyTuple_SET_ITEM(s, i, elt); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1435 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1436 ADDOP_O(c, LOAD_CONST, s, consts); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1437 Py_DECREF(s); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1438 len++; /* include the just-pushed tuple */ |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1439 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1440 Py_DECREF(names); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1441 return len; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1442 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1443 error: |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1444 Py_DECREF(names); |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1445 return -1; |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1446 } |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1447 |
|
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1448 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1449 compiler_function(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1450 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1451 PyCodeObject *co; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1452 PyObject *first_const = Py_None; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1453 arguments_ty args = s->v.FunctionDef.args; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1454 expr_ty returns = s->v.FunctionDef.returns; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1455 asdl_seq* decos = s->v.FunctionDef.decorator_list; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1456 stmt_ty st; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1457 int i, n, docstring, kw_default_count = 0, arglength; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1458 int num_annotations; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1459 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1460 assert(s->kind == FunctionDef_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1461 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1462 if (!compiler_decorators(c, decos)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1463 return 0; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1464 if (args->kwonlyargs) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1465 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1466 args->kw_defaults); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1467 if (res < 0) |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1468 return 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1469 kw_default_count = res; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1470 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1471 if (args->defaults) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1472 VISIT_SEQ(c, expr, args->defaults); |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1473 num_annotations = compiler_visit_annotations(c, args, returns); |
|
40943
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1474 if (num_annotations < 0) |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1475 return 0; |
|
c79e6234fb19
Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents:
40941
diff
changeset
|
1476 assert((num_annotations & 0xFFFF) == num_annotations); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1477 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1478 if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1479 s->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1480 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1481 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1482 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1483 docstring = compiler_isdocstring(st); |
|
43410
b06b191b7cfa
Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
43102
diff
changeset
|
1484 if (docstring && Py_OptimizeFlag < 2) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1485 first_const = st->v.Expr.value->v.Str.s; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1486 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) { |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1487 compiler_exit_scope(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1488 return 0; |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1489 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1490 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1491 c->u->u_argcount = asdl_seq_LEN(args->args); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1492 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1493 n = asdl_seq_LEN(s->v.FunctionDef.body); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1494 /* if there was a docstring, we need to skip the first statement */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1495 for (i = docstring; i < n; i++) { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
1496 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
1497 VISIT_IN_SCOPE(c, stmt, st); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1498 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1499 co = assemble(c, 1); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1500 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1501 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1502 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1503 |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1504 arglength = asdl_seq_LEN(args->defaults); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1505 arglength |= kw_default_count << 8; |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1506 arglength |= num_annotations << 16; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1507 compiler_make_closure(c, co, arglength); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1508 Py_DECREF(co); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1509 |
|
40529
54cd47788811
PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents:
40450
diff
changeset
|
1510 /* decorators */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1511 for (i = 0; i < asdl_seq_LEN(decos); i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1512 ADDOP_I(c, CALL_FUNCTION, 1); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1513 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1514 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1515 return compiler_nameop(c, s->v.FunctionDef.name, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1516 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1517 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1518 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1519 compiler_class(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1520 { |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1521 static PyObject *locals = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1522 PyCodeObject *co; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1523 PyObject *str; |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1524 PySTEntryObject *ste; |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1525 int err, i; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1526 asdl_seq* decos = s->v.ClassDef.decorator_list; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1527 |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1528 if (!compiler_decorators(c, decos)) |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1529 return 0; |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1530 |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1531 /* initialize statics */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1532 if (locals == NULL) { |
|
45029
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
1533 locals = PyUnicode_InternFromString("__locals__"); |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1534 if (locals == NULL) |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1535 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1536 } |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1537 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1538 /* ultimately generate code for: |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1539 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>) |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1540 where: |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1541 <func> is a function/closure created from the class body; |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1542 it has a single argument (__locals__) where the dict |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1543 (or MutableSequence) representing the locals is passed |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1544 <name> is the class name |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1545 <bases> is the positional arguments and *varargs argument |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1546 <keywords> is the keyword arguments and **kwds argument |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1547 This borrows from compiler_call. |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1548 */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1549 |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1550 /* 0. Create a fake argument named __locals__ */ |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1551 ste = PySymtable_Lookup(c->c_st, s); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1552 if (ste == NULL) |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1553 return 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1554 assert(PyList_Check(ste->ste_varnames)); |
|
41273
d428e21d6eaf
Fix refleak in compiler.
Guido van Rossum <guido@python.org>
parents:
41226
diff
changeset
|
1555 err = PyList_Append(ste->ste_varnames, locals); |
|
d428e21d6eaf
Fix refleak in compiler.
Guido van Rossum <guido@python.org>
parents:
41226
diff
changeset
|
1556 Py_DECREF(ste); |
|
d428e21d6eaf
Fix refleak in compiler.
Guido van Rossum <guido@python.org>
parents:
41226
diff
changeset
|
1557 if (err < 0) |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1558 return 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1559 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1560 /* 1. compile the class body into a code object */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1561 if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1562 return 0; |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1563 /* this block represents what we do in the new scope */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1564 { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1565 /* use the class name for name mangling */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1566 Py_INCREF(s->v.ClassDef.name); |
|
46240
5a17d157df00
Fix refleak with nested classes. Fix originally by Amaury in r62015.
Neal Norwitz <nnorwitz@gmail.com>
parents:
46231
diff
changeset
|
1567 Py_XDECREF(c->u->u_private); |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1568 c->u->u_private = s->v.ClassDef.name; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1569 /* force it to have one mandatory argument */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1570 c->u->u_argcount = 1; |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1571 /* load the first argument (__locals__) ... */ |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1572 ADDOP_I(c, LOAD_FAST, 0); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1573 /* ... and store it into f_locals */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1574 ADDOP_IN_SCOPE(c, STORE_LOCALS); |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1575 /* load (global) __name__ ... */ |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
1576 str = PyUnicode_InternFromString("__name__"); |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1577 if (!str || !compiler_nameop(c, str, Load)) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1578 Py_XDECREF(str); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1579 compiler_exit_scope(c); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1580 return 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1581 } |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1582 Py_DECREF(str); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1583 /* ... and store it as __module__ */ |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
1584 str = PyUnicode_InternFromString("__module__"); |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1585 if (!str || !compiler_nameop(c, str, Store)) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1586 Py_XDECREF(str); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1587 compiler_exit_scope(c); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1588 return 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1589 } |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1590 Py_DECREF(str); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1591 /* compile the body proper */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1592 if (!compiler_body(c, s->v.ClassDef.body)) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1593 compiler_exit_scope(c); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1594 return 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1595 } |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1596 /* return the (empty) __class__ cell */ |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1597 str = PyUnicode_InternFromString("__class__"); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1598 if (str == NULL) { |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1599 compiler_exit_scope(c); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1600 return 0; |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1601 } |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1602 i = compiler_lookup_arg(c->u->u_cellvars, str); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1603 Py_DECREF(str); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1604 if (i == -1) { |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1605 /* This happens when nobody references the cell */ |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1606 PyErr_Clear(); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1607 /* Return None */ |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1608 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1609 } |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1610 else { |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1611 /* Return the cell where to store __class__ */ |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1612 ADDOP_I(c, LOAD_CLOSURE, i); |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
1613 } |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1614 ADDOP_IN_SCOPE(c, RETURN_VALUE); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1615 /* create the code object */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1616 co = assemble(c, 1); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1617 } |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1618 /* leave the new scope */ |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1619 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1620 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1621 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1622 |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1623 /* 2. load the 'build_class' function */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1624 ADDOP(c, LOAD_BUILD_CLASS); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1625 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1626 /* 3. load a function (or closure) made from the code object */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1627 compiler_make_closure(c, co, 0); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1628 Py_DECREF(co); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1629 |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1630 /* 4. load class name */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1631 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1632 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1633 /* 5. generate the rest of the code for the call */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1634 if (!compiler_call_helper(c, 2, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1635 s->v.ClassDef.bases, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1636 s->v.ClassDef.keywords, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1637 s->v.ClassDef.starargs, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1638 s->v.ClassDef.kwargs)) |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1639 return 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
1640 |
|
41824
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1641 /* 6. apply decorators */ |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1642 for (i = 0; i < asdl_seq_LEN(decos); i++) { |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1643 ADDOP_I(c, CALL_FUNCTION, 1); |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1644 } |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1645 |
|
24b60622b944
Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41717
diff
changeset
|
1646 /* 7. store into <name> */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1647 if (!compiler_nameop(c, s->v.ClassDef.name, Store)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1648 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1649 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1650 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1651 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1652 static int |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1653 compiler_ifexp(struct compiler *c, expr_ty e) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1654 { |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1655 basicblock *end, *next; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1656 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1657 assert(e->kind == IfExp_kind); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1658 end = compiler_new_block(c); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1659 if (end == NULL) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1660 return 0; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1661 next = compiler_new_block(c); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1662 if (next == NULL) |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1663 return 0; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1664 VISIT(c, expr, e->v.IfExp.test); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1665 ADDOP_JREL(c, JUMP_IF_FALSE, next); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1666 ADDOP(c, POP_TOP); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1667 VISIT(c, expr, e->v.IfExp.body); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1668 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1669 compiler_use_next_block(c, next); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1670 ADDOP(c, POP_TOP); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1671 VISIT(c, expr, e->v.IfExp.orelse); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1672 compiler_use_next_block(c, end); |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1673 return 1; |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1674 } |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1675 |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
1676 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1677 compiler_lambda(struct compiler *c, expr_ty e) |
| 69 | 1678 { |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
1679 PyCodeObject *co; |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
1680 static identifier name; |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1681 int kw_default_count = 0, arglength; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1682 arguments_ty args = e->v.Lambda.args; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1683 assert(e->kind == Lambda_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1684 |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
1685 if (!name) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
1686 name = PyUnicode_InternFromString("<lambda>"); |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
1687 if (!name) |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
1688 return 0; |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
1689 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1690 |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1691 if (args->kwonlyargs) { |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1692 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1693 args->kw_defaults); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1694 if (res < 0) return 0; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1695 kw_default_count = res; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1696 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1697 if (args->defaults) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1698 VISIT_SEQ(c, expr, args->defaults); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1699 if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1700 return 0; |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1701 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1702 c->u->u_argcount = asdl_seq_LEN(args->args); |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1703 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); |
|
35863
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1704 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); |
|
79f2ce320192
Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35860
diff
changeset
|
1705 ADDOP_IN_SCOPE(c, RETURN_VALUE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1706 co = assemble(c, 1); |
|
35797
3778083fe2c8
Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35790
diff
changeset
|
1707 compiler_exit_scope(c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1708 if (co == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1709 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1710 |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1711 arglength = asdl_seq_LEN(args->defaults); |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1712 arglength |= kw_default_count << 8; |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
1713 compiler_make_closure(c, co, arglength); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
1714 Py_DECREF(co); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1715 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1716 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1717 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1718 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1719 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1720 compiler_if(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1721 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1722 basicblock *end, *next; |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1723 int constant; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1724 assert(s->kind == If_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1725 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1726 if (end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1727 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1728 next = compiler_new_block(c); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1729 if (next == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1730 return 0; |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1731 |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1732 constant = expr_constant(s->v.If.test); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1733 /* constant = 0: "if 0" |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1734 * constant = 1: "if 1", "if 2", ... |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1735 * constant = -1: rest */ |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1736 if (constant == 0) { |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1737 if (s->v.If.orelse) |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1738 VISIT_SEQ(c, stmt, s->v.If.orelse); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1739 } else if (constant == 1) { |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1740 VISIT_SEQ(c, stmt, s->v.If.body); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1741 } else { |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1742 VISIT(c, expr, s->v.If.test); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1743 ADDOP_JREL(c, JUMP_IF_FALSE, next); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1744 ADDOP(c, POP_TOP); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1745 VISIT_SEQ(c, stmt, s->v.If.body); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1746 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1747 compiler_use_next_block(c, next); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1748 ADDOP(c, POP_TOP); |
|
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1749 if (s->v.If.orelse) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
1750 VISIT_SEQ(c, stmt, s->v.If.orelse); |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
1751 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1752 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1753 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1754 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1755 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1756 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1757 compiler_for(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1758 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1759 basicblock *start, *cleanup, *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1760 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1761 start = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1762 cleanup = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1763 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1764 if (start == NULL || end == NULL || cleanup == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1765 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1766 ADDOP_JREL(c, SETUP_LOOP, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1767 if (!compiler_push_fblock(c, LOOP, start)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1768 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1769 VISIT(c, expr, s->v.For.iter); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1770 ADDOP(c, GET_ITER); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1771 compiler_use_next_block(c, start); |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
1772 /* for expressions must be traced on each iteration, |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
1773 so we need to set an extra line number. */ |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
1774 c->u->u_lineno_set = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1775 ADDOP_JREL(c, FOR_ITER, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1776 VISIT(c, expr, s->v.For.target); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1777 VISIT_SEQ(c, stmt, s->v.For.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1778 ADDOP_JABS(c, JUMP_ABSOLUTE, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1779 compiler_use_next_block(c, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1780 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1781 compiler_pop_fblock(c, LOOP, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1782 VISIT_SEQ(c, stmt, s->v.For.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1783 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1784 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1785 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1786 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1787 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1788 compiler_while(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1789 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1790 basicblock *loop, *orelse, *end, *anchor = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1791 int constant = expr_constant(s->v.While.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1792 |
|
44943
6547be11f443
Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44373
diff
changeset
|
1793 if (constant == 0) { |
|
6547be11f443
Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44373
diff
changeset
|
1794 if (s->v.While.orelse) |
|
6547be11f443
Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44373
diff
changeset
|
1795 VISIT_SEQ(c, stmt, s->v.While.orelse); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1796 return 1; |
|
44943
6547be11f443
Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44373
diff
changeset
|
1797 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1798 loop = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1799 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1800 if (constant == -1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1801 anchor = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1802 if (anchor == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1803 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1804 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1805 if (loop == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1806 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1807 if (s->v.While.orelse) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1808 orelse = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1809 if (orelse == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1810 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1811 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1812 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1813 orelse = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1814 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1815 ADDOP_JREL(c, SETUP_LOOP, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1816 compiler_use_next_block(c, loop); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1817 if (!compiler_push_fblock(c, LOOP, loop)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1818 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1819 if (constant == -1) { |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
1820 /* while expressions must be traced on each iteration, |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
1821 so we need to set an extra line number. */ |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
1822 c->u->u_lineno_set = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1823 VISIT(c, expr, s->v.While.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1824 ADDOP_JREL(c, JUMP_IF_FALSE, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1825 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1826 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1827 VISIT_SEQ(c, stmt, s->v.While.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1828 ADDOP_JABS(c, JUMP_ABSOLUTE, loop); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1829 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1830 /* XXX should the two POP instructions be in a separate block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1831 if there is no else clause ? |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1832 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1833 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1834 if (constant == -1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1835 compiler_use_next_block(c, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1836 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1837 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1838 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1839 compiler_pop_fblock(c, LOOP, loop); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1840 if (orelse != NULL) /* what if orelse is just pass? */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1841 VISIT_SEQ(c, stmt, s->v.While.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1842 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1843 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1844 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1845 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1846 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1847 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1848 compiler_continue(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1849 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1850 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop"; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1851 static const char IN_FINALLY_ERROR_MSG[] = |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1852 "'continue' not supported inside 'finally' clause"; |
| 69 | 1853 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1854 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1855 if (!c->u->u_nfblocks) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1856 return compiler_error(c, LOOP_ERROR_MSG); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1857 i = c->u->u_nfblocks - 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1858 switch (c->u->u_fblock[i].fb_type) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1859 case LOOP: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1860 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1861 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1862 case EXCEPT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1863 case FINALLY_TRY: |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1864 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1865 /* Prevent continue anywhere under a finally |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1866 even if hidden in a sub-try or except. */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1867 if (c->u->u_fblock[i].fb_type == FINALLY_END) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1868 return compiler_error(c, IN_FINALLY_ERROR_MSG); |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1869 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1870 if (i == -1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1871 return compiler_error(c, LOOP_ERROR_MSG); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1872 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1873 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1874 case FINALLY_END: |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
1875 return compiler_error(c, IN_FINALLY_ERROR_MSG); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1876 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1877 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1878 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1879 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1880 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1881 /* Code generated for "try: <body> finally: <finalbody>" is as follows: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1882 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1883 SETUP_FINALLY L |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1884 <code for body> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1885 POP_BLOCK |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1886 LOAD_CONST <None> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1887 L: <code for finalbody> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1888 END_FINALLY |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1889 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1890 The special instructions use the block stack. Each block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1891 stack entry contains the instruction that created it (here |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1892 SETUP_FINALLY), the level of the value stack at the time the |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1893 block stack entry was created, and a label (here L). |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1894 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1895 SETUP_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1896 Pushes the current value stack level and the label |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1897 onto the block stack. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1898 POP_BLOCK: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1899 Pops en entry from the block stack, and pops the value |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1900 stack until its level is the same as indicated on the |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1901 block stack. (The label is ignored.) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1902 END_FINALLY: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1903 Pops a variable number of entries from the *value* stack |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1904 and re-raises the exception they specify. The number of |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1905 entries popped depends on the (pseudo) exception type. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1906 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1907 The block stack is unwound when an exception is raised: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1908 when a SETUP_FINALLY entry is found, the exception is pushed |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1909 onto the value stack (and the exception condition is cleared), |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1910 and the interpreter jumps to the label gotten from the block |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1911 stack. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1912 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1913 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1914 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1915 compiler_try_finally(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1916 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1917 basicblock *body, *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1918 body = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1919 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1920 if (body == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1921 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1922 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1923 ADDOP_JREL(c, SETUP_FINALLY, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1924 compiler_use_next_block(c, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1925 if (!compiler_push_fblock(c, FINALLY_TRY, body)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1926 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1927 VISIT_SEQ(c, stmt, s->v.TryFinally.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1928 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1929 compiler_pop_fblock(c, FINALLY_TRY, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1930 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1931 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1932 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1933 if (!compiler_push_fblock(c, FINALLY_END, end)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1934 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1935 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1936 ADDOP(c, END_FINALLY); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1937 compiler_pop_fblock(c, FINALLY_END, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1938 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1939 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1940 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1941 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1942 /* |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1943 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...": |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1944 (The contents of the value stack is shown in [], with the top |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1945 at the right; 'tb' is trace-back info, 'val' the exception's |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1946 associated value, and 'exc' the exception.) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1947 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1948 Value stack Label Instruction Argument |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1949 [] SETUP_EXCEPT L1 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1950 [] <code for S> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1951 [] POP_BLOCK |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1952 [] JUMP_FORWARD L0 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1953 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1954 [tb, val, exc] L1: DUP ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1955 [tb, val, exc, exc] <evaluate E1> ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1956 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1957 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1958 [tb, val, exc, 1] POP ) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1959 [tb, val, exc] POP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1960 [tb, val] <assign to V1> (or POP if no V1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1961 [tb] POP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1962 [] <code for S1> |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1963 JUMP_FORWARD L0 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1964 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1965 [tb, val, exc, 0] L2: POP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1966 [tb, val, exc] DUP |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1967 .............................etc....................... |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1968 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1969 [tb, val, exc, 0] Ln+1: POP |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1970 [tb, val, exc] END_FINALLY # re-raise exception |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1971 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1972 [] L0: <next statement> |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1973 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1974 Of course, parts are not generated if Vi or Ei is not present. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1975 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1976 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1977 compiler_try_except(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1978 { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
1979 basicblock *body, *orelse, *except, *end; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1980 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1981 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1982 body = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1983 except = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1984 orelse = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1985 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1986 if (body == NULL || except == NULL || orelse == NULL || end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1987 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1988 ADDOP_JREL(c, SETUP_EXCEPT, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1989 compiler_use_next_block(c, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1990 if (!compiler_push_fblock(c, EXCEPT, body)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1991 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1992 VISIT_SEQ(c, stmt, s->v.TryExcept.body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1993 ADDOP(c, POP_BLOCK); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1994 compiler_pop_fblock(c, EXCEPT, body); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1995 ADDOP_JREL(c, JUMP_FORWARD, orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1996 n = asdl_seq_LEN(s->v.TryExcept.handlers); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1997 compiler_use_next_block(c, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
1998 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
1999 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2000 s->v.TryExcept.handlers, i); |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2001 if (!handler->v.ExceptHandler.type && i < n-1) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2002 return compiler_error(c, "default 'except:' must be last"); |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
2003 c->u->u_lineno_set = 0; |
|
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
2004 c->u->u_lineno = handler->lineno; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2005 except = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2006 if (except == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2007 return 0; |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2008 if (handler->v.ExceptHandler.type) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2009 ADDOP(c, DUP_TOP); |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2010 VISIT(c, expr, handler->v.ExceptHandler.type); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2011 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2012 ADDOP_JREL(c, JUMP_IF_FALSE, except); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2013 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2014 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2015 ADDOP(c, POP_TOP); |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2016 if (handler->v.ExceptHandler.name) { |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2017 basicblock *cleanup_end, *cleanup_body; |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2018 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2019 cleanup_end = compiler_new_block(c); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2020 cleanup_body = compiler_new_block(c); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2021 if(!(cleanup_end || cleanup_body)) |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2022 return 0; |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2023 |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2024 compiler_nameop(c, handler->v.ExceptHandler.name, Store); |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2025 ADDOP(c, POP_TOP); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2026 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2027 /* |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2028 try: |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2029 # body |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2030 except type as name: |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2031 try: |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2032 # body |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2033 finally: |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2034 name = None |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2035 del name |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2036 */ |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2037 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2038 /* second try: */ |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2039 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2040 compiler_use_next_block(c, cleanup_body); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2041 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body)) |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2042 return 0; |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2043 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2044 /* second # body */ |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2045 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2046 ADDOP(c, POP_BLOCK); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2047 ADDOP(c, POP_EXCEPT); |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2048 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2049 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2050 /* finally: */ |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2051 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2052 compiler_use_next_block(c, cleanup_end); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2053 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end)) |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2054 return 0; |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2055 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2056 /* name = None */ |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2057 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2058 compiler_nameop(c, handler->v.ExceptHandler.name, Store); |
|
40588
4bab65fcca8e
Some more changes related to the new except syntax and semantics,
Guido van Rossum <guido@python.org>
parents:
40587
diff
changeset
|
2059 |
|
4bab65fcca8e
Some more changes related to the new except syntax and semantics,
Guido van Rossum <guido@python.org>
parents:
40587
diff
changeset
|
2060 /* del name */ |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2061 compiler_nameop(c, handler->v.ExceptHandler.name, Del); |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2062 |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2063 ADDOP(c, END_FINALLY); |
|
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2064 compiler_pop_fblock(c, FINALLY_END, cleanup_end); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2065 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2066 else { |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2067 basicblock *cleanup_body; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2068 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2069 cleanup_body = compiler_new_block(c); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2070 if(!cleanup_body) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2071 return 0; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2072 |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2073 ADDOP(c, POP_TOP); |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40529
diff
changeset
|
2074 ADDOP(c, POP_TOP); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2075 compiler_use_next_block(c, cleanup_body); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2076 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body)) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2077 return 0; |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2078 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2079 ADDOP(c, POP_EXCEPT); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
2080 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2081 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2082 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2083 compiler_use_next_block(c, except); |
|
46231
81ee270a6eb5
Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents:
46208
diff
changeset
|
2084 if (handler->v.ExceptHandler.type) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2085 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2086 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2087 ADDOP(c, END_FINALLY); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2088 compiler_use_next_block(c, orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2089 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2090 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2091 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2092 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2093 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2094 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2095 compiler_import_as(struct compiler *c, identifier name, identifier asname) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2096 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2097 /* The IMPORT_NAME opcode was already generated. This function |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2098 merely needs to bind the result to a name. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2099 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2100 If there is a dot in name, we need to split it and emit a |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2101 LOAD_ATTR for each name. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2102 */ |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2103 const Py_UNICODE *src = PyUnicode_AS_UNICODE(name); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2104 const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.'); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2105 if (dot) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2106 /* Consume the base module name to get the first attribute */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2107 src = dot + 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2108 while (dot) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2109 /* NB src is only defined when dot != NULL */ |
|
35759
d91ed7107fd2
ANSI-C-ify the placement of local var declarations.
Armin Rigo <arigo@tunes.org>
parents:
35742
diff
changeset
|
2110 PyObject *attr; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2111 dot = Py_UNICODE_strchr(src, '.'); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2112 attr = PyUnicode_FromUnicode(src, |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2113 dot ? dot - src : Py_UNICODE_strlen(src)); |
|
35895
fe4c627b2096
Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
2114 if (!attr) |
|
fe4c627b2096
Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
2115 return -1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2116 ADDOP_O(c, LOAD_ATTR, attr, names); |
|
35895
fe4c627b2096
Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents:
35893
diff
changeset
|
2117 Py_DECREF(attr); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2118 src = dot + 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2119 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2120 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2121 return compiler_nameop(c, asname, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2122 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2123 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2124 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2125 compiler_import(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2126 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2127 /* The Import node stores a module name like a.b.c as a single |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2128 string. This is convenient for all cases except |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2129 import a.b.c as d |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2130 where we need to parse that string to extract the individual |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2131 module names. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2132 XXX Perhaps change the representation to make this case simpler? |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2133 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2134 int i, n = asdl_seq_LEN(s->v.Import.names); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2135 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2136 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2137 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2138 int r; |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2139 PyObject *level; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2140 |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
2141 level = PyLong_FromLong(0); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2142 if (level == NULL) |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2143 return 0; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2144 |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2145 ADDOP_O(c, LOAD_CONST, level, consts); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2146 Py_DECREF(level); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2147 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2148 ADDOP_NAME(c, IMPORT_NAME, alias->name, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2149 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2150 if (alias->asname) { |
|
35772
f64fb284ed15
Don't stop generating code for import statements after the first "import as"
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35767
diff
changeset
|
2151 r = compiler_import_as(c, alias->name, alias->asname); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2152 if (!r) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2153 return r; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2154 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2155 else { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2156 identifier tmp = alias->name; |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2157 const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name); |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2158 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.'); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2159 if (dot) |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2160 tmp = PyUnicode_FromUnicode(base, |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2161 dot - base); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2162 r = compiler_nameop(c, tmp, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2163 if (dot) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2164 Py_DECREF(tmp); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2165 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2166 if (!r) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2167 return r; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2168 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2169 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2170 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2171 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2172 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2173 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2174 compiler_from_import(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2175 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2176 int i, n = asdl_seq_LEN(s->v.ImportFrom.names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2177 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2178 PyObject *names = PyTuple_New(n); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2179 PyObject *level; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2180 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2181 if (!names) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2182 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2183 |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
2184 level = PyLong_FromLong(s->v.ImportFrom.level); |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2185 if (!level) { |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2186 Py_DECREF(names); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2187 return 0; |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2188 } |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2189 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2190 /* build up the names */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2191 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2192 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2193 Py_INCREF(alias->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2194 PyTuple_SET_ITEM(names, i, alias->name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2195 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2196 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2197 if (s->lineno > c->c_future->ff_lineno) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2198 if (!PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, |
|
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2199 "__future__")) { |
|
36804
c552f2275782
Fix refleak if from __future__ import was not first
Neal Norwitz <nnorwitz@gmail.com>
parents:
36797
diff
changeset
|
2200 Py_DECREF(level); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2201 Py_DECREF(names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2202 return compiler_error(c, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2203 "from __future__ imports must occur " |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2204 "at the beginning of the file"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2205 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2206 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2207 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2208 |
|
36712
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2209 ADDOP_O(c, LOAD_CONST, level, consts); |
|
5c36c222e7ca
SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents:
36697
diff
changeset
|
2210 Py_DECREF(level); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2211 ADDOP_O(c, LOAD_CONST, names, consts); |
|
35939
79374eb6db51
Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents:
35895
diff
changeset
|
2212 Py_DECREF(names); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2213 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2214 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2215 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2216 identifier store_name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2217 |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2218 if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2219 assert(n == 1); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2220 ADDOP(c, IMPORT_STAR); |
|
35993
a29c89b4e8c6
Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
2221 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2222 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2223 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2224 ADDOP_NAME(c, IMPORT_FROM, alias->name, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2225 store_name = alias->name; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2226 if (alias->asname) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2227 store_name = alias->asname; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2228 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2229 if (!compiler_nameop(c, store_name, Store)) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2230 Py_DECREF(names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2231 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2232 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2233 } |
|
35993
a29c89b4e8c6
Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
2234 /* remove imported module */ |
|
a29c89b4e8c6
Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents:
35939
diff
changeset
|
2235 ADDOP(c, POP_TOP); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2236 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2237 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2238 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2239 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2240 compiler_assert(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2241 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2242 static PyObject *assertion_error = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2243 basicblock *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2244 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2245 if (Py_OptimizeFlag) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2246 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2247 if (assertion_error == NULL) { |
|
45029
ef2d3bf8383d
Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44943
diff
changeset
|
2248 assertion_error = PyUnicode_InternFromString("AssertionError"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2249 if (assertion_error == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2250 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2251 } |
|
45774
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2252 if (s->v.Assert.test->kind == Tuple_kind && |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2253 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) { |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2254 const char* msg = |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2255 "assertion is always true, perhaps remove parentheses?"; |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2256 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2257 c->u->u_lineno, NULL, NULL) == -1) |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2258 return 0; |
|
058fbfb985ae
Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45773
diff
changeset
|
2259 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2260 VISIT(c, expr, s->v.Assert.test); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2261 end = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2262 if (end == NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2263 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2264 ADDOP_JREL(c, JUMP_IF_TRUE, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2265 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2266 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2267 if (s->v.Assert.msg) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2268 VISIT(c, expr, s->v.Assert.msg); |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2269 ADDOP_I(c, CALL_FUNCTION, 1); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2270 } |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2271 ADDOP_I(c, RAISE_VARARGS, 1); |
|
36081
19d96c2d7df5
Fix Armin's bug 1333982. He found it, he didn't created it :-)
Neal Norwitz <nnorwitz@gmail.com>
parents:
36079
diff
changeset
|
2272 compiler_use_next_block(c, end); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2273 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2274 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2275 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2276 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2277 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2278 compiler_visit_stmt(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2279 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2280 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2281 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
2282 /* Always assign a lineno to the next instruction for a stmt. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2283 c->u->u_lineno = s->lineno; |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
2284 c->u->u_lineno_set = 0; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2285 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2286 switch (s->kind) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2287 case FunctionDef_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2288 return compiler_function(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2289 case ClassDef_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2290 return compiler_class(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2291 case Return_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2292 if (c->u->u_ste->ste_type != FunctionBlock) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2293 return compiler_error(c, "'return' outside function"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2294 if (s->v.Return.value) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2295 VISIT(c, expr, s->v.Return.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2296 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2297 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2298 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2299 ADDOP(c, RETURN_VALUE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2300 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2301 case Delete_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2302 VISIT_SEQ(c, expr, s->v.Delete.targets) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2303 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2304 case Assign_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2305 n = asdl_seq_LEN(s->v.Assign.targets); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2306 VISIT(c, expr, s->v.Assign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2307 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2308 if (i < n - 1) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2309 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2310 VISIT(c, expr, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2311 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2312 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2313 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2314 case AugAssign_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2315 return compiler_augassign(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2316 case For_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2317 return compiler_for(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2318 case While_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2319 return compiler_while(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2320 case If_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2321 return compiler_if(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2322 case Raise_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2323 n = 0; |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2324 if (s->v.Raise.exc) { |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2325 VISIT(c, expr, s->v.Raise.exc); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2326 n++; |
|
43102
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2327 if (s->v.Raise.cause) { |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2328 VISIT(c, expr, s->v.Raise.cause); |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2329 n++; |
|
981ecc526703
Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents:
43100
diff
changeset
|
2330 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2331 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2332 ADDOP_I(c, RAISE_VARARGS, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2333 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2334 case TryExcept_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2335 return compiler_try_except(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2336 case TryFinally_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2337 return compiler_try_finally(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2338 case Assert_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2339 return compiler_assert(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2340 case Import_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2341 return compiler_import(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2342 case ImportFrom_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2343 return compiler_from_import(c, s); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2344 case Global_kind: |
|
40965
30e5cb3a55ac
Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
40943
diff
changeset
|
2345 case Nonlocal_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2346 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2347 case Expr_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2348 if (c->c_interactive && c->c_nestlevel <= 1) { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
2349 VISIT(c, expr, s->v.Expr.value); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2350 ADDOP(c, PRINT_EXPR); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2351 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
2352 else if (s->v.Expr.value->kind != Str_kind && |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
2353 s->v.Expr.value->kind != Num_kind) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
2354 VISIT(c, expr, s->v.Expr.value); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2355 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2356 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2357 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2358 case Pass_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2359 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2360 case Break_kind: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2361 if (!compiler_in_loop(c)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2362 return compiler_error(c, "'break' outside loop"); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2363 ADDOP(c, BREAK_LOOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2364 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2365 case Continue_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2366 return compiler_continue(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2367 case With_kind: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2368 return compiler_with(c, s); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2369 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2370 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2371 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2372 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2373 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2374 unaryop(unaryop_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2375 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2376 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2377 case Invert: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2378 return UNARY_INVERT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2379 case Not: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2380 return UNARY_NOT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2381 case UAdd: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2382 return UNARY_POSITIVE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2383 case USub: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2384 return UNARY_NEGATIVE; |
|
46208
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2385 default: |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2386 PyErr_Format(PyExc_SystemError, |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2387 "unary op %d should not be possible", op); |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2388 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2389 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2390 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2391 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2392 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2393 binop(struct compiler *c, operator_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2394 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2395 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2396 case Add: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2397 return BINARY_ADD; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2398 case Sub: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2399 return BINARY_SUBTRACT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2400 case Mult: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2401 return BINARY_MULTIPLY; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2402 case Div: |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36965
diff
changeset
|
2403 return BINARY_TRUE_DIVIDE; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2404 case Mod: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2405 return BINARY_MODULO; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2406 case Pow: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2407 return BINARY_POWER; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2408 case LShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2409 return BINARY_LSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2410 case RShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2411 return BINARY_RSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2412 case BitOr: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2413 return BINARY_OR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2414 case BitXor: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2415 return BINARY_XOR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2416 case BitAnd: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2417 return BINARY_AND; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2418 case FloorDiv: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2419 return BINARY_FLOOR_DIVIDE; |
|
46208
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2420 default: |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2421 PyErr_Format(PyExc_SystemError, |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2422 "binary op %d should not be possible", op); |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2423 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2424 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2425 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2426 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2427 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2428 cmpop(cmpop_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2429 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2430 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2431 case Eq: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2432 return PyCmp_EQ; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2433 case NotEq: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2434 return PyCmp_NE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2435 case Lt: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2436 return PyCmp_LT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2437 case LtE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2438 return PyCmp_LE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2439 case Gt: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2440 return PyCmp_GT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2441 case GtE: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2442 return PyCmp_GE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2443 case Is: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2444 return PyCmp_IS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2445 case IsNot: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2446 return PyCmp_IS_NOT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2447 case In: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2448 return PyCmp_IN; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2449 case NotIn: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2450 return PyCmp_NOT_IN; |
|
46208
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2451 default: |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2452 return PyCmp_BAD; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2453 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2454 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2455 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2456 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2457 inplace_binop(struct compiler *c, operator_ty op) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2458 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2459 switch (op) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2460 case Add: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2461 return INPLACE_ADD; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2462 case Sub: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2463 return INPLACE_SUBTRACT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2464 case Mult: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2465 return INPLACE_MULTIPLY; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2466 case Div: |
|
36988
49c6eb688906
Checkpoint. 218 tests are okay; 53 are failing. Done so far:
Guido van Rossum <guido@python.org>
parents:
36965
diff
changeset
|
2467 return INPLACE_TRUE_DIVIDE; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2468 case Mod: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2469 return INPLACE_MODULO; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2470 case Pow: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2471 return INPLACE_POWER; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2472 case LShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2473 return INPLACE_LSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2474 case RShift: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2475 return INPLACE_RSHIFT; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2476 case BitOr: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2477 return INPLACE_OR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2478 case BitXor: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2479 return INPLACE_XOR; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2480 case BitAnd: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2481 return INPLACE_AND; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2482 case FloorDiv: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2483 return INPLACE_FLOOR_DIVIDE; |
|
46208
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2484 default: |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2485 PyErr_Format(PyExc_SystemError, |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2486 "inplace binary op %d should not be possible", op); |
|
ea75b12fe8e7
Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45774
diff
changeset
|
2487 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2488 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2489 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2490 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2491 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2492 compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2493 { |
|
35781
31d36dd5959c
Remove unnecessary local variable.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35779
diff
changeset
|
2494 int op, scope, arg; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2495 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2496 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2497 PyObject *dict = c->u->u_names; |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2498 PyObject *mangled; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2499 /* XXX AugStore isn't used anywhere! */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2500 |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
2501 mangled = _Py_Mangle(c->u->u_private, name); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2502 if (!mangled) |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2503 return 0; |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2504 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2505 op = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2506 optype = OP_NAME; |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2507 scope = PyST_GetScope(c->u->u_ste, mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2508 switch (scope) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2509 case FREE: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2510 dict = c->u->u_freevars; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2511 optype = OP_DEREF; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2512 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2513 case CELL: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2514 dict = c->u->u_cellvars; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2515 optype = OP_DEREF; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2516 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2517 case LOCAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2518 if (c->u->u_ste->ste_type == FunctionBlock) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2519 optype = OP_FAST; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2520 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2521 case GLOBAL_IMPLICIT: |
|
35773
0aef351223da
Fix arigo's funky LOAD_NAME bug: implicit globals inside classes have
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35772
diff
changeset
|
2522 if (c->u->u_ste->ste_type == FunctionBlock && |
|
0aef351223da
Fix arigo's funky LOAD_NAME bug: implicit globals inside classes have
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35772
diff
changeset
|
2523 !c->u->u_ste->ste_unoptimized) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2524 optype = OP_GLOBAL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2525 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2526 case GLOBAL_EXPLICIT: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2527 optype = OP_GLOBAL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2528 break; |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2529 default: |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2530 /* scope can be 0 */ |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2531 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2532 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2533 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2534 /* XXX Leave assert here, but handle __doc__ and the like better */ |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
2535 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_'); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2536 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2537 switch (optype) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2538 case OP_DEREF: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2539 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2540 case Load: op = LOAD_DEREF; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2541 case Store: op = STORE_DEREF; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2542 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2543 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2544 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2545 case Del: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2546 PyErr_Format(PyExc_SyntaxError, |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
2547 "can not delete variable '%S' referenced " |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2548 "in nested scope", |
|
41878
089f449a20cd
Change PyErr_Format() to generate a unicode string (by using
Walter Dörwald <walter@livinglogic.de>
parents:
41824
diff
changeset
|
2549 name); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2550 Py_DECREF(mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2551 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2552 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2553 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2554 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2555 "param invalid for deref variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2556 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2557 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2558 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2559 case OP_FAST: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2560 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2561 case Load: op = LOAD_FAST; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2562 case Store: op = STORE_FAST; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2563 case Del: op = DELETE_FAST; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2564 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2565 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2566 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2567 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2568 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2569 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2570 "param invalid for local variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2571 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2572 } |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2573 ADDOP_O(c, op, mangled, varnames); |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2574 Py_DECREF(mangled); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2575 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2576 case OP_GLOBAL: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2577 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2578 case Load: op = LOAD_GLOBAL; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2579 case Store: op = STORE_GLOBAL; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2580 case Del: op = DELETE_GLOBAL; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2581 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2582 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2583 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2584 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2585 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2586 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2587 "param invalid for global variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2588 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2589 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2590 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2591 case OP_NAME: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2592 switch (ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2593 case Load: op = LOAD_NAME; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2594 case Store: op = STORE_NAME; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2595 case Del: op = DELETE_NAME; break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2596 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2597 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2598 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2599 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
2600 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2601 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2602 "param invalid for name variable"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2603 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2604 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2605 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2606 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2607 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2608 assert(op); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2609 arg = compiler_add_o(c, dict, mangled); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
2610 Py_DECREF(mangled); |
|
35779
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2611 if (arg < 0) |
|
19d796bd740f
Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35778
diff
changeset
|
2612 return 0; |
|
35781
31d36dd5959c
Remove unnecessary local variable.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
35779
diff
changeset
|
2613 return compiler_addop_i(c, op, arg); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2614 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2615 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2616 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2617 compiler_boolop(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2618 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2619 basicblock *end; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2620 int jumpi, i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2621 asdl_seq *s; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2622 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2623 assert(e->kind == BoolOp_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2624 if (e->v.BoolOp.op == And) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2625 jumpi = JUMP_IF_FALSE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2626 else |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2627 jumpi = JUMP_IF_TRUE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2628 end = compiler_new_block(c); |
|
36173
ade46371f04b
Adjust usage of compiler_use_new_block to its return type.
Martin v. Löwis <martin@v.loewis.de>
parents:
36084
diff
changeset
|
2629 if (end == NULL) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2630 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2631 s = e->v.BoolOp.values; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2632 n = asdl_seq_LEN(s) - 1; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
2633 assert(n >= 0); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2634 for (i = 0; i < n; ++i) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2635 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2636 ADDOP_JREL(c, jumpi, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2637 ADDOP(c, POP_TOP) |
| 69 | 2638 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2639 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2640 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2641 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2642 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2643 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2644 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2645 compiler_list(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2646 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2647 int n = asdl_seq_LEN(e->v.List.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2648 if (e->v.List.ctx == Store) { |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2649 int i, seen_star = 0; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2650 for (i = 0; i < n; i++) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2651 expr_ty elt = asdl_seq_GET(e->v.List.elts, i); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2652 if (elt->kind == Starred_kind && !seen_star) { |
|
45760
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2653 if ((i >= (1 << 8)) || |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2654 (n-i-1 >= (INT_MAX >> 8))) |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2655 return compiler_error(c, |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2656 "too many expressions in " |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2657 "star-unpacking assignment"); |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2658 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8))); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2659 seen_star = 1; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2660 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2661 } else if (elt->kind == Starred_kind) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2662 return compiler_error(c, |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2663 "two starred expressions in assignment"); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2664 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2665 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2666 if (!seen_star) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2667 ADDOP_I(c, UNPACK_SEQUENCE, n); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2668 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2669 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2670 VISIT_SEQ(c, expr, e->v.List.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2671 if (e->v.List.ctx == Load) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2672 ADDOP_I(c, BUILD_LIST, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2673 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2674 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2675 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2676 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2677 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2678 compiler_tuple(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2679 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2680 int n = asdl_seq_LEN(e->v.Tuple.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2681 if (e->v.Tuple.ctx == Store) { |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2682 int i, seen_star = 0; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2683 for (i = 0; i < n; i++) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2684 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2685 if (elt->kind == Starred_kind && !seen_star) { |
|
45760
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2686 if ((i >= (1 << 8)) || |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2687 (n-i-1 >= (INT_MAX >> 8))) |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2688 return compiler_error(c, |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2689 "too many expressions in " |
|
16580dc14294
Fix crasher in unpacking assignments with star, where the size constraints
Thomas Wouters <thomas@python.org>
parents:
45244
diff
changeset
|
2690 "star-unpacking assignment"); |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2691 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8))); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2692 seen_star = 1; |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2693 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2694 } else if (elt->kind == Starred_kind) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2695 return compiler_error(c, |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2696 "two starred expressions in assignment"); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2697 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2698 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2699 if (!seen_star) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2700 ADDOP_I(c, UNPACK_SEQUENCE, n); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
2701 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2702 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2703 VISIT_SEQ(c, expr, e->v.Tuple.elts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2704 if (e->v.Tuple.ctx == Load) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2705 ADDOP_I(c, BUILD_TUPLE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2706 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2707 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2708 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2709 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2710 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2711 compiler_compare(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2712 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2713 int i, n; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2714 basicblock *cleanup = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2715 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2716 /* XXX the logic can be cleaned up for 1 or multiple comparisons */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2717 VISIT(c, expr, e->v.Compare.left); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2718 n = asdl_seq_LEN(e->v.Compare.ops); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2719 assert(n > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2720 if (n > 1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2721 cleanup = compiler_new_block(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2722 if (cleanup == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2723 return 0; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2724 VISIT(c, expr, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2725 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2726 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2727 for (i = 1; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2728 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2729 ADDOP(c, ROT_THREE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2730 ADDOP_I(c, COMPARE_OP, |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2731 cmpop((cmpop_ty)(asdl_seq_GET( |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2732 e->v.Compare.ops, i - 1)))); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2733 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2734 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2735 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2736 if (i < (n - 1)) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2737 VISIT(c, expr, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
2738 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2739 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2740 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2741 ADDOP_I(c, COMPARE_OP, |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
2742 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1)))); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2743 if (n > 1) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2744 basicblock *end = compiler_new_block(c); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2745 if (end == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2746 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2747 ADDOP_JREL(c, JUMP_FORWARD, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2748 compiler_use_next_block(c, cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2749 ADDOP(c, ROT_TWO); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2750 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2751 compiler_use_next_block(c, end); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2752 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2753 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2754 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2755 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2756 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2757 compiler_call(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2758 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2759 VISIT(c, expr, e->v.Call.func); |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2760 return compiler_call_helper(c, 0, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2761 e->v.Call.args, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2762 e->v.Call.keywords, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2763 e->v.Call.starargs, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2764 e->v.Call.kwargs); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2765 } |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2766 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2767 /* shared code between compiler_call and compiler_class */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2768 static int |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2769 compiler_call_helper(struct compiler *c, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2770 int n, /* Args already pushed */ |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2771 asdl_seq *args, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2772 asdl_seq *keywords, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2773 expr_ty starargs, |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2774 expr_ty kwargs) |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2775 { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2776 int code = 0; |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2777 |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2778 n += asdl_seq_LEN(args); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2779 VISIT_SEQ(c, expr, args); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2780 if (keywords) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2781 VISIT_SEQ(c, keyword, keywords); |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2782 n |= asdl_seq_LEN(keywords) << 8; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2783 } |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2784 if (starargs) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2785 VISIT(c, expr, starargs); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2786 code |= 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2787 } |
|
41226
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2788 if (kwargs) { |
|
19f7ff443718
Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents:
40965
diff
changeset
|
2789 VISIT(c, expr, kwargs); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2790 code |= 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2791 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2792 switch (code) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2793 case 0: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2794 ADDOP_I(c, CALL_FUNCTION, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2795 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2796 case 1: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2797 ADDOP_I(c, CALL_FUNCTION_VAR, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2798 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2799 case 2: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2800 ADDOP_I(c, CALL_FUNCTION_KW, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2801 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2802 case 3: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2803 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2804 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2805 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2806 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2807 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2808 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2809 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2810 /* List and set comprehensions and generator expressions work by creating a |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2811 nested function to perform the actual iteration. This means that the |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2812 iteration variables don't leak into the current scope. |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2813 The defined function is called immediately following its definition, with the |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2814 result of that call being the result of the expression. |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2815 The LC/SC version returns the populated container, while the GE version is |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2816 flagged in symtable.c as a generator, so it returns the generator object |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2817 when the function is called. |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2818 This code *knows* that the loop cannot contain break, continue, or return, |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2819 so it cheats and skips the SETUP_LOOP/POP_BLOCK steps used in normal loops. |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2820 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2821 Possible cleanups: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2822 - iterate over the generator sequence instead of using recursion |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2823 */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2824 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2825 static int |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2826 compiler_comprehension_generator(struct compiler *c, PyObject *tmpname, |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2827 asdl_seq *generators, int gen_index, |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2828 expr_ty elt, expr_ty val, int type) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2829 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2830 /* generate code for the iterator, then each of the ifs, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2831 and then write to the element */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2832 |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2833 comprehension_ty gen; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2834 basicblock *start, *anchor, *skip, *if_cleanup; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2835 int i, n; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2836 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2837 start = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2838 skip = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2839 if_cleanup = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2840 anchor = compiler_new_block(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2841 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2842 if (start == NULL || skip == NULL || if_cleanup == NULL || |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2843 anchor == NULL) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2844 return 0; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2845 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2846 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2847 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2848 if (gen_index == 0) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2849 /* Receive outermost iter as an implicit argument */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2850 c->u->u_argcount = 1; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2851 ADDOP_I(c, LOAD_FAST, 0); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2852 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2853 else { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2854 /* Sub-iter - calculate on the fly */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2855 VISIT(c, expr, gen->iter); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2856 ADDOP(c, GET_ITER); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2857 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2858 compiler_use_next_block(c, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2859 ADDOP_JREL(c, FOR_ITER, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2860 NEXT_BLOCK(c); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2861 VISIT(c, expr, gen->target); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2862 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2863 /* XXX this needs to be cleaned up...a lot! */ |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2864 n = asdl_seq_LEN(gen->ifs); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2865 for (i = 0; i < n; i++) { |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2866 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2867 VISIT(c, expr, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2868 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2869 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2870 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2871 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2872 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2873 if (++gen_index < asdl_seq_LEN(generators)) |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2874 if (!compiler_comprehension_generator(c, tmpname, |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2875 generators, gen_index, |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2876 elt, val, type)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2877 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2878 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2879 /* only append after the last for generator */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2880 if (gen_index >= asdl_seq_LEN(generators)) { |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2881 /* comprehension specific code */ |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2882 switch (type) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2883 case COMP_GENEXP: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2884 VISIT(c, expr, elt); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2885 ADDOP(c, YIELD_VALUE); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2886 ADDOP(c, POP_TOP); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2887 break; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2888 case COMP_LISTCOMP: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2889 if (!compiler_nameop(c, tmpname, Load)) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2890 return 0; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2891 VISIT(c, expr, elt); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2892 ADDOP(c, LIST_APPEND); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2893 break; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2894 case COMP_SETCOMP: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2895 if (!compiler_nameop(c, tmpname, Load)) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2896 return 0; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2897 VISIT(c, expr, elt); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2898 ADDOP(c, SET_ADD); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2899 break; |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2900 case COMP_DICTCOMP: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2901 if (!compiler_nameop(c, tmpname, Load)) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2902 return 0; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2903 /* With 'd[k] = v', v is evaluated before k, so we do |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2904 the same. STORE_SUBSCR requires (item, map, key), |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2905 so we still end up ROTing once. */ |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2906 VISIT(c, expr, val); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2907 ADDOP(c, ROT_TWO); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2908 VISIT(c, expr, elt); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2909 ADDOP(c, STORE_SUBSCR); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2910 break; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2911 default: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2912 return 0; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2913 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2914 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2915 compiler_use_next_block(c, skip); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2916 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2917 for (i = 0; i < n; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2918 ADDOP_I(c, JUMP_FORWARD, 1); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
2919 if (i == 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2920 compiler_use_next_block(c, if_cleanup); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2921 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2922 ADDOP(c, POP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2923 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2924 ADDOP_JABS(c, JUMP_ABSOLUTE, start); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2925 compiler_use_next_block(c, anchor); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2926 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2927 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2928 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2929 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
2930 static int |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2931 compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name, |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2932 asdl_seq *generators, expr_ty elt, expr_ty val) |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2933 { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2934 PyCodeObject *co = NULL; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2935 identifier tmp = NULL; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2936 expr_ty outermost_iter; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2937 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2938 outermost_iter = ((comprehension_ty) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2939 asdl_seq_GET(generators, 0))->iter; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2940 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2941 if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2942 goto error; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2943 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2944 if (type != COMP_GENEXP) { |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2945 int op; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2946 tmp = compiler_new_tmpname(c); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2947 if (!tmp) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2948 goto error_in_scope; |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2949 switch (type) { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2950 case COMP_LISTCOMP: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2951 op = BUILD_LIST; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2952 break; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2953 case COMP_SETCOMP: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2954 op = BUILD_SET; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2955 break; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2956 case COMP_DICTCOMP: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2957 op = BUILD_MAP; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2958 break; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2959 default: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2960 PyErr_Format(PyExc_SystemError, |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2961 "unknown comprehension type %d", type); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2962 goto error_in_scope; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2963 } |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2964 |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2965 ADDOP_I(c, op, 0); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2966 ADDOP(c, DUP_TOP); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2967 if (!compiler_nameop(c, tmp, Store)) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2968 goto error_in_scope; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2969 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2970 |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2971 if (!compiler_comprehension_generator(c, tmp, generators, 0, elt, |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
2972 val, type)) |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2973 goto error_in_scope; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2974 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2975 if (type != COMP_GENEXP) { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2976 ADDOP(c, RETURN_VALUE); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2977 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2978 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2979 co = assemble(c, 1); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2980 compiler_exit_scope(c); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2981 if (co == NULL) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2982 goto error; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2983 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2984 if (!compiler_make_closure(c, co, 0)) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2985 goto error; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2986 Py_DECREF(co); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2987 Py_XDECREF(tmp); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2988 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2989 VISIT(c, expr, outermost_iter); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2990 ADDOP(c, GET_ITER); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2991 ADDOP_I(c, CALL_FUNCTION, 1); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2992 return 1; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2993 error_in_scope: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2994 compiler_exit_scope(c); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2995 error: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2996 Py_XDECREF(co); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2997 Py_XDECREF(tmp); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2998 return 0; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
2999 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3000 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3001 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3002 compiler_genexp(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3003 { |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3004 static identifier name; |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3005 if (!name) { |
|
47082
b630729571e6
Merged revisions 63208-63209,63211-63212,63214-63217,63219-63224,63226-63227,63229-63232,63234-63235,63237-63239,63241,63243-63246,63250-63254,63256-63259,63261,63263-63264,63266-63267,63269-63270,63272-63273,63275-63276,63278,63280-63281,63283-63284,63286-63287,63289-63290,63292-63293,63295-63296,63298-63299,63301-63302,63304-63305,63307,63309-63314,63316-63322,63324-63325,63327-63335,63337-63338,63340-63342,63344-63346,63348 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46240
diff
changeset
|
3006 name = PyUnicode_FromString("<genexpr>"); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3007 if (!name) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3008 return 0; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3009 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3010 assert(e->kind == GeneratorExp_kind); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3011 return compiler_comprehension(c, e, COMP_GENEXP, name, |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3012 e->v.GeneratorExp.generators, |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3013 e->v.GeneratorExp.elt, NULL); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3014 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3015 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3016 static int |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3017 compiler_listcomp(struct compiler *c, expr_ty e) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3018 { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3019 static identifier name; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3020 if (!name) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
3021 name = PyUnicode_FromString("<listcomp>"); |
|
35881
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3022 if (!name) |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3023 return 0; |
|
29420bd3b5cb
Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents:
35863
diff
changeset
|
3024 } |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3025 assert(e->kind == ListComp_kind); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3026 return compiler_comprehension(c, e, COMP_LISTCOMP, name, |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3027 e->v.ListComp.generators, |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3028 e->v.ListComp.elt, NULL); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3029 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3030 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3031 static int |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3032 compiler_setcomp(struct compiler *c, expr_ty e) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3033 { |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3034 static identifier name; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3035 if (!name) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
3036 name = PyUnicode_FromString("<setcomp>"); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3037 if (!name) |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3038 return 0; |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3039 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3040 assert(e->kind == SetComp_kind); |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3041 return compiler_comprehension(c, e, COMP_SETCOMP, name, |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3042 e->v.SetComp.generators, |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3043 e->v.SetComp.elt, NULL); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3044 } |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3045 |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3046 |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3047 static int |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3048 compiler_dictcomp(struct compiler *c, expr_ty e) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3049 { |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3050 static identifier name; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3051 if (!name) { |
|
42802
01ee6311ba46
Ensure that code object names (co_name) are unicode.
Neal Norwitz <nnorwitz@gmail.com>
parents:
42775
diff
changeset
|
3052 name = PyUnicode_FromString("<dictcomp>"); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3053 if (!name) |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3054 return 0; |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3055 } |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3056 assert(e->kind == DictComp_kind); |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3057 return compiler_comprehension(c, e, COMP_DICTCOMP, name, |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3058 e->v.DictComp.generators, |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3059 e->v.DictComp.key, e->v.DictComp.value); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3060 } |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3061 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3062 |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3063 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3064 compiler_visit_keyword(struct compiler *c, keyword_ty k) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3065 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3066 ADDOP_O(c, LOAD_CONST, k->arg, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3067 VISIT(c, expr, k->value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3068 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3069 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3070 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3071 /* Test whether expression is constant. For constants, report |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3072 whether they are true or false. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3073 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3074 Return values: 1 for true, 0 for false, -1 for non-constant. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3075 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3076 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3077 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3078 expr_constant(expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3079 { |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3080 char *id; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3081 switch (e->kind) { |
|
39783
7a0ad110e91e
Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents:
39782
diff
changeset
|
3082 case Ellipsis_kind: |
|
7a0ad110e91e
Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents:
39782
diff
changeset
|
3083 return 1; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3084 case Num_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3085 return PyObject_IsTrue(e->v.Num.n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3086 case Str_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3087 return PyObject_IsTrue(e->v.Str.s); |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3088 case Name_kind: |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3089 /* optimize away names that can't be reassigned */ |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3090 id = PyBytes_AS_STRING( |
|
42089
0e010db122c7
Looks like an oopsie -- I ignored a warning at my peril.
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
3091 _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL)); |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3092 if (strcmp(id, "True") == 0) return 1; |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3093 if (strcmp(id, "False") == 0) return 0; |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3094 if (strcmp(id, "None") == 0) return 0; |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3095 if (strcmp(id, "__debug__") == 0) |
|
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42013
diff
changeset
|
3096 return ! Py_OptimizeFlag; |
|
38673
a19c20c5e5c7
Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
3097 /* fall through */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3098 default: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3099 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3100 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3101 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3102 |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3103 /* |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3104 Implements the with statement from PEP 343. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3105 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3106 The semantics outlined in that PEP are as follows: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3107 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3108 with EXPR as VAR: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3109 BLOCK |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3110 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3111 It is implemented roughly as: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3112 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3113 context = EXPR |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3114 exit = context.__exit__ # not calling it |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3115 value = context.__enter__() |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3116 try: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3117 VAR = value # if VAR present in the syntax |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3118 BLOCK |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3119 finally: |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3120 if an exception was raised: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3121 exc = copy of (exception, instance, traceback) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3122 else: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3123 exc = (None, None, None) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3124 exit(*exc) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3125 */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3126 static int |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3127 compiler_with(struct compiler *c, stmt_ty s) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3128 { |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3129 static identifier enter_attr, exit_attr; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3130 basicblock *block, *finally; |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3131 identifier tmpvalue = NULL, tmpexit = NULL; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3132 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3133 assert(s->kind == With_kind); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3134 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3135 if (!enter_attr) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
3136 enter_attr = PyUnicode_InternFromString("__enter__"); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3137 if (!enter_attr) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3138 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3139 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3140 if (!exit_attr) { |
|
42013
cd125fe83051
Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents:
41878
diff
changeset
|
3141 exit_attr = PyUnicode_InternFromString("__exit__"); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3142 if (!exit_attr) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3143 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3144 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3145 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3146 block = compiler_new_block(c); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3147 finally = compiler_new_block(c); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3148 if (!block || !finally) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3149 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3150 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3151 if (s->v.With.optional_vars) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3152 /* Create a temporary variable to hold context.__enter__(). |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3153 We need to do this rather than preserving it on the stack |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3154 because SETUP_FINALLY remembers the stack level. |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3155 We need to do the assignment *inside* the try/finally |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3156 so that context.__exit__() is called when the assignment |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3157 fails. But we need to call context.__enter__() *before* |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3158 the try/finally so that if it fails we won't call |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3159 context.__exit__(). |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3160 */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3161 tmpvalue = compiler_new_tmpname(c); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3162 if (tmpvalue == NULL) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3163 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3164 PyArena_AddPyObject(c->c_arena, tmpvalue); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3165 } |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3166 tmpexit = compiler_new_tmpname(c); |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3167 if (tmpexit == NULL) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3168 return 0; |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3169 PyArena_AddPyObject(c->c_arena, tmpexit); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3170 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
3171 /* Evaluate EXPR */ |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3172 VISIT(c, expr, s->v.With.context_expr); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3173 |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45760
diff
changeset
|
3174 /* Squirrel away context.__exit__ by stuffing it under context */ |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3175 ADDOP(c, DUP_TOP); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3176 ADDOP_O(c, LOAD_ATTR, exit_attr, names); |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3177 if (!compiler_nameop(c, tmpexit, Store)) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3178 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3179 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3180 /* Call context.__enter__() */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3181 ADDOP_O(c, LOAD_ATTR, enter_attr, names); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3182 ADDOP_I(c, CALL_FUNCTION, 0); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3183 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3184 if (s->v.With.optional_vars) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3185 /* Store it in tmpvalue */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3186 if (!compiler_nameop(c, tmpvalue, Store)) |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3187 return 0; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3188 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3189 else { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3190 /* Discard result from context.__enter__() */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3191 ADDOP(c, POP_TOP); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3192 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3193 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3194 /* Start the try block */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3195 ADDOP_JREL(c, SETUP_FINALLY, finally); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3196 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3197 compiler_use_next_block(c, block); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3198 if (!compiler_push_fblock(c, FINALLY_TRY, block)) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3199 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3200 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3201 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3202 if (s->v.With.optional_vars) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3203 /* Bind saved result of context.__enter__() to VAR */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3204 if (!compiler_nameop(c, tmpvalue, Load) || |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3205 !compiler_nameop(c, tmpvalue, Del)) |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3206 return 0; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3207 VISIT(c, expr, s->v.With.optional_vars); |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3208 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3209 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3210 /* BLOCK code */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3211 VISIT_SEQ(c, stmt, s->v.With.body); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3212 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3213 /* End of try block; start the finally block */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3214 ADDOP(c, POP_BLOCK); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3215 compiler_pop_fblock(c, FINALLY_TRY, block); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3216 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3217 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3218 compiler_use_next_block(c, finally); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3219 if (!compiler_push_fblock(c, FINALLY_END, finally)) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3220 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3221 |
|
45773
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45760
diff
changeset
|
3222 /* Finally block starts; context.__exit__ is on the stack under |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45760
diff
changeset
|
3223 the exception or return information. Just issue our magic |
|
832c820e9d14
Merged revisions 61239-61249,61252-61257,61260-61264,61269-61275,61278-61279,61285-61286,61288-61290,61298,61303-61305,61312-61314,61317,61329,61332,61344,61350-61351,61363-61376,61378-61379,61382-61383,61387-61388,61392,61395-61396,61402-61403 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45760
diff
changeset
|
3224 opcode. */ |
|
47594
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3225 if (!compiler_nameop(c, tmpexit, Load) || |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3226 !compiler_nameop(c, tmpexit, Del)) |
|
212a1fee6bf9
#3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
3227 return 0; |
|
36695
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3228 ADDOP(c, WITH_CLEANUP); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3229 |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3230 /* Finally block ends. */ |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3231 ADDOP(c, END_FINALLY); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3232 compiler_pop_fblock(c, FINALLY_END, finally); |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3233 return 1; |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3234 } |
|
b6d2f6fd3e11
PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents:
36666
diff
changeset
|
3235 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3236 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3237 compiler_visit_expr(struct compiler *c, expr_ty e) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3238 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3239 int i, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3240 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3241 /* If expr e has a different line number than the last expr/stmt, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3242 set a new line number for the next instruction. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3243 */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3244 if (e->lineno > c->u->u_lineno) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3245 c->u->u_lineno = e->lineno; |
|
40941
2ca14d6a369b
Whoops, fix build breakage. There were still a few uses of the bool type.
Neal Norwitz <nnorwitz@gmail.com>
parents:
40894
diff
changeset
|
3246 c->u->u_lineno_set = 0; |
| 69 | 3247 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3248 switch (e->kind) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3249 case BoolOp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3250 return compiler_boolop(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3251 case BinOp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3252 VISIT(c, expr, e->v.BinOp.left); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3253 VISIT(c, expr, e->v.BinOp.right); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3254 ADDOP(c, binop(c, e->v.BinOp.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3255 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3256 case UnaryOp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3257 VISIT(c, expr, e->v.UnaryOp.operand); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3258 ADDOP(c, unaryop(e->v.UnaryOp.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3259 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3260 case Lambda_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3261 return compiler_lambda(c, e); |
|
36666
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
3262 case IfExp_kind: |
|
6165927431d6
PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
3263 return compiler_ifexp(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3264 case Dict_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3265 n = asdl_seq_LEN(e->v.Dict.values); |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
3266 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n)); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3267 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3268 VISIT(c, expr, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3269 (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3270 VISIT(c, expr, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3271 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); |
|
44349
4dc01402d78a
Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
3272 ADDOP(c, STORE_MAP); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3273 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3274 break; |
|
39693
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39676
diff
changeset
|
3275 case Set_kind: |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39676
diff
changeset
|
3276 n = asdl_seq_LEN(e->v.Set.elts); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39676
diff
changeset
|
3277 VISIT_SEQ(c, expr, e->v.Set.elts); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39676
diff
changeset
|
3278 ADDOP_I(c, BUILD_SET, n); |
|
d0b83c4630c0
SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents:
39676
diff
changeset
|
3279 break; |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3280 case GeneratorExp_kind: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3281 return compiler_genexp(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3282 case ListComp_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3283 return compiler_listcomp(c, e); |
|
41464
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3284 case SetComp_kind: |
|
060c79f6d919
Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents:
41273
diff
changeset
|
3285 return compiler_setcomp(c, e); |
|
42193
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3286 case DictComp_kind: |
|
090588a17490
Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
42089
diff
changeset
|
3287 return compiler_dictcomp(c, e); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3288 case Yield_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3289 if (c->u->u_ste->ste_type != FunctionBlock) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3290 return compiler_error(c, "'yield' outside function"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3291 if (e->v.Yield.value) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3292 VISIT(c, expr, e->v.Yield.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3293 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3294 else { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3295 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3296 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3297 ADDOP(c, YIELD_VALUE); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3298 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3299 case Compare_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3300 return compiler_compare(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3301 case Call_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3302 return compiler_call(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3303 case Num_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3304 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3305 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3306 case Str_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3307 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3308 break; |
| 40894 | 3309 case Bytes_kind: |
| 3310 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts); | |
| 3311 break; | |
|
39783
7a0ad110e91e
Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents:
39782
diff
changeset
|
3312 case Ellipsis_kind: |
|
7a0ad110e91e
Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents:
39782
diff
changeset
|
3313 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); |
|
7a0ad110e91e
Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents:
39782
diff
changeset
|
3314 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3315 /* The following exprs can be assignment targets. */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3316 case Attribute_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3317 if (e->v.Attribute.ctx != AugStore) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3318 VISIT(c, expr, e->v.Attribute.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3319 switch (e->v.Attribute.ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3320 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3321 ADDOP(c, DUP_TOP); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3322 /* Fall through to load */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3323 case Load: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3324 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3325 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3326 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3327 ADDOP(c, ROT_TWO); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3328 /* Fall through to save */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3329 case Store: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3330 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3331 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3332 case Del: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3333 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3334 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3335 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3336 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3337 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3338 "param invalid in attribute expression"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3339 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3340 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3341 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3342 case Subscript_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3343 switch (e->v.Subscript.ctx) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3344 case AugLoad: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3345 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3346 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3347 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3348 case Load: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3349 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3350 VISIT_SLICE(c, e->v.Subscript.slice, Load); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3351 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3352 case AugStore: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3353 VISIT_SLICE(c, e->v.Subscript.slice, AugStore); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3354 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3355 case Store: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3356 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3357 VISIT_SLICE(c, e->v.Subscript.slice, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3358 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3359 case Del: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3360 VISIT(c, expr, e->v.Subscript.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3361 VISIT_SLICE(c, e->v.Subscript.slice, Del); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3362 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3363 case Param: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3364 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3365 PyErr_SetString(PyExc_SystemError, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3366 "param invalid in subscript expression"); |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3367 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3368 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3369 break; |
|
41699
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3370 case Starred_kind: |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3371 switch (e->v.Starred.ctx) { |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3372 case Store: |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3373 /* In all legitimate cases, the Starred node was already replaced |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3374 * by compiler_list/compiler_tuple. XXX: is that okay? */ |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3375 return compiler_error(c, |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3376 "starred assignment target must be in a list or tuple"); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3377 default: |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3378 return compiler_error(c, |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3379 "can use starred expression only as assignment target"); |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3380 } |
|
e16c8e5c5ca4
Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
3381 break; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3382 case Name_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3383 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3384 /* child nodes of List and Tuple will have expr_context set */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3385 case List_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3386 return compiler_list(c, e); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3387 case Tuple_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3388 return compiler_tuple(c, e); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3389 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3390 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3391 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3392 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3393 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3394 compiler_augassign(struct compiler *c, stmt_ty s) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3395 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3396 expr_ty e = s->v.AugAssign.target; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3397 expr_ty auge; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3398 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3399 assert(s->kind == AugAssign_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3400 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3401 switch (e->kind) { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3402 case Attribute_kind: |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3403 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36766
diff
changeset
|
3404 AugLoad, e->lineno, e->col_offset, c->c_arena); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3405 if (auge == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3406 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3407 VISIT(c, expr, auge); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3408 VISIT(c, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3409 ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3410 auge->v.Attribute.ctx = AugStore; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3411 VISIT(c, expr, auge); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3412 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3413 case Subscript_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3414 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, |
|
36786
57322cb2ca11
Patch #1440601: Add col_offset attribute to AST nodes.
Martin v. Löwis <martin@v.loewis.de>
parents:
36766
diff
changeset
|
3415 AugLoad, e->lineno, e->col_offset, c->c_arena); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3416 if (auge == NULL) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3417 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3418 VISIT(c, expr, auge); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3419 VISIT(c, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3420 ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3421 auge->v.Subscript.ctx = AugStore; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3422 VISIT(c, expr, auge); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3423 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3424 case Name_kind: |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3425 if (!compiler_nameop(c, e->v.Name.id, Load)) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3426 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3427 VISIT(c, expr, s->v.AugAssign.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3428 ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3429 return compiler_nameop(c, e->v.Name.id, Store); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3430 default: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3431 PyErr_Format(PyExc_SystemError, |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3432 "invalid node type (%d) for augmented assignment", |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3433 e->kind); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3434 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3435 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3436 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3437 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3438 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3439 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3440 compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3441 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3442 struct fblockinfo *f; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3443 if (c->u->u_nfblocks >= CO_MAXBLOCKS) { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3444 PyErr_SetString(PyExc_SystemError, |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3445 "too many statically nested blocks"); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3446 return 0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3447 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3448 f = &c->u->u_fblock[c->u->u_nfblocks++]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3449 f->fb_type = t; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3450 f->fb_block = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3451 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3452 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3453 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3454 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3455 compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3456 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3457 struct compiler_unit *u = c->u; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3458 assert(u->u_nfblocks > 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3459 u->u_nfblocks--; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3460 assert(u->u_fblock[u->u_nfblocks].fb_type == t); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3461 assert(u->u_fblock[u->u_nfblocks].fb_block == b); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3462 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3463 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3464 static int |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3465 compiler_in_loop(struct compiler *c) { |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3466 int i; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3467 struct compiler_unit *u = c->u; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3468 for (i = 0; i < u->u_nfblocks; ++i) { |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3469 if (u->u_fblock[i].fb_type == LOOP) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3470 return 1; |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3471 } |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3472 return 0; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3473 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3474 /* Raises a SyntaxError and returns 0. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3475 If something goes wrong, a different exception may be raised. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3476 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3477 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3478 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3479 compiler_error(struct compiler *c, const char *errstr) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3480 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3481 PyObject *loc; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3482 PyObject *u = NULL, *v = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3483 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3484 loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3485 if (!loc) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3486 Py_INCREF(Py_None); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3487 loc = Py_None; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3488 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3489 u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3490 Py_None, loc); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3491 if (!u) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3492 goto exit; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3493 v = Py_BuildValue("(zO)", errstr, u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3494 if (!v) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3495 goto exit; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3496 PyErr_SetObject(PyExc_SyntaxError, v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3497 exit: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3498 Py_DECREF(loc); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3499 Py_XDECREF(u); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3500 Py_XDECREF(v); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3501 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3502 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3503 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3504 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3505 compiler_handle_subscr(struct compiler *c, const char *kind, |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3506 expr_context_ty ctx) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3507 { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3508 int op = 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3509 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3510 /* XXX this code is duplicated */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3511 switch (ctx) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3512 case AugLoad: /* fall through to Load */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3513 case Load: op = BINARY_SUBSCR; break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3514 case AugStore:/* fall through to Store */ |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3515 case Store: op = STORE_SUBSCR; break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3516 case Del: op = DELETE_SUBSCR; break; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3517 case Param: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3518 PyErr_Format(PyExc_SystemError, |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3519 "invalid %s kind %d in subscript\n", |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3520 kind, ctx); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3521 return 0; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3522 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3523 if (ctx == AugLoad) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3524 ADDOP_I(c, DUP_TOPX, 2); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3525 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3526 else if (ctx == AugStore) { |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3527 ADDOP(c, ROT_THREE); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3528 } |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3529 ADDOP(c, op); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3530 return 1; |
| 69 | 3531 } |
| 3532 | |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3533 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3534 compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3535 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3536 int n = 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3537 assert(s->kind == Slice_kind); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3538 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3539 /* only handles the cases where BUILD_SLICE is emitted */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3540 if (s->v.Slice.lower) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3541 VISIT(c, expr, s->v.Slice.lower); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3542 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3543 else { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3544 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3545 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3546 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3547 if (s->v.Slice.upper) { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3548 VISIT(c, expr, s->v.Slice.upper); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3549 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3550 else { |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3551 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3552 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3553 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3554 if (s->v.Slice.step) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3555 n++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3556 VISIT(c, expr, s->v.Slice.step); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3557 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3558 ADDOP_I(c, BUILD_SLICE, n); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3559 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3560 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3561 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3562 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3563 compiler_visit_nested_slice(struct compiler *c, slice_ty s, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3564 expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3565 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3566 switch (s->kind) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3567 case Slice_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3568 return compiler_slice(c, s, ctx); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3569 case Index_kind: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3570 VISIT(c, expr, s->v.Index.value); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3571 break; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3572 case ExtSlice_kind: |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3573 default: |
|
35893
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3574 PyErr_SetString(PyExc_SystemError, |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3575 "extended slice invalid in nested slice"); |
|
825655bfdf20
Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents:
35881
diff
changeset
|
3576 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3577 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3578 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3579 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3580 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3581 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3582 compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3583 { |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3584 char * kindname = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3585 switch (s->kind) { |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3586 case Index_kind: |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3587 kindname = "index"; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3588 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3589 VISIT(c, expr, s->v.Index.value); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3590 } |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3591 break; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3592 case Slice_kind: |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3593 kindname = "slice"; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3594 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3595 if (!compiler_slice(c, s, ctx)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3596 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3597 } |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3598 break; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3599 case ExtSlice_kind: |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3600 kindname = "extended slice"; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3601 if (ctx != AugStore) { |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3602 int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3603 for (i = 0; i < n; i++) { |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3604 slice_ty sub = (slice_ty)asdl_seq_GET( |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3605 s->v.ExtSlice.dims, i); |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3606 if (!compiler_visit_nested_slice(c, sub, ctx)) |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3607 return 0; |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3608 } |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3609 ADDOP_I(c, BUILD_TUPLE, n); |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3610 } |
|
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3611 break; |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3612 default: |
|
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3613 PyErr_Format(PyExc_SystemError, |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3614 "invalid subscript kind %d", s->kind); |
|
36079
8ebe34eb3eb7
Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents:
36076
diff
changeset
|
3615 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3616 } |
|
36965
9a08724110d0
Fix SF bug #1448804 and ad a test to ensure that all subscript operations continue to be handled correctly
Nick Coghlan <ncoghlan@gmail.com>
parents:
36926
diff
changeset
|
3617 return compiler_handle_subscr(c, kindname, ctx); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3618 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3619 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3620 /* End of the compiler section, beginning of the assembler section */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3621 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3622 /* do depth-first search of basic block graph, starting with block. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3623 post records the block indices in post-order. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3624 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3625 XXX must handle implicit jumps from one block to next |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
3626 */ |
|
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
3627 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3628 struct assembler { |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3629 PyObject *a_bytecode; /* string containing bytecode */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3630 int a_offset; /* offset into bytecode */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3631 int a_nblocks; /* number of reachable blocks */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3632 basicblock **a_postorder; /* list of blocks in dfs postorder */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3633 PyObject *a_lnotab; /* string containing lnotab */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3634 int a_lnotab_off; /* offset into lnotab */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3635 int a_lineno; /* last lineno of emitted instruction */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3636 int a_lineno_off; /* bytecode offset of last lineno */ |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3637 }; |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
40215
diff
changeset
|
3638 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3639 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3640 dfs(struct compiler *c, basicblock *b, struct assembler *a) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3641 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3642 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3643 struct instr *instr = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3644 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3645 if (b->b_seen) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3646 return; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3647 b->b_seen = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3648 if (b->b_next != NULL) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3649 dfs(c, b->b_next, a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3650 for (i = 0; i < b->b_iused; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3651 instr = &b->b_instr[i]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3652 if (instr->i_jrel || instr->i_jabs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3653 dfs(c, instr->i_target, a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3654 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3655 a->a_postorder[a->a_nblocks++] = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3656 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3657 |
|
35860
9b885c934144
make internal method static
Neal Norwitz <nnorwitz@gmail.com>
parents:
35797
diff
changeset
|
3658 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3659 stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3660 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3661 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3662 struct instr *instr; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3663 if (b->b_seen || b->b_startdepth >= depth) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3664 return maxdepth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3665 b->b_seen = 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3666 b->b_startdepth = depth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3667 for (i = 0; i < b->b_iused; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3668 instr = &b->b_instr[i]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3669 depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3670 if (depth > maxdepth) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3671 maxdepth = depth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3672 assert(depth >= 0); /* invalid code or bug in stackdepth() */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3673 if (instr->i_jrel || instr->i_jabs) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3674 maxdepth = stackdepth_walk(c, instr->i_target, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3675 depth, maxdepth); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3676 if (instr->i_opcode == JUMP_ABSOLUTE || |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3677 instr->i_opcode == JUMP_FORWARD) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3678 goto out; /* remaining code is dead */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3679 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3680 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3681 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3682 if (b->b_next) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3683 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3684 out: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3685 b->b_seen = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3686 return maxdepth; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3687 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3688 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3689 /* Find the flow path that needs the largest stack. We assume that |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3690 * cycles in the flow graph have no net effect on the stack depth. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3691 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3692 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3693 stackdepth(struct compiler *c) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3694 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3695 basicblock *b, *entryblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3696 entryblock = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3697 for (b = c->u->u_blocks; b != NULL; b = b->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3698 b->b_seen = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3699 b->b_startdepth = INT_MIN; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3700 entryblock = b; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3701 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3702 if (!entryblock) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3703 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3704 return stackdepth_walk(c, entryblock, 0, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3705 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3706 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3707 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3708 assemble_init(struct assembler *a, int nblocks, int firstlineno) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3709 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3710 memset(a, 0, sizeof(struct assembler)); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3711 a->a_lineno = firstlineno; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3712 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3713 if (!a->a_bytecode) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3714 return 0; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3715 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3716 if (!a->a_lnotab) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3717 return 0; |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3718 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) { |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3719 PyErr_NoMemory(); |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3720 return 0; |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3721 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3722 a->a_postorder = (basicblock **)PyObject_Malloc( |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3723 sizeof(basicblock *) * nblocks); |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3724 if (!a->a_postorder) { |
|
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3725 PyErr_NoMemory(); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3726 return 0; |
|
36076
aa7d7df853d5
Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents:
36065
diff
changeset
|
3727 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3728 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3729 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3730 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3731 static void |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3732 assemble_free(struct assembler *a) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3733 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3734 Py_XDECREF(a->a_bytecode); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3735 Py_XDECREF(a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3736 if (a->a_postorder) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3737 PyObject_Free(a->a_postorder); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3738 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3739 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3740 /* Return the size of a basic block in bytes. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3741 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3742 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3743 instrsize(struct instr *instr) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3744 { |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3745 if (!instr->i_hasarg) |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
3746 return 1; /* 1 byte for the opcode*/ |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3747 if (instr->i_oparg > 0xffff) |
|
44373
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
3748 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */ |
|
2750d531fdc0
Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44349
diff
changeset
|
3749 return 3; /* 1 (opcode) + 2 (oparg) */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3750 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3751 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3752 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3753 blocksize(basicblock *b) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3754 { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3755 int i; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3756 int size = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3757 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3758 for (i = 0; i < b->b_iused; i++) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3759 size += instrsize(&b->b_instr[i]); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3760 return size; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3761 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3762 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3763 /* All about a_lnotab. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3764 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3765 c_lnotab is an array of unsigned bytes disguised as a Python string. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3766 It is used to map bytecode offsets to source code line #s (when needed |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3767 for tracebacks). |
| 24844 | 3768 |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3769 The array is conceptually a list of |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3770 (bytecode offset increment, line number increment) |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3771 pairs. The details are important and delicate, best illustrated by example: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3772 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3773 byte code offset source code line number |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3774 0 1 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3775 6 2 |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3776 50 7 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3777 350 307 |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3778 361 308 |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3779 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3780 The first trick is that these numbers aren't stored, only the increments |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3781 from one row to the next (this doesn't really work, but it's a start): |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3782 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3783 0, 1, 6, 1, 44, 5, 300, 300, 11, 1 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3784 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3785 The second trick is that an unsigned byte can't hold negative values, or |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3786 values larger than 255, so (a) there's a deep assumption that byte code |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3787 offsets and their corresponding line #s both increase monotonically, and (b) |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3788 if at least one column jumps by more than 255 from one row to the next, more |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3789 than one pair is written to the table. In case #b, there's no way to know |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3790 from looking at the table later how many were written. That's the delicate |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3791 part. A user of c_lnotab desiring to find the source line number |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3792 corresponding to a bytecode address A should do something like this |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3793 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3794 lineno = addr = 0 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3795 for addr_incr, line_incr in c_lnotab: |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3796 addr += addr_incr |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3797 if addr > A: |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3798 return lineno |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3799 lineno += line_incr |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3800 |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3801 In order for this to work, when the addr field increments by more than 255, |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3802 the line # increment in each pair generated must be 0 until the remaining addr |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3803 increment is < 256. So, in the example above, assemble_lnotab (it used |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3804 to be called com_set_lineno) should not (as was actually done until 2.2) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3805 expand 300, 300 to 255, 255, 45, 45, |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41464
diff
changeset
|
3806 but to 255, 0, 45, 255, 0, 45. |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3807 */ |
|
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3808 |
|
17518
f939ce52a734
Make some private symbols static.
Guido van Rossum <guido@python.org>
parents:
17355
diff
changeset
|
3809 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3810 assemble_lnotab(struct assembler *a, struct instr *i) |
| 69 | 3811 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3812 int d_bytecode, d_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3813 int len; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3814 unsigned char *lnotab; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3815 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3816 d_bytecode = a->a_offset - a->a_lineno_off; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3817 d_lineno = i->i_lineno - a->a_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3818 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3819 assert(d_bytecode >= 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3820 assert(d_lineno >= 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3821 |
|
45192
142a11b3057e
Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
45082
diff
changeset
|
3822 if(d_bytecode == 0 && d_lineno == 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3823 return 1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3824 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3825 if (d_bytecode > 255) { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
3826 int j, nbytes, ncodes = d_bytecode / 255; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3827 nbytes = a->a_lnotab_off + 2 * ncodes; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3828 len = PyBytes_GET_SIZE(a->a_lnotab); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3829 if (nbytes >= len) { |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3830 if ((len <= INT_MAX / 2) && (len * 2 < nbytes)) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3831 len = nbytes; |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3832 else if (len <= INT_MAX / 2) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3833 len *= 2; |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3834 else { |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3835 PyErr_NoMemory(); |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3836 return 0; |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3837 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3838 if (_PyBytes_Resize(&a->a_lnotab, len) < 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3839 return 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3840 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3841 lnotab = (unsigned char *) |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3842 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
3843 for (j = 0; j < ncodes; j++) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3844 *lnotab++ = 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3845 *lnotab++ = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3846 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3847 d_bytecode -= ncodes * 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3848 a->a_lnotab_off += ncodes * 2; |
|
5041
c497929b2371
Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents:
5011
diff
changeset
|
3849 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3850 assert(d_bytecode <= 255); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3851 if (d_lineno > 255) { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
3852 int j, nbytes, ncodes = d_lineno / 255; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3853 nbytes = a->a_lnotab_off + 2 * ncodes; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3854 len = PyBytes_GET_SIZE(a->a_lnotab); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3855 if (nbytes >= len) { |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3856 if ((len <= INT_MAX / 2) && len * 2 < nbytes) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3857 len = nbytes; |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3858 else if (len <= INT_MAX / 2) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3859 len *= 2; |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3860 else { |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3861 PyErr_NoMemory(); |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3862 return 0; |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3863 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3864 if (_PyBytes_Resize(&a->a_lnotab, len) < 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3865 return 0; |
|
18065
889db6d55506
SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents:
17736
diff
changeset
|
3866 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3867 lnotab = (unsigned char *) |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3868 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3869 *lnotab++ = d_bytecode; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3870 *lnotab++ = 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3871 d_bytecode = 0; |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
3872 for (j = 1; j < ncodes; j++) { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
3873 *lnotab++ = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3874 *lnotab++ = 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3875 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3876 d_lineno -= ncodes * 255; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3877 a->a_lnotab_off += ncodes * 2; |
|
14147
21ec69a56228
Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents:
14117
diff
changeset
|
3878 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3879 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3880 len = PyBytes_GET_SIZE(a->a_lnotab); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3881 if (a->a_lnotab_off + 2 >= len) { |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3882 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3883 return 0; |
| 69 | 3884 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
37057
diff
changeset
|
3885 lnotab = (unsigned char *) |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3886 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3887 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3888 a->a_lnotab_off += 2; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3889 if (d_bytecode) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3890 *lnotab++ = d_bytecode; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3891 *lnotab++ = d_lineno; |
|
73
3028acaa56b0
Compile class definitions.
Guido van Rossum <guido@python.org>
parents:
69
diff
changeset
|
3892 } |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3893 else { /* First line of a block; def stmt, etc. */ |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3894 *lnotab++ = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3895 *lnotab++ = d_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3896 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3897 a->a_lineno = i->i_lineno; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3898 a->a_lineno_off = a->a_offset; |
|
4129
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
3899 return 1; |
|
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
3900 } |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
3901 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3902 /* assemble_emit() |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3903 Extend the bytecode with a new instruction. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3904 Update lnotab if necessary. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3905 */ |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
3906 |
|
24855
bed5d5e536bc
Add warnings for assignment or deletion of variables and attributes
Guido van Rossum <guido@python.org>
parents:
24854
diff
changeset
|
3907 static int |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3908 assemble_emit(struct assembler *a, struct instr *i) |
| 69 | 3909 { |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3910 int size, arg = 0, ext = 0; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3911 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3912 char *code; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3913 |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3914 size = instrsize(i); |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3915 if (i->i_hasarg) { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3916 arg = i->i_oparg; |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3917 ext = arg >> 16; |
|
32121
302d399cfd37
SF patch #872326: Generator expression implementation
Raymond Hettinger <python@rcn.com>
parents:
31764
diff
changeset
|
3918 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3919 if (i->i_lineno && !assemble_lnotab(a, i)) |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3920 return 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3921 if (a->a_offset + size >= len) { |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3922 if (len > PY_SSIZE_T_MAX / 2) |
|
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47594
diff
changeset
|
3923 return 0; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3924 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3925 return 0; |
|
2813
999b5bdc18ce
3rd arg for raise; INCOMPLETE keyword parameter passing (currently f(kw=value) is seen as f('kw', value))
Guido van Rossum <guido@python.org>
parents:
2367
diff
changeset
|
3926 } |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
3927 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3928 a->a_offset += size; |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3929 if (size == 6) { |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3930 assert(i->i_hasarg); |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3931 *code++ = (char)EXTENDED_ARG; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3932 *code++ = ext & 0xff; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3933 *code++ = ext >> 8; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3934 arg &= 0xffff; |
|
4991
8276916e1ea8
Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents:
4905
diff
changeset
|
3935 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3936 *code++ = i->i_opcode; |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3937 if (i->i_hasarg) { |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3938 assert(size == 3 || size == 6); |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3939 *code++ = arg & 0xff; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3940 *code++ = arg >> 8; |
|
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3941 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3942 return 1; |
|
19187
30f8b654c2e5
SF Patch [ 429024 ] deal with some unary ops at compile time
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19177
diff
changeset
|
3943 } |
|
30f8b654c2e5
SF Patch [ 429024 ] deal with some unary ops at compile time
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
19177
diff
changeset
|
3944 |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3945 static void |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3946 assemble_jump_offsets(struct assembler *a, struct compiler *c) |
| 69 | 3947 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3948 basicblock *b; |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3949 int bsize, totsize, extended_arg_count, last_extended_arg_count = 0; |
|
5233
b749d2dd7582
Added assert statement.
Guido van Rossum <guido@python.org>
parents:
5197
diff
changeset
|
3950 int i; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3951 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3952 /* Compute the size of each block and fixup jump args. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3953 Replace block pointer with position in bytecode. */ |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3954 start: |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3955 totsize = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3956 for (i = a->a_nblocks - 1; i >= 0; i--) { |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
3957 b = a->a_postorder[i]; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3958 bsize = blocksize(b); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3959 b->b_offset = totsize; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3960 totsize += bsize; |
| 86 | 3961 } |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3962 extended_arg_count = 0; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3963 for (b = c->u->u_blocks; b != NULL; b = b->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3964 bsize = b->b_offset; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3965 for (i = 0; i < b->b_iused; i++) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3966 struct instr *instr = &b->b_instr[i]; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3967 /* Relative jumps are computed relative to |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3968 the instruction pointer after fetching |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3969 the jump instruction. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3970 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3971 bsize += instrsize(instr); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3972 if (instr->i_jabs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3973 instr->i_oparg = instr->i_target->b_offset; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3974 else if (instr->i_jrel) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3975 int delta = instr->i_target->b_offset - bsize; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
3976 instr->i_oparg = delta; |
|
18333
41243cb4ea05
Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents:
18274
diff
changeset
|
3977 } |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3978 else |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3979 continue; |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3980 if (instr->i_oparg > 0xffff) |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3981 extended_arg_count++; |
|
18333
41243cb4ea05
Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents:
18274
diff
changeset
|
3982 } |
|
41243cb4ea05
Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents:
18274
diff
changeset
|
3983 } |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3984 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3985 /* XXX: This is an awful hack that could hurt performance, but |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3986 on the bright side it should work until we come up |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3987 with a better solution. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3988 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3989 In the meantime, should the goto be dropped in favor |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3990 of a loop? |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3991 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3992 The issue is that in the first loop blocksize() is called |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3993 which calls instrsize() which requires i_oparg be set |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
3994 appropriately. There is a bootstrap problem because |
|
35790
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3995 i_oparg is calculated in the second loop above. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3996 |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3997 So we loop until we stop seeing new EXTENDED_ARGs. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3998 The only EXTENDED_ARGs that could be popping up are |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
3999 ones in jump instructions. So this should converge |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4000 fairly quickly. |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4001 */ |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4002 if (last_extended_arg_count != extended_arg_count) { |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4003 last_extended_arg_count = extended_arg_count; |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4004 goto start; |
|
f7b0cbea905b
Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents:
35789
diff
changeset
|
4005 } |
| 69 | 4006 } |
| 4007 | |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4008 static PyObject * |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4009 dict_keys_inorder(PyObject *dict, int offset) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4010 { |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4011 PyObject *tuple, *k, *v; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36225
diff
changeset
|
4012 Py_ssize_t i, pos = 0, size = PyDict_Size(dict); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4013 |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4014 tuple = PyTuple_New(size); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4015 if (tuple == NULL) |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4016 return NULL; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4017 while (PyDict_Next(dict, &pos, &k, &v)) { |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
43777
diff
changeset
|
4018 i = PyLong_AS_LONG(v); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4019 k = PyTuple_GET_ITEM(k, 0); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4020 Py_INCREF(k); |
|
17078
7e181eba6b9b
Fixup handling of free variables in methods when the class scope also
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17076
diff
changeset
|
4021 assert((i - offset) < size); |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4022 assert((i - offset) >= 0); |
|
16257
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4023 PyTuple_SET_ITEM(tuple, i - offset, k); |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4024 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4025 return tuple; |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4026 } |
|
fd8c7203251f
PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16250
diff
changeset
|
4027 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4028 static int |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4029 compute_code_flags(struct compiler *c) |
|
16421
aa844711463a
Move a bunch of definitions that were internal to compile.c to
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16408
diff
changeset
|
4030 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4031 PySTEntryObject *ste = c->u->u_ste; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4032 int flags = 0, n; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4033 if (ste->ste_type != ModuleBlock) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4034 flags |= CO_NEWLOCALS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4035 if (ste->ste_type == FunctionBlock) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4036 if (!ste->ste_unoptimized) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4037 flags |= CO_OPTIMIZED; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4038 if (ste->ste_nested) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4039 flags |= CO_NESTED; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4040 if (ste->ste_generator) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4041 flags |= CO_GENERATOR; |
|
20867
40a88989d6cb
Part of SF bug #478003 possible memory leaks in err handling.
Tim Peters <tim.peters@gmail.com>
parents:
20517
diff
changeset
|
4042 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4043 if (ste->ste_varargs) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4044 flags |= CO_VARARGS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4045 if (ste->ste_varkeywords) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4046 flags |= CO_VARKEYWORDS; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4047 if (ste->ste_generator) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4048 flags |= CO_GENERATOR; |
|
36729
d6cbc71b8010
Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents:
36726
diff
changeset
|
4049 |
|
d6cbc71b8010
Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents:
36726
diff
changeset
|
4050 /* (Only) inherit compilerflags in PyCF_MASK */ |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4051 flags |= (c->c_flags->cf_flags & PyCF_MASK); |
|
36729
d6cbc71b8010
Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents:
36726
diff
changeset
|
4052 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4053 n = PyDict_Size(c->u->u_freevars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4054 if (n < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4055 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4056 if (n == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4057 n = PyDict_Size(c->u->u_cellvars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4058 if (n < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4059 return -1; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4060 if (n == 0) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4061 flags |= CO_NOFREE; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4062 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4063 } |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4064 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4065 return flags; |
|
4129
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4066 } |
|
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4067 |
|
5373
5880384d7c71
Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents:
5287
diff
changeset
|
4068 static PyCodeObject * |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4069 makecode(struct compiler *c, struct assembler *a) |
|
4129
eedaa59341b9
Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents:
4003
diff
changeset
|
4070 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4071 PyObject *tmp; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4072 PyCodeObject *co = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4073 PyObject *consts = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4074 PyObject *names = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4075 PyObject *varnames = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4076 PyObject *filename = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4077 PyObject *name = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4078 PyObject *freevars = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4079 PyObject *cellvars = NULL; |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4080 PyObject *bytecode = NULL; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4081 int nlocals, flags; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4082 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4083 tmp = dict_keys_inorder(c->u->u_consts, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4084 if (!tmp) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4085 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4086 consts = PySequence_List(tmp); /* optimize_code requires a list */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4087 Py_DECREF(tmp); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4088 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4089 names = dict_keys_inorder(c->u->u_names, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4090 varnames = dict_keys_inorder(c->u->u_varnames, 0); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4091 if (!consts || !names || !varnames) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4092 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4093 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4094 cellvars = dict_keys_inorder(c->u->u_cellvars, 0); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4095 if (!cellvars) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4096 goto error; |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4097 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4098 if (!freevars) |
|
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4099 goto error; |
|
43569
19319e70fc3e
Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents:
43410
diff
changeset
|
4100 filename = PyUnicode_DecodeFSDefault(c->c_filename); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4101 if (!filename) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4102 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4103 |
|
36766
1daa199b784b
Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
36729
diff
changeset
|
4104 nlocals = PyDict_Size(c->u->u_varnames); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4105 flags = compute_code_flags(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4106 if (flags < 0) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4107 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4108 |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
4109 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4110 if (!bytecode) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4111 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4112 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4113 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4114 if (!tmp) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4115 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4116 Py_DECREF(consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4117 consts = tmp; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4118 |
|
40215
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
4119 co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount, |
|
1cce0526d9b0
Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents:
39783
diff
changeset
|
4120 nlocals, stackdepth(c), flags, |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4121 bytecode, consts, names, varnames, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4122 freevars, cellvars, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4123 filename, c->u->u_name, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4124 c->u->u_firstlineno, |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4125 a->a_lnotab); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4126 error: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4127 Py_XDECREF(consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4128 Py_XDECREF(names); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4129 Py_XDECREF(varnames); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4130 Py_XDECREF(filename); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4131 Py_XDECREF(name); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4132 Py_XDECREF(freevars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4133 Py_XDECREF(cellvars); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4134 Py_XDECREF(bytecode); |
| 69 | 4135 return co; |
| 4136 } | |
|
5041
c497929b2371
Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents:
5011
diff
changeset
|
4137 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4138 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4139 /* For debugging purposes only */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4140 #if 0 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4141 static void |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4142 dump_instr(const struct instr *i) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4143 { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4144 const char *jrel = i->i_jrel ? "jrel " : ""; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4145 const char *jabs = i->i_jabs ? "jabs " : ""; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4146 char arg[128]; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4147 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4148 *arg = '\0'; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4149 if (i->i_hasarg) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4150 sprintf(arg, "arg: %d ", i->i_oparg); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4151 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4152 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n", |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4153 i->i_lineno, i->i_opcode, arg, jabs, jrel); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4154 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4155 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4156 static void |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4157 dump_basicblock(const basicblock *b) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4158 { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4159 const char *seen = b->b_seen ? "seen " : ""; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4160 const char *b_return = b->b_return ? "return " : ""; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4161 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n", |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4162 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4163 if (b->b_instr) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4164 int i; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4165 for (i = 0; i < b->b_iused; i++) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4166 fprintf(stderr, " [%02d] ", i); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4167 dump_instr(b->b_instr + i); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4168 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4169 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4170 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4171 #endif |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4172 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4173 static PyCodeObject * |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4174 assemble(struct compiler *c, int addNone) |
|
16781
5a1230de436a
Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16763
diff
changeset
|
4175 { |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4176 basicblock *b, *entryblock; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4177 struct assembler a; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4178 int i, j, nblocks; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4179 PyCodeObject *co = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4180 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4181 /* Make sure every block that falls off the end returns None. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4182 XXX NEXT_BLOCK() isn't quite right, because if the last |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4183 block ends with a jump or return b_next shouldn't set. |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4184 */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4185 if (!c->u->u_curblock->b_return) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4186 NEXT_BLOCK(c); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4187 if (addNone) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4188 ADDOP_O(c, LOAD_CONST, Py_None, consts); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4189 ADDOP(c, RETURN_VALUE); |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4190 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4191 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4192 nblocks = 0; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4193 entryblock = NULL; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4194 for (b = c->u->u_blocks; b != NULL; b = b->b_list) { |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4195 nblocks++; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4196 entryblock = b; |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4197 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4198 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4199 /* Set firstlineno if it wasn't explicitly set. */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4200 if (!c->u->u_firstlineno) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4201 if (entryblock && entryblock->b_instr) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4202 c->u->u_firstlineno = entryblock->b_instr->i_lineno; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4203 else |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4204 c->u->u_firstlineno = 1; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38673
diff
changeset
|
4205 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4206 if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4207 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4208 dfs(c, entryblock, &a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4209 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4210 /* Can't modify the bytecode after computing jump offsets. */ |
|
35789
19a37a9f4ef9
cleanup a bit and reuse instrsize (instruction size). working towards fixing problems with EXTENDED_ARG
Neal Norwitz <nnorwitz@gmail.com>
parents:
35781
diff
changeset
|
4211 assemble_jump_offsets(&a, c); |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4212 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4213 /* Emit code in reverse postorder from dfs. */ |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4214 for (i = a.a_nblocks - 1; i >= 0; i--) { |
|
36225
56ad9f275bec
Fix icc warnings: single bit fields should be unsigned, shadowing local variables
Neal Norwitz <nnorwitz@gmail.com>
parents:
36173
diff
changeset
|
4215 b = a.a_postorder[i]; |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4216 for (j = 0; j < b->b_iused; j++) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4217 if (!assemble_emit(&a, &b->b_instr[j])) |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4218 goto error; |
|
16394
f700e6b8de1f
Undo recent change that banned using import to bind a global, as per
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16357
diff
changeset
|
4219 } |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4220 |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
4221 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4222 goto error; |
|
47301
23ab586c427a
Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents:
47082
diff
changeset
|
4223 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0) |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4224 goto error; |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4225 |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4226 co = makecode(c, &a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4227 error: |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4228 assemble_free(&a); |
|
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
35310
diff
changeset
|
4229 return co; |
|
16015
c832ef72499d
This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
16006
diff
changeset
|
4230 } |
