annotate Python/compile.c @ 50619:2ff9910f1526

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:02:24 +0000
parents bcdfdc369570
children 9f45fa27b838
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
25
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
26 #include "Python-ast.h"
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
356887410bde Fix bug
Michael W. Hudson <mwh@python.net>
parents: 32977
diff changeset
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
e0a77010d033 Fix assertions.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
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
e0a77010d033 Fix assertions.
Thomas Wouters <thomas@python.org>
parents: 36695
diff changeset
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
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:
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
710 return -1;
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
711 case MAP_ADD:
36824
07f330ad1b47 SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36804
diff changeset
712 return -2;
07f330ad1b47 SF bug 1442442: LIST_APPEND optimization got lost in the AST merge.
Neal Norwitz <nnorwitz@gmail.com>
parents: 36804
diff changeset
713
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
714 case BINARY_POWER:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
715 case BINARY_MULTIPLY:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
716 case BINARY_MODULO:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
717 case BINARY_ADD:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
718 case BINARY_SUBTRACT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
719 case BINARY_SUBSCR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
720 case BINARY_FLOOR_DIVIDE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
721 case BINARY_TRUE_DIVIDE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
722 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
723 case INPLACE_FLOOR_DIVIDE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
724 case INPLACE_TRUE_DIVIDE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
725 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
726
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
727 case INPLACE_ADD:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
728 case INPLACE_SUBTRACT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
729 case INPLACE_MULTIPLY:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
730 case INPLACE_MODULO:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
731 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
732 case STORE_SUBSCR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
733 return -3;
44349
4dc01402d78a Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
734 case STORE_MAP:
4dc01402d78a Merged revisions 59541-59561 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44099
diff changeset
735 return -2;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
736 case DELETE_SUBSCR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
737 return -2;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
738
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
739 case BINARY_LSHIFT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
740 case BINARY_RSHIFT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
741 case BINARY_AND:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
742 case BINARY_XOR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
743 case BINARY_OR:
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 INPLACE_POWER:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
746 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
747 case GET_ITER:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
748 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
749
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
750 case PRINT_EXPR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
751 return -1;
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
752 case LOAD_BUILD_CLASS:
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
753 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
754 case INPLACE_LSHIFT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
755 case INPLACE_RSHIFT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
756 case INPLACE_AND:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
757 case INPLACE_XOR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
758 case INPLACE_OR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
759 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
760 case BREAK_LOOP:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
761 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
762 case WITH_CLEANUP:
36926
fc10ff322df1 Um, I thought I'd already checked this in.
Guido van Rossum <guido@python.org>
parents: 36824
diff changeset
763 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
764 case STORE_LOCALS:
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
765 return -1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
766 case RETURN_VALUE:
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 IMPORT_STAR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
769 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
770 case YIELD_VALUE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
771 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
772
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
773 case POP_BLOCK:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
774 return 0;
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
775 case POP_EXCEPT:
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
776 return 0; /* -3 except if bad bytecode */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
777 case END_FINALLY:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
778 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
779
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
780 case STORE_NAME:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
781 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
782 case DELETE_NAME:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
783 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
784 case UNPACK_SEQUENCE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
785 return oparg-1;
41699
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
786 case UNPACK_EX:
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
787 return (oparg&0xFF) + (oparg>>8);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
788 case FOR_ITER:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
789 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
790
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
791 case STORE_ATTR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
792 return -2;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
793 case DELETE_ATTR:
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 STORE_GLOBAL:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
796 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
797 case DELETE_GLOBAL:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
798 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
799 case DUP_TOPX:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
800 return oparg;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
801 case LOAD_CONST:
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 LOAD_NAME:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
804 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
805 case BUILD_TUPLE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
806 case BUILD_LIST:
39693
d0b83c4630c0 SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents: 39676
diff changeset
807 case BUILD_SET:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
808 return 1-oparg;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
809 case BUILD_MAP:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
810 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
811 case LOAD_ATTR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
812 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
813 case COMPARE_OP:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
814 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
815 case IMPORT_NAME:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
816 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
817 case IMPORT_FROM:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
818 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
819
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
820 case JUMP_FORWARD:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
821 case JUMP_IF_FALSE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
822 case JUMP_IF_TRUE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
823 case JUMP_ABSOLUTE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
824 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
825
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
826 case LOAD_GLOBAL:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
827 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
828
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
829 case CONTINUE_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_LOOP:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
832 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
833 case SETUP_EXCEPT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
834 case SETUP_FINALLY:
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
835 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
836 + 3 others for the previous exception state */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
837
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
838 case LOAD_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 STORE_FAST:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
841 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
842 case DELETE_FAST:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
843 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
844
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
845 case RAISE_VARARGS:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
846 return -oparg;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
847 #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
848 case CALL_FUNCTION:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
849 return -NARGS(oparg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
850 case CALL_FUNCTION_VAR:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
851 case CALL_FUNCTION_KW:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
852 return -NARGS(oparg)-1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
853 case CALL_FUNCTION_VAR_KW:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
854 return -NARGS(oparg)-2;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
855 case MAKE_FUNCTION:
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
856 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
857 case MAKE_CLOSURE:
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
858 return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
859 #undef NARGS
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
860 case BUILD_SLICE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
861 if (oparg == 3)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
862 return -2;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
863 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
864 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
865
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
866 case LOAD_CLOSURE:
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 LOAD_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 case STORE_DEREF:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
871 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
872 default:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
873 fprintf(stderr, "opcode = %d\n", opcode);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
874 Py_FatalError("opcode_stack_effect()");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
875
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 return 0; /* not reachable */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
878 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
879
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
880 /* Add an opcode with no argument.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
881 Returns 0 on failure, 1 on success.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
882 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
883
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
884 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
885 compiler_addop(struct compiler *c, int opcode)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
886 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
887 basicblock *b;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
888 struct instr *i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
889 int off;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
890 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
891 if (off < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
892 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
893 b = c->u->u_curblock;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
894 i = &b->b_instr[off];
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
895 i->i_opcode = opcode;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
896 i->i_hasarg = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
897 if (opcode == RETURN_VALUE)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
898 b->b_return = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
899 compiler_set_lineno(c, off);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
900 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
901 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
902
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
903 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
904 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
905 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
906 PyObject *t, *v;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36225
diff changeset
907 Py_ssize_t arg;
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
908 unsigned char *p, *q;
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
909 Py_complex z;
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
910 double d;
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
911 int real_part_zero, imag_part_zero;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
912
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
913 /* 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
914 /* _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
915 if (PyFloat_Check(o)) {
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
916 d = PyFloat_AS_DOUBLE(o);
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
917 p = (unsigned char*) &d;
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
918 /* 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
919 * 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
920 */
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
921 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
922 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
923 else
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
924 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
925 }
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
926 else if (PyComplex_Check(o)) {
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
927 /* 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
928 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
929 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
930 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
931 distinguished.*/
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
932 z = PyComplex_AsCComplex(o);
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
933 p = (unsigned char*) &(z.real);
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
934 q = (unsigned char*) &(z.imag);
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
935 /* 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
936 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
937 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
938 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
939 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
940 imag_part_zero. */
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
941 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
942 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
943 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
944 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
945 }
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
946 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
947 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
948 }
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
949 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
950 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
951 }
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
952 else {
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
953 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
954 }
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
955 }
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
956 else {
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
957 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
958 }
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
959 if (t == NULL)
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
960 return -1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
961
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
962 v = PyDict_GetItem(dict, t);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
963 if (!v) {
39637
472ca7006f70 Check for exceptions set by PyDict_GetItem().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 39610
diff changeset
964 if (PyErr_Occurred())
472ca7006f70 Check for exceptions set by PyDict_GetItem().
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 39610
diff changeset
965 return -1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
966 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
967 v = PyLong_FromLong(arg);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
968 if (!v) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
969 Py_DECREF(t);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
970 return -1;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
971 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
972 if (PyDict_SetItem(dict, t, v) < 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
973 Py_DECREF(t);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
974 Py_DECREF(v);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
975 return -1;
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 Py_DECREF(v);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
978 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
979 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
980 arg = PyLong_AsLong(v);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
981 Py_DECREF(t);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
982 return arg;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
983 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
984
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
985 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
986 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
987 PyObject *o)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
988 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
989 int arg = compiler_add_o(c, dict, o);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
990 if (arg < 0)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
991 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
992 return compiler_addop_i(c, opcode, arg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
993 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
994
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
995 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
996 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
997 PyObject *o)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
998 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
999 int arg;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1000 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
1001 if (!mangled)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1002 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1003 arg = compiler_add_o(c, dict, mangled);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1004 Py_DECREF(mangled);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1005 if (arg < 0)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1006 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1007 return compiler_addop_i(c, opcode, arg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1008 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1009
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1010 /* Add an opcode with an integer argument.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1011 Returns 0 on failure, 1 on success.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1012 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1013
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1014 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1015 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
1016 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1017 struct instr *i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1018 int off;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1019 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
1020 if (off < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1021 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1022 i = &c->u->u_curblock->b_instr[off];
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1023 i->i_opcode = opcode;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1024 i->i_oparg = oparg;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1025 i->i_hasarg = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1026 compiler_set_lineno(c, off);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1027 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1028 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1029
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1030 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1031 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
1032 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1033 struct instr *i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1034 int off;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1035
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1036 assert(b != NULL);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1037 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
1038 if (off < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1039 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1040 i = &c->u->u_curblock->b_instr[off];
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1041 i->i_opcode = opcode;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1042 i->i_target = b;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1043 i->i_hasarg = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1044 if (absolute)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1045 i->i_jabs = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1046 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1047 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
1048 compiler_set_lineno(c, off);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1049 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1050 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1051
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1052 /* 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
1053 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
1054 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
1055 from the current block to the new block.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1056 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1057
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1058 /* 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
1059 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
1060 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1061
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1062
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1063 #define NEW_BLOCK(C) { \
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1064 if (compiler_use_new_block((C)) == NULL) \
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1065 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1066 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1067
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1068 #define NEXT_BLOCK(C) { \
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1069 if (compiler_next_block((C)) == NULL) \
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1070 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1071 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1072
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1073 #define ADDOP(C, OP) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1074 if (!compiler_addop((C), (OP))) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1075 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1076 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1077
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1078 #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
1079 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
1080 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
1081 return 0; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1082 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1083 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1084
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1085 #define ADDOP_O(C, OP, O, TYPE) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1086 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
1087 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1088 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1089
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1090 #define ADDOP_NAME(C, OP, O, TYPE) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1091 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
1092 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1093 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1094
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1095 #define ADDOP_I(C, OP, O) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1096 if (!compiler_addop_i((C), (OP), (O))) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1097 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1098 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1099
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1100 #define ADDOP_JABS(C, OP, O) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1101 if (!compiler_addop_j((C), (OP), (O), 1)) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1102 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1103 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1104
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1105 #define ADDOP_JREL(C, OP, O) { \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1106 if (!compiler_addop_j((C), (OP), (O), 0)) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1107 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1108 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1109
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1110 /* 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
1111 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
1112 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1113
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1114 #define VISIT(C, TYPE, V) {\
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1115 if (!compiler_visit_ ## TYPE((C), (V))) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1116 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1117 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1118
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1119 #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
1120 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
1121 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
1122 return 0; \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1123 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1124 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1125
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1126 #define VISIT_SLICE(C, V, CTX) {\
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1127 if (!compiler_visit_slice((C), (V), (CTX))) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1128 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1129 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1130
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1131 #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
1132 int _i; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1133 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
1134 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
1135 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
1136 if (!compiler_visit_ ## TYPE((C), elt)) \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1137 return 0; \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1138 } \
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1139 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1140
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1141 #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
1142 int _i; \
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1143 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
1144 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
1145 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
1146 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
1147 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
1148 return 0; \
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 } \
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1151 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1152
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1153 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1154 compiler_isdocstring(stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1155 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1156 if (s->kind != Expr_kind)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1157 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1158 return s->v.Expr.value->kind == Str_kind;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1159 }
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 /* 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
1162
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1163 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1164 compiler_body(struct compiler *c, asdl_seq *stmts)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1165 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1166 int i = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1167 stmt_ty st;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1168
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1169 if (!asdl_seq_LEN(stmts))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1170 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
1171 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
1172 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
1173 /* don't generate docstrings if -OO */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1174 i = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1175 VISIT(c, expr, st->v.Expr.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1176 if (!compiler_nameop(c, __doc__, Store))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1177 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1178 }
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1179 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
1180 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
1181 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1182 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1183
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1184 static PyCodeObject *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1185 compiler_mod(struct compiler *c, mod_ty mod)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1186 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1187 PyCodeObject *co;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1188 int addNone = 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1189 static PyObject *module;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1190 if (!module) {
45029
ef2d3bf8383d Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
1191 module = PyUnicode_InternFromString("<module>");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1192 if (!module)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1193 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1194 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
1195 /* 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
1196 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
1197 return NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1198 switch (mod->kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1199 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
1200 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
1201 compiler_exit_scope(c);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1202 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
1203 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1204 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1205 case Interactive_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1206 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
1207 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
1208 mod->v.Interactive.body);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1209 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1210 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
1211 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
1212 addNone = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1213 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1214 case Suite_kind:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1215 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1216 "suite should not be possible");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1217 return 0;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1218 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1219 PyErr_Format(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1220 "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
1221 mod->kind);
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1222 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1223 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1224 co = assemble(c, addNone);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1225 compiler_exit_scope(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1226 return co;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1227 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1228
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1229 /* 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
1230 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
1231 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
1232 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1233
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1234 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1235 get_ref_type(struct compiler *c, PyObject *name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1236 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1237 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
1238 if (scope == 0) {
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1239 char buf[350];
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1240 PyOS_snprintf(buf, sizeof(buf),
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1241 "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
1242 "symbols: %s\nlocals: %s\nglobals: %s\n",
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
1243 PyBytes_AS_STRING(name),
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
1244 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
1245 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
1246 c->c_filename,
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1247 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
1248 PyObject_REPR(c->u->u_varnames),
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1249 PyObject_REPR(c->u->u_names)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1250 );
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1251 Py_FatalError(buf);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1252 }
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1253
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1254 return scope;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1255 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1256
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1257 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1258 compiler_lookup_arg(PyObject *dict, PyObject *name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1259 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1260 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
1261 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
1262 if (k == NULL)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1263 return -1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1264 v = PyDict_GetItem(dict, k);
35939
79374eb6db51 Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents: 35895
diff changeset
1265 Py_DECREF(k);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1266 if (v == NULL)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1267 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
1268 return PyLong_AS_LONG(v);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1269 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1270
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1271 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1272 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
1273 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1274 int i, free = PyCode_GetNumFree(co);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1275 if (free == 0) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1276 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
1277 ADDOP_I(c, MAKE_FUNCTION, args);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1278 return 1;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1279 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1280 for (i = 0; i < free; ++i) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1281 /* Bypass com_addop_varname because it will generate
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1282 LOAD_DEREF but LOAD_CLOSURE is needed.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1283 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1284 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
1285 int arg, reftype;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1286
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1287 /* 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
1288 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
1289 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
1290 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
1291 well as by the normal name loookup logic.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1292 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1293 reftype = get_ref_type(c, name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1294 if (reftype == CELL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1295 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
1296 else /* (reftype == FREE) */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1297 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
1298 if (arg == -1) {
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1299 fprintf(stderr,
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1300 "lookup %s in %s %d %d\n"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1301 "freevars of %s: %s\n",
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1302 PyObject_REPR(name),
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
1303 PyBytes_AS_STRING(c->u->u_name),
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1304 reftype, arg,
48660
85b67fb5672b Rename PyUnicode_AsString -> _PyUnicode_AsString and
Marc-André Lemburg <mal@egenix.com>
parents: 48330
diff changeset
1305 _PyUnicode_AsString(co->co_name),
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1306 PyObject_REPR(co->co_freevars));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1307 Py_FatalError("compiler_make_closure()");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1308 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1309 ADDOP_I(c, LOAD_CLOSURE, arg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1310 }
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1311 ADDOP_I(c, BUILD_TUPLE, free);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1312 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
1313 ADDOP_I(c, MAKE_CLOSURE, args);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1314 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1315 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1316
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1317 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1318 compiler_decorators(struct compiler *c, asdl_seq* decos)
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 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1321
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1322 if (!decos)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1323 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1324
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1325 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
1326 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
1327 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1328 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1329 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1330
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1331 static int
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1332 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
1333 asdl_seq *kw_defaults)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1334 {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1335 int i, default_count = 0;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1336 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
1337 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
1338 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
1339 if (default_) {
41717
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41699
diff changeset
1340 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
1341 if (!compiler_visit_expr(c, default_)) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1342 return -1;
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 default_count++;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1345 }
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 return default_count;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1348 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1349
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1350 static int
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1351 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
1352 expr_ty annotation, PyObject *names)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1353 {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1354 if (annotation) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1355 VISIT(c, expr, annotation);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1356 if (PyList_Append(names, id))
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1357 return -1;
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 return 0;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1360 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1361
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1362 static int
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1363 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
1364 PyObject *names)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1365 {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1366 int i, error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1367 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
1368 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
1369 error = compiler_visit_argannotation(
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41699
diff changeset
1370 c,
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41699
diff changeset
1371 arg->arg,
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41699
diff changeset
1372 arg->annotation,
9ad84070b22d Merged revisions 55328-55341 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41699
diff changeset
1373 names);
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1374 if (error)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1375 return error;
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 return 0;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1378 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1379
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1380 static int
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1381 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
1382 expr_ty returns)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1383 {
40943
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1384 /* 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
1385 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
1386 source code.
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1387
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1388 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
1389 */
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1390 static identifier return_str;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1391 PyObject *names;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1392 int len;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1393 names = PyList_New(0);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1394 if (!names)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1395 return -1;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1396
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1397 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
1398 goto error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1399 if (args->varargannotation &&
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1400 compiler_visit_argannotation(c, args->vararg,
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1401 args->varargannotation, 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 (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
1404 goto error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1405 if (args->kwargannotation &&
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1406 compiler_visit_argannotation(c, args->kwarg,
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1407 args->kwargannotation, names))
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1408 goto error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1409
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1410 if (!return_str) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
1411 return_str = PyUnicode_InternFromString("return");
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1412 if (!return_str)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1413 goto error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1414 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1415 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
1416 goto error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1417 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1418
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1419 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
1420 if (len > 65534) {
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1421 /* 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
1422 PyErr_SetString(PyExc_SyntaxError,
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1423 "too many annotations");
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1424 goto error;
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1425 }
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1426 if (len) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1427 /* 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
1428 PyObject *elt;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1429 int i;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1430 PyObject *s = PyTuple_New(len);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1431 if (!s)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1432 goto error;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1433 for (i = 0; i < len; i++) {
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1434 elt = PyList_GET_ITEM(names, i);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1435 Py_INCREF(elt);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1436 PyTuple_SET_ITEM(s, i, elt);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1437 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1438 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
1439 Py_DECREF(s);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1440 len++; /* include the just-pushed tuple */
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1441 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1442 Py_DECREF(names);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1443 return len;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1444
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1445 error:
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1446 Py_DECREF(names);
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1447 return -1;
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1448 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1449
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1450 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1451 compiler_function(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1452 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1453 PyCodeObject *co;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1454 PyObject *first_const = Py_None;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1455 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
1456 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
1457 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
1458 stmt_ty st;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1459 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
1460 int num_annotations;
35742
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 assert(s->kind == FunctionDef_kind);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1463
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1464 if (!compiler_decorators(c, decos))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1465 return 0;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1466 if (args->kwonlyargs) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1467 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
1468 args->kw_defaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1469 if (res < 0)
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1470 return 0;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1471 kw_default_count = res;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1472 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1473 if (args->defaults)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1474 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
1475 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
1476 if (num_annotations < 0)
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1477 return 0;
c79e6234fb19 Two more patches by Tony Lownds (SF# 1607548).
Guido van Rossum <guido@python.org>
parents: 40941
diff changeset
1478 assert((num_annotations & 0xFFFF) == num_annotations);
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1479
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1480 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
1481 s->lineno))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1482 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1483
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
1484 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
1485 docstring = compiler_isdocstring(st);
43410
b06b191b7cfa Merged revisions 58203-58210 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 43102
diff changeset
1486 if (docstring && Py_OptimizeFlag < 2)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1487 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
1488 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
1489 compiler_exit_scope(c);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1490 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
1491 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1492
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1493 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
1494 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
1495 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
1496 /* 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
1497 for (i = docstring; i < n; i++) {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
1498 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
1499 VISIT_IN_SCOPE(c, stmt, st);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1500 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1501 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
1502 compiler_exit_scope(c);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1503 if (co == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1504 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1505
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1506 arglength = asdl_seq_LEN(args->defaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1507 arglength |= kw_default_count << 8;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1508 arglength |= num_annotations << 16;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1509 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
1510 Py_DECREF(co);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1511
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1512 /* decorators */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1513 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
1514 ADDOP_I(c, CALL_FUNCTION, 1);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1515 }
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 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
1518 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1519
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1520 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1521 compiler_class(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1522 {
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1523 static PyObject *locals = NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1524 PyCodeObject *co;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1525 PyObject *str;
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1526 PySTEntryObject *ste;
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1527 int err, i;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1528 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
1529
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1530 if (!compiler_decorators(c, decos))
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1531 return 0;
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1532
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1533 /* initialize statics */
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1534 if (locals == NULL) {
45029
ef2d3bf8383d Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
1535 locals = PyUnicode_InternFromString("__locals__");
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1536 if (locals == NULL)
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1537 return 0;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1538 }
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1539
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1540 /* ultimately generate code for:
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1541 <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
1542 where:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1543 <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
1544 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
1545 (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
1546 <name> is the class name
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1547 <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
1548 <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
1549 This borrows from compiler_call.
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1550 */
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1551
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1552 /* 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
1553 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
1554 if (ste == NULL)
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1555 return 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1556 assert(PyList_Check(ste->ste_varnames));
41273
d428e21d6eaf Fix refleak in compiler.
Guido van Rossum <guido@python.org>
parents: 41226
diff changeset
1557 err = PyList_Append(ste->ste_varnames, locals);
d428e21d6eaf Fix refleak in compiler.
Guido van Rossum <guido@python.org>
parents: 41226
diff changeset
1558 Py_DECREF(ste);
d428e21d6eaf Fix refleak in compiler.
Guido van Rossum <guido@python.org>
parents: 41226
diff changeset
1559 if (err < 0)
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1560 return 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1561
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1562 /* 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
1563 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
1564 return 0;
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1565 /* 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
1566 {
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1567 /* 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
1568 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
1569 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
1570 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
1571 /* 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
1572 c->u->u_argcount = 1;
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1573 /* 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
1574 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
1575 /* ... 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
1576 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
1577 /* load (global) __name__ ... */
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
1578 str = PyUnicode_InternFromString("__name__");
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1579 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
1580 Py_XDECREF(str);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1581 compiler_exit_scope(c);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1582 return 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1583 }
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1584 Py_DECREF(str);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1585 /* ... 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
1586 str = PyUnicode_InternFromString("__module__");
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1587 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
1588 Py_XDECREF(str);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1589 compiler_exit_scope(c);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1590 return 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1591 }
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1592 Py_DECREF(str);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1593 /* compile the body proper */
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1594 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
1595 compiler_exit_scope(c);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1596 return 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1597 }
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1598 /* return the (empty) __class__ cell */
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1599 str = PyUnicode_InternFromString("__class__");
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1600 if (str == NULL) {
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1601 compiler_exit_scope(c);
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1602 return 0;
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1603 }
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1604 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
1605 Py_DECREF(str);
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1606 if (i == -1) {
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1607 /* 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
1608 PyErr_Clear();
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1609 /* Return None */
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1610 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
1611 }
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1612 else {
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1613 /* 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
1614 ADDOP_I(c, LOAD_CLOSURE, i);
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
1615 }
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1616 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
1617 /* create the code object */
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1618 co = assemble(c, 1);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1619 }
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1620 /* 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
1621 compiler_exit_scope(c);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1622 if (co == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1623 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1624
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1625 /* 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
1626 ADDOP(c, LOAD_BUILD_CLASS);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1627
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1628 /* 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
1629 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
1630 Py_DECREF(co);
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1631
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1632 /* 4. load class name */
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1633 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
1634
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1635 /* 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
1636 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
1637 s->v.ClassDef.bases,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1638 s->v.ClassDef.keywords,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1639 s->v.ClassDef.starargs,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1640 s->v.ClassDef.kwargs))
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1641 return 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
1642
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1643 /* 6. apply decorators */
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1644 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
1645 ADDOP_I(c, CALL_FUNCTION, 1);
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1646 }
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1647
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1648 /* 7. store into <name> */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1649 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
1650 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1651 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1652 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1653
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1654 static int
36666
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1655 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
1656 {
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1657 basicblock *end, *next;
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1658
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1659 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
1660 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
1661 if (end == NULL)
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1662 return 0;
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1663 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
1664 if (next == NULL)
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1665 return 0;
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1666 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
1667 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
1668 ADDOP(c, POP_TOP);
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1669 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
1670 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
1671 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
1672 ADDOP(c, POP_TOP);
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1673 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
1674 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
1675 return 1;
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1676 }
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1677
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1678 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1679 compiler_lambda(struct compiler *c, expr_ty e)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1680 {
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
1681 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
1682 static identifier name;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1683 int kw_default_count = 0, arglength;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1684 arguments_ty args = e->v.Lambda.args;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1685 assert(e->kind == Lambda_kind);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1686
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) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
1688 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
1689 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
1690 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
1691 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1692
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1693 if (args->kwonlyargs) {
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1694 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
1695 args->kw_defaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1696 if (res < 0) return 0;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1697 kw_default_count = res;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1698 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1699 if (args->defaults)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1700 VISIT_SEQ(c, expr, args->defaults);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1701 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
1702 return 0;
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
1703
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1704 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
1705 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
1706 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
50313
bcdfdc369570 Merged revisions 67954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50211
diff changeset
1707 if (c->u->u_ste->ste_generator) {
bcdfdc369570 Merged revisions 67954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50211
diff changeset
1708 ADDOP_IN_SCOPE(c, POP_TOP);
bcdfdc369570 Merged revisions 67954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50211
diff changeset
1709 }
bcdfdc369570 Merged revisions 67954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50211
diff changeset
1710 else {
bcdfdc369570 Merged revisions 67954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50211
diff changeset
1711 ADDOP_IN_SCOPE(c, RETURN_VALUE);
bcdfdc369570 Merged revisions 67954 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50211
diff changeset
1712 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1713 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
1714 compiler_exit_scope(c);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1715 if (co == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1716 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1717
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1718 arglength = asdl_seq_LEN(args->defaults);
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1719 arglength |= kw_default_count << 8;
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1720 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
1721 Py_DECREF(co);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1722
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1723 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1724 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1725
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1726 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1727 compiler_if(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1728 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1729 basicblock *end, *next;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1730 int constant;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1731 assert(s->kind == If_kind);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1732 end = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1733 if (end == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1734 return 0;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1735 next = compiler_new_block(c);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1736 if (next == NULL)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1737 return 0;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1738
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1739 constant = expr_constant(s->v.If.test);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1740 /* constant = 0: "if 0"
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1741 * constant = 1: "if 1", "if 2", ...
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1742 * constant = -1: rest */
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1743 if (constant == 0) {
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1744 if (s->v.If.orelse)
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1745 VISIT_SEQ(c, stmt, s->v.If.orelse);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1746 } else if (constant == 1) {
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1747 VISIT_SEQ(c, stmt, s->v.If.body);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1748 } else {
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1749 VISIT(c, expr, s->v.If.test);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1750 ADDOP_JREL(c, JUMP_IF_FALSE, next);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1751 ADDOP(c, POP_TOP);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1752 VISIT_SEQ(c, stmt, s->v.If.body);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1753 ADDOP_JREL(c, JUMP_FORWARD, end);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1754 compiler_use_next_block(c, next);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1755 ADDOP(c, POP_TOP);
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1756 if (s->v.If.orelse)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
1757 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
1758 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1759 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1760 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1761 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1762
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1763 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1764 compiler_for(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1765 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1766 basicblock *start, *cleanup, *end;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1767
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1768 start = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1769 cleanup = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1770 end = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1771 if (start == NULL || end == NULL || cleanup == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1772 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1773 ADDOP_JREL(c, SETUP_LOOP, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1774 if (!compiler_push_fblock(c, LOOP, start))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1775 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1776 VISIT(c, expr, s->v.For.iter);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1777 ADDOP(c, GET_ITER);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1778 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
1779 /* 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
1780 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
1781 c->u->u_lineno_set = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1782 ADDOP_JREL(c, FOR_ITER, cleanup);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1783 VISIT(c, expr, s->v.For.target);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1784 VISIT_SEQ(c, stmt, s->v.For.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1785 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1786 compiler_use_next_block(c, cleanup);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1787 ADDOP(c, POP_BLOCK);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1788 compiler_pop_fblock(c, LOOP, start);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1789 VISIT_SEQ(c, stmt, s->v.For.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1790 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1791 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1792 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1793
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1794 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1795 compiler_while(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1796 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1797 basicblock *loop, *orelse, *end, *anchor = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1798 int constant = expr_constant(s->v.While.test);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1799
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44373
diff changeset
1800 if (constant == 0) {
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44373
diff changeset
1801 if (s->v.While.orelse)
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44373
diff changeset
1802 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
1803 return 1;
44943
6547be11f443 Merged revisions 60245-60277 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44373
diff changeset
1804 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1805 loop = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1806 end = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1807 if (constant == -1) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1808 anchor = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1809 if (anchor == 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 if (loop == NULL || end == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1813 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1814 if (s->v.While.orelse) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1815 orelse = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1816 if (orelse == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1817 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1818 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1819 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1820 orelse = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1821
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1822 ADDOP_JREL(c, SETUP_LOOP, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1823 compiler_use_next_block(c, loop);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1824 if (!compiler_push_fblock(c, LOOP, loop))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1825 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1826 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
1827 /* 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
1828 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
1829 c->u->u_lineno_set = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1830 VISIT(c, expr, s->v.While.test);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1831 ADDOP_JREL(c, JUMP_IF_FALSE, anchor);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1832 ADDOP(c, POP_TOP);
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 VISIT_SEQ(c, stmt, s->v.While.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1835 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1836
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1837 /* 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
1838 if there is no else clause ?
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1839 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1840
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1841 if (constant == -1) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1842 compiler_use_next_block(c, anchor);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1843 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1844 ADDOP(c, POP_BLOCK);
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 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
1847 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
1848 VISIT_SEQ(c, stmt, s->v.While.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1849 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1850
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1851 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1852 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1853
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1854 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1855 compiler_continue(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1856 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1857 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
1858 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
1859 "'continue' not supported inside 'finally' clause";
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1860 int i;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1861
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1862 if (!c->u->u_nfblocks)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1863 return compiler_error(c, LOOP_ERROR_MSG);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1864 i = c->u->u_nfblocks - 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1865 switch (c->u->u_fblock[i].fb_type) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1866 case LOOP:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1867 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
1868 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1869 case EXCEPT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1870 case FINALLY_TRY:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1871 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
1872 /* 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
1873 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
1874 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
1875 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
1876 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1877 if (i == -1)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1878 return compiler_error(c, LOOP_ERROR_MSG);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1879 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
1880 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1881 case FINALLY_END:
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1882 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
1883 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1884
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1885 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1886 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1887
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1888 /* 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
1889
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1890 SETUP_FINALLY L
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1891 <code for body>
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1892 POP_BLOCK
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1893 LOAD_CONST <None>
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1894 L: <code for finalbody>
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1895 END_FINALLY
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1896
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1897 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
1898 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
1899 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
1900 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
1901
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1902 SETUP_FINALLY:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1903 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
1904 onto the block stack.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1905 POP_BLOCK:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1906 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
1907 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
1908 block stack. (The label is ignored.)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1909 END_FINALLY:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1910 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
1911 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
1912 entries popped depends on the (pseudo) exception type.
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 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
1915 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
1916 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
1917 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
1918 stack.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1919 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1920
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1921 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1922 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
1923 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1924 basicblock *body, *end;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1925 body = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1926 end = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1927 if (body == NULL || end == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1928 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1929
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1930 ADDOP_JREL(c, SETUP_FINALLY, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1931 compiler_use_next_block(c, body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1932 if (!compiler_push_fblock(c, FINALLY_TRY, body))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1933 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1934 VISIT_SEQ(c, stmt, s->v.TryFinally.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1935 ADDOP(c, POP_BLOCK);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1936 compiler_pop_fblock(c, FINALLY_TRY, body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1937
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1938 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1939 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1940 if (!compiler_push_fblock(c, FINALLY_END, end))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1941 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1942 VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1943 ADDOP(c, END_FINALLY);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1944 compiler_pop_fblock(c, FINALLY_END, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1945
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1946 return 1;
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1949 /*
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1950 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
1951 (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
1952 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
1953 associated value, and 'exc' the exception.)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1954
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1955 Value stack Label Instruction Argument
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1956 [] SETUP_EXCEPT L1
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1957 [] <code for S>
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1958 [] POP_BLOCK
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1959 [] JUMP_FORWARD L0
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1960
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1961 [tb, val, exc] L1: DUP )
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1962 [tb, val, exc, exc] <evaluate E1> )
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1963 [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
1964 [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
1965 [tb, val, exc, 1] POP )
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1966 [tb, val, exc] POP
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1967 [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
1968 [tb] POP
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1969 [] <code for S1>
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1970 JUMP_FORWARD L0
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 [tb, val, exc, 0] L2: POP
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1973 [tb, val, exc] DUP
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1974 .............................etc.......................
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 [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
1977 [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
1978
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1979 [] L0: <next statement>
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1980
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1981 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
1982 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1983 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1984 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
1985 {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
1986 basicblock *body, *orelse, *except, *end;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1987 int i, n;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1988
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1989 body = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1990 except = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1991 orelse = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1992 end = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1993 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
1994 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1995 ADDOP_JREL(c, SETUP_EXCEPT, except);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1996 compiler_use_next_block(c, body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1997 if (!compiler_push_fblock(c, EXCEPT, body))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1998 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1999 VISIT_SEQ(c, stmt, s->v.TryExcept.body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2000 ADDOP(c, POP_BLOCK);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2001 compiler_pop_fblock(c, EXCEPT, body);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2002 ADDOP_JREL(c, JUMP_FORWARD, orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2003 n = asdl_seq_LEN(s->v.TryExcept.handlers);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2004 compiler_use_next_block(c, except);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2005 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
2006 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
2007 s->v.TryExcept.handlers, i);
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2008 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
2009 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
2010 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
2011 c->u->u_lineno = handler->lineno;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2012 except = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2013 if (except == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2014 return 0;
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2015 if (handler->v.ExceptHandler.type) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2016 ADDOP(c, DUP_TOP);
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2017 VISIT(c, expr, handler->v.ExceptHandler.type);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2018 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2019 ADDOP_JREL(c, JUMP_IF_FALSE, except);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2020 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2021 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2022 ADDOP(c, POP_TOP);
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2023 if (handler->v.ExceptHandler.name) {
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2024 basicblock *cleanup_end, *cleanup_body;
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2025
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2026 cleanup_end = compiler_new_block(c);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2027 cleanup_body = compiler_new_block(c);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2028 if(!(cleanup_end || cleanup_body))
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2029 return 0;
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2030
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2031 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
2032 ADDOP(c, POP_TOP);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2033
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2034 /*
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2035 try:
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2036 # body
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2037 except type as name:
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2038 try:
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2039 # body
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2040 finally:
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2041 name = None
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2042 del name
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
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2045 /* second try: */
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2046 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2047 compiler_use_next_block(c, cleanup_body);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2048 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
2049 return 0;
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2050
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2051 /* second # body */
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2052 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
2053 ADDOP(c, POP_BLOCK);
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2054 ADDOP(c, POP_EXCEPT);
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2055 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
2056
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2057 /* finally: */
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2058 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
2059 compiler_use_next_block(c, cleanup_end);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2060 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
2061 return 0;
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 /* name = None */
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2064 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
2065 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
2066
4bab65fcca8e Some more changes related to the new except syntax and semantics,
Guido van Rossum <guido@python.org>
parents: 40587
diff changeset
2067 /* del name */
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2068 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
2069
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2070 ADDOP(c, END_FINALLY);
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2071 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
2072 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2073 else {
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2074 basicblock *cleanup_body;
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2075
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2076 cleanup_body = compiler_new_block(c);
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2077 if(!cleanup_body)
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2078 return 0;
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2079
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2080 ADDOP(c, POP_TOP);
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2081 ADDOP(c, POP_TOP);
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2082 compiler_use_next_block(c, cleanup_body);
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2083 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
2084 return 0;
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2085 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
2086 ADDOP(c, POP_EXCEPT);
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
2087 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
2088 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2089 ADDOP_JREL(c, JUMP_FORWARD, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2090 compiler_use_next_block(c, except);
46231
81ee270a6eb5 Merged revisions 62047 via svnmerge from
Neal Norwitz <nnorwitz@gmail.com>
parents: 46208
diff changeset
2091 if (handler->v.ExceptHandler.type)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2092 ADDOP(c, POP_TOP);
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 ADDOP(c, END_FINALLY);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2095 compiler_use_next_block(c, orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2096 VISIT_SEQ(c, stmt, s->v.TryExcept.orelse);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2097 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2098 return 1;
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2101 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2102 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
2103 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2104 /* 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
2105 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
2106
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2107 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
2108 LOAD_ATTR for each name.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2109 */
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
2110 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
2111 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
2112 if (dot) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2113 /* 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
2114 src = dot + 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2115 while (dot) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2116 /* 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
2117 PyObject *attr;
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
2118 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
2119 attr = PyUnicode_FromUnicode(src,
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
2120 dot ? dot - src : Py_UNICODE_strlen(src));
35895
fe4c627b2096 Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 35893
diff changeset
2121 if (!attr)
fe4c627b2096 Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 35893
diff changeset
2122 return -1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2123 ADDOP_O(c, LOAD_ATTR, attr, names);
35895
fe4c627b2096 Fix a few more memory leaks
Neal Norwitz <nnorwitz@gmail.com>
parents: 35893
diff changeset
2124 Py_DECREF(attr);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2125 src = dot + 1;
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 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2128 return compiler_nameop(c, asname, Store);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2129 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2130
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2131 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2132 compiler_import(struct compiler *c, stmt_ty s)
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 /* 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
2135 string. This is convenient for all cases except
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2136 import a.b.c as d
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2137 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
2138 module names.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2139 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
2140 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2141 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
2142
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2143 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
2144 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
2145 int r;
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2146 PyObject *level;
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2147
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
2148 level = PyLong_FromLong(0);
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2149 if (level == NULL)
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2150 return 0;
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2151
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2152 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
2153 Py_DECREF(level);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2154 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2155 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2156
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2157 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
2158 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
2159 if (!r)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2160 return r;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2161 }
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2162 else {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2163 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
2164 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
2165 Py_UNICODE *dot = Py_UNICODE_strchr(base, '.');
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2166 if (dot)
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
2167 tmp = PyUnicode_FromUnicode(base,
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
2168 dot - base);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2169 r = compiler_nameop(c, tmp, Store);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2170 if (dot) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2171 Py_DECREF(tmp);
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 if (!r)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2174 return r;
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 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2177 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2178 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2179
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2180 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2181 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
2182 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2183 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
2184
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2185 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
2186 PyObject *level;
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2187
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2188 if (!names)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2189 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2190
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
2191 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
2192 if (!level) {
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2193 Py_DECREF(names);
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2194 return 0;
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2195 }
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2196
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2197 /* build up the names */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2198 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
2199 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
2200 Py_INCREF(alias->name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2201 PyTuple_SET_ITEM(names, i, alias->name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2202 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2203
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2204 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
2205 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
2206 "__future__")) {
36804
c552f2275782 Fix refleak if from __future__ import was not first
Neal Norwitz <nnorwitz@gmail.com>
parents: 36797
diff changeset
2207 Py_DECREF(level);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2208 Py_DECREF(names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2209 return compiler_error(c,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2210 "from __future__ imports must occur "
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2211 "at the beginning of the file");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2212
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2213 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2214 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2215
36712
5c36c222e7ca SF patch #1438387, PEP 328: relative and absolute imports.
Thomas Wouters <thomas@python.org>
parents: 36697
diff changeset
2216 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
2217 Py_DECREF(level);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2218 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
2219 Py_DECREF(names);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2220 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
2221 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
2222 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
2223 identifier store_name;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2224
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
2225 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
2226 assert(n == 1);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2227 ADDOP(c, IMPORT_STAR);
35993
a29c89b4e8c6 Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
2228 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2229 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2230
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2231 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2232 store_name = alias->name;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2233 if (alias->asname)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2234 store_name = alias->asname;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2235
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2236 if (!compiler_nameop(c, store_name, Store)) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2237 Py_DECREF(names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2238 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2239 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2240 }
35993
a29c89b4e8c6 Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
2241 /* remove imported module */
a29c89b4e8c6 Simplify logic for handling import *
Neal Norwitz <nnorwitz@gmail.com>
parents: 35939
diff changeset
2242 ADDOP(c, POP_TOP);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2243 return 1;
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2246 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2247 compiler_assert(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2248 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2249 static PyObject *assertion_error = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2250 basicblock *end;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2251
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2252 if (Py_OptimizeFlag)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2253 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2254 if (assertion_error == NULL) {
45029
ef2d3bf8383d Merged revisions 60379-60382 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44943
diff changeset
2255 assertion_error = PyUnicode_InternFromString("AssertionError");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2256 if (assertion_error == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2257 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2258 }
45774
058fbfb985ae Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45773
diff changeset
2259 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
2260 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
2261 const char* msg =
058fbfb985ae Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45773
diff changeset
2262 "assertion is always true, perhaps remove parentheses?";
058fbfb985ae Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45773
diff changeset
2263 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
2264 c->u->u_lineno, NULL, NULL) == -1)
058fbfb985ae Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45773
diff changeset
2265 return 0;
058fbfb985ae Merged revisions 61404-61407 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45773
diff changeset
2266 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2267 VISIT(c, expr, s->v.Assert.test);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2268 end = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2269 if (end == NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2270 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2271 ADDOP_JREL(c, JUMP_IF_TRUE, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2272 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2273 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2274 if (s->v.Assert.msg) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2275 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
2276 ADDOP_I(c, CALL_FUNCTION, 1);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2277 }
43102
981ecc526703 Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents: 43100
diff changeset
2278 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
2279 compiler_use_next_block(c, end);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2280 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2281 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2282 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2283
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2284 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2285 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
2286 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2287 int i, n;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2288
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
2289 /* 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
2290 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
2291 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
2292
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2293 switch (s->kind) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2294 case FunctionDef_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2295 return compiler_function(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2296 case ClassDef_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2297 return compiler_class(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2298 case Return_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2299 if (c->u->u_ste->ste_type != FunctionBlock)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2300 return compiler_error(c, "'return' outside function");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2301 if (s->v.Return.value) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2302 VISIT(c, expr, s->v.Return.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2303 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2304 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2305 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2306 ADDOP(c, RETURN_VALUE);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2307 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2308 case Delete_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2309 VISIT_SEQ(c, expr, s->v.Delete.targets)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2310 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2311 case Assign_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2312 n = asdl_seq_LEN(s->v.Assign.targets);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2313 VISIT(c, expr, s->v.Assign.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2314 for (i = 0; i < n; i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2315 if (i < n - 1)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2316 ADDOP(c, DUP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2317 VISIT(c, expr,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2318 (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
2319 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2320 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2321 case AugAssign_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2322 return compiler_augassign(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2323 case For_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2324 return compiler_for(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2325 case While_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2326 return compiler_while(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2327 case If_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2328 return compiler_if(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2329 case Raise_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2330 n = 0;
43102
981ecc526703 Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents: 43100
diff changeset
2331 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
2332 VISIT(c, expr, s->v.Raise.exc);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2333 n++;
43102
981ecc526703 Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents: 43100
diff changeset
2334 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
2335 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
2336 n++;
981ecc526703 Issue #1066: implement PEP 3109, 2/3 of PEP 3134.
Collin Winter <collinw@gmail.com>
parents: 43100
diff changeset
2337 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2338 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2339 ADDOP_I(c, RAISE_VARARGS, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2340 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2341 case TryExcept_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2342 return compiler_try_except(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2343 case TryFinally_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2344 return compiler_try_finally(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2345 case Assert_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2346 return compiler_assert(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2347 case Import_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2348 return compiler_import(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2349 case ImportFrom_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2350 return compiler_from_import(c, s);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2351 case Global_kind:
40965
30e5cb3a55ac Provisional implementation of PEP 3104.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 40943
diff changeset
2352 case Nonlocal_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2353 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2354 case Expr_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2355 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
2356 VISIT(c, expr, s->v.Expr.value);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2357 ADDOP(c, PRINT_EXPR);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2358 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
2359 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
2360 s->v.Expr.value->kind != Num_kind) {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
2361 VISIT(c, expr, s->v.Expr.value);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2362 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2363 }
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 Pass_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2366 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2367 case Break_kind:
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
2368 if (!compiler_in_loop(c))
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2369 return compiler_error(c, "'break' outside loop");
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2370 ADDOP(c, BREAK_LOOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2371 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2372 case Continue_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2373 return compiler_continue(c);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2374 case With_kind:
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2375 return compiler_with(c, s);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2376 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2377 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2378 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2379
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2380 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2381 unaryop(unaryop_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2382 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2383 switch (op) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2384 case Invert:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2385 return UNARY_INVERT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2386 case Not:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2387 return UNARY_NOT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2388 case UAdd:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2389 return UNARY_POSITIVE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2390 case USub:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2391 return UNARY_NEGATIVE;
46208
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2392 default:
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2393 PyErr_Format(PyExc_SystemError,
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2394 "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
2395 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2396 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2397 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2398
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2399 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2400 binop(struct compiler *c, operator_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2401 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2402 switch (op) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2403 case Add:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2404 return BINARY_ADD;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2405 case Sub:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2406 return BINARY_SUBTRACT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2407 case Mult:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2408 return BINARY_MULTIPLY;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2409 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
2410 return BINARY_TRUE_DIVIDE;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2411 case Mod:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2412 return BINARY_MODULO;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2413 case Pow:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2414 return BINARY_POWER;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2415 case LShift:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2416 return BINARY_LSHIFT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2417 case RShift:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2418 return BINARY_RSHIFT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2419 case BitOr:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2420 return BINARY_OR;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2421 case BitXor:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2422 return BINARY_XOR;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2423 case BitAnd:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2424 return BINARY_AND;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2425 case FloorDiv:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2426 return BINARY_FLOOR_DIVIDE;
46208
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2427 default:
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2428 PyErr_Format(PyExc_SystemError,
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2429 "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
2430 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2431 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2432 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2433
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2434 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2435 cmpop(cmpop_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2436 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2437 switch (op) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2438 case Eq:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2439 return PyCmp_EQ;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2440 case NotEq:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2441 return PyCmp_NE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2442 case Lt:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2443 return PyCmp_LT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2444 case LtE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2445 return PyCmp_LE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2446 case Gt:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2447 return PyCmp_GT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2448 case GtE:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2449 return PyCmp_GE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2450 case Is:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2451 return PyCmp_IS;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2452 case IsNot:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2453 return PyCmp_IS_NOT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2454 case In:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2455 return PyCmp_IN;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2456 case NotIn:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2457 return PyCmp_NOT_IN;
46208
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2458 default:
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2459 return PyCmp_BAD;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2460 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2461 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2462
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2463 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2464 inplace_binop(struct compiler *c, operator_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2465 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2466 switch (op) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2467 case Add:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2468 return INPLACE_ADD;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2469 case Sub:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2470 return INPLACE_SUBTRACT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2471 case Mult:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2472 return INPLACE_MULTIPLY;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2473 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
2474 return INPLACE_TRUE_DIVIDE;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2475 case Mod:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2476 return INPLACE_MODULO;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2477 case Pow:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2478 return INPLACE_POWER;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2479 case LShift:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2480 return INPLACE_LSHIFT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2481 case RShift:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2482 return INPLACE_RSHIFT;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2483 case BitOr:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2484 return INPLACE_OR;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2485 case BitXor:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2486 return INPLACE_XOR;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2487 case BitAnd:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2488 return INPLACE_AND;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2489 case FloorDiv:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2490 return INPLACE_FLOOR_DIVIDE;
46208
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2491 default:
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2492 PyErr_Format(PyExc_SystemError,
ea75b12fe8e7 Merged revisions 62004 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45774
diff changeset
2493 "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
2494 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2495 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2496 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2497
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2498 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2499 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
2500 {
35781
31d36dd5959c Remove unnecessary local variable.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35779
diff changeset
2501 int op, scope, arg;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2502 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
2503
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2504 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
2505 PyObject *mangled;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2506 /* XXX AugStore isn't used anywhere! */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2507
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
2508 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
2509 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
2510 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
2511
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2512 op = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2513 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
2514 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
2515 switch (scope) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2516 case FREE:
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2517 dict = c->u->u_freevars;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2518 optype = OP_DEREF;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2519 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2520 case CELL:
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2521 dict = c->u->u_cellvars;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2522 optype = OP_DEREF;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2523 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2524 case LOCAL:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2525 if (c->u->u_ste->ste_type == FunctionBlock)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2526 optype = OP_FAST;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2527 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2528 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
2529 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
2530 !c->u->u_ste->ste_unoptimized)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2531 optype = OP_GLOBAL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2532 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2533 case GLOBAL_EXPLICIT:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2534 optype = OP_GLOBAL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2535 break;
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2536 default:
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2537 /* scope can be 0 */
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2538 break;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2539 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2540
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2541 /* 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
2542 assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_');
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2543
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2544 switch (optype) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2545 case OP_DEREF:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2546 switch (ctx) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2547 case Load: op = LOAD_DEREF; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2548 case Store: op = STORE_DEREF; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2549 case AugLoad:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2550 case AugStore:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2551 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2552 case Del:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2553 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
2554 "can not delete variable '%S' referenced "
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2555 "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
2556 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
2557 Py_DECREF(mangled);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2558 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2559 case Param:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2560 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2561 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2562 "param invalid for deref variable");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2563 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2564 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2565 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2566 case OP_FAST:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2567 switch (ctx) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2568 case Load: op = LOAD_FAST; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2569 case Store: op = STORE_FAST; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2570 case Del: op = DELETE_FAST; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2571 case AugLoad:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2572 case AugStore:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2573 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2574 case Param:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2575 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2576 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2577 "param invalid for local variable");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2578 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2579 }
35779
19d796bd740f Fix private name mangling. The symtable also must do mangles so that
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35778
diff changeset
2580 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
2581 Py_DECREF(mangled);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2582 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2583 case OP_GLOBAL:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2584 switch (ctx) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2585 case Load: op = LOAD_GLOBAL; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2586 case Store: op = STORE_GLOBAL; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2587 case Del: op = DELETE_GLOBAL; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2588 case AugLoad:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2589 case AugStore:
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 Param:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2592 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2593 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2594 "param invalid for global variable");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2595 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2596 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2597 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2598 case OP_NAME:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2599 switch (ctx) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2600 case Load: op = LOAD_NAME; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2601 case Store: op = STORE_NAME; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2602 case Del: op = DELETE_NAME; break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2603 case AugLoad:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2604 case AugStore:
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 case Param:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
2607 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2608 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2609 "param invalid for name variable");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
2610 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2611 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2612 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2613 }
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 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
2616 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
2617 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
2618 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
2619 return 0;
35781
31d36dd5959c Remove unnecessary local variable.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35779
diff changeset
2620 return compiler_addop_i(c, op, arg);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2621 }
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 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2624 compiler_boolop(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2625 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2626 basicblock *end;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2627 int jumpi, i, n;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2628 asdl_seq *s;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2629
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2630 assert(e->kind == BoolOp_kind);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2631 if (e->v.BoolOp.op == And)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2632 jumpi = JUMP_IF_FALSE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2633 else
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2634 jumpi = JUMP_IF_TRUE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2635 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
2636 if (end == NULL)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2637 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2638 s = e->v.BoolOp.values;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2639 n = asdl_seq_LEN(s) - 1;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
2640 assert(n >= 0);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2641 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
2642 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
2643 ADDOP_JREL(c, jumpi, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2644 ADDOP(c, POP_TOP)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2645 }
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
2646 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
2647 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2648 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2649 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2650
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2651 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2652 compiler_list(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2653 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2654 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
2655 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
2656 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
2657 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
2658 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
2659 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
2660 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
2661 (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
2662 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
2663 "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
2664 "star-unpacking assignment");
41699
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2665 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
2666 seen_star = 1;
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2667 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
2668 } 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
2669 return compiler_error(c,
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2670 "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
2671 }
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2672 }
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2673 if (!seen_star) {
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2674 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
2675 }
35742
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 VISIT_SEQ(c, expr, e->v.List.elts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2678 if (e->v.List.ctx == Load) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2679 ADDOP_I(c, BUILD_LIST, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2680 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2681 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2682 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2683
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2684 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2685 compiler_tuple(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2686 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2687 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
2688 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
2689 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
2690 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
2691 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
2692 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
2693 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
2694 (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
2695 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
2696 "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
2697 "star-unpacking assignment");
41699
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2698 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
2699 seen_star = 1;
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2700 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
2701 } 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
2702 return compiler_error(c,
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2703 "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
2704 }
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2705 }
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2706 if (!seen_star) {
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
2707 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
2708 }
35742
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 VISIT_SEQ(c, expr, e->v.Tuple.elts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2711 if (e->v.Tuple.ctx == Load) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2712 ADDOP_I(c, BUILD_TUPLE, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2713 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2714 return 1;
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2717 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2718 compiler_compare(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2719 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2720 int i, n;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2721 basicblock *cleanup = NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2722
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2723 /* 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
2724 VISIT(c, expr, e->v.Compare.left);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2725 n = asdl_seq_LEN(e->v.Compare.ops);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2726 assert(n > 0);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2727 if (n > 1) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2728 cleanup = compiler_new_block(c);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2729 if (cleanup == NULL)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2730 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
2731 VISIT(c, expr,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
2732 (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
2733 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2734 for (i = 1; i < n; i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2735 ADDOP(c, DUP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2736 ADDOP(c, ROT_THREE);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2737 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
2738 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
2739 e->v.Compare.ops, i - 1))));
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2740 ADDOP_JREL(c, JUMP_IF_FALSE, cleanup);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2741 NEXT_BLOCK(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2742 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2743 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
2744 VISIT(c, expr,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
2745 (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
2746 }
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
2747 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
2748 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
2749 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
2750 if (n > 1) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2751 basicblock *end = compiler_new_block(c);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2752 if (end == NULL)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2753 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2754 ADDOP_JREL(c, JUMP_FORWARD, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2755 compiler_use_next_block(c, cleanup);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2756 ADDOP(c, ROT_TWO);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2757 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2758 compiler_use_next_block(c, end);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2759 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2760 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2761 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2762
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2763 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2764 compiler_call(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2765 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2766 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
2767 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
2768 e->v.Call.args,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2769 e->v.Call.keywords,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2770 e->v.Call.starargs,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2771 e->v.Call.kwargs);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2772 }
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2773
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2774 /* 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
2775 static int
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2776 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
2777 int n, /* Args already pushed */
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2778 asdl_seq *args,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2779 asdl_seq *keywords,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2780 expr_ty starargs,
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2781 expr_ty kwargs)
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2782 {
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2783 int code = 0;
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2784
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2785 n += asdl_seq_LEN(args);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2786 VISIT_SEQ(c, expr, args);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2787 if (keywords) {
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2788 VISIT_SEQ(c, keyword, keywords);
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2789 n |= asdl_seq_LEN(keywords) << 8;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2790 }
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2791 if (starargs) {
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2792 VISIT(c, expr, starargs);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2793 code |= 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2794 }
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2795 if (kwargs) {
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2796 VISIT(c, expr, kwargs);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2797 code |= 2;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2798 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2799 switch (code) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2800 case 0:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2801 ADDOP_I(c, CALL_FUNCTION, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2802 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2803 case 1:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2804 ADDOP_I(c, CALL_FUNCTION_VAR, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2805 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2806 case 2:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2807 ADDOP_I(c, CALL_FUNCTION_KW, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2808 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2809 case 3:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2810 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2811 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2812 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2813 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2814 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2815
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2816
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2817 /* 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
2818 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
2819 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
2820 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
2821 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
2822 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
2823 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
2824 when the function is called.
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2825 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
2826 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
2827
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2828 Possible cleanups:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2829 - 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
2830 */
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2831
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2832 static int
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2833 compiler_comprehension_generator(struct compiler *c,
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2834 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
2835 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
2836 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2837 /* 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
2838 and then write to the element */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2839
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2840 comprehension_ty gen;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2841 basicblock *start, *anchor, *skip, *if_cleanup;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2842 int i, n;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2843
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2844 start = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2845 skip = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2846 if_cleanup = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2847 anchor = compiler_new_block(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2848
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2849 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
2850 anchor == NULL)
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2851 return 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 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
2854
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2855 if (gen_index == 0) {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2856 /* 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
2857 c->u->u_argcount = 1;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2858 ADDOP_I(c, LOAD_FAST, 0);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2859 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2860 else {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2861 /* Sub-iter - calculate on the fly */
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2862 VISIT(c, expr, gen->iter);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2863 ADDOP(c, GET_ITER);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2864 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2865 compiler_use_next_block(c, start);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2866 ADDOP_JREL(c, FOR_ITER, anchor);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2867 NEXT_BLOCK(c);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2868 VISIT(c, expr, gen->target);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2869
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2870 /* 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
2871 n = asdl_seq_LEN(gen->ifs);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2872 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
2873 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
2874 VISIT(c, expr, e);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2875 ADDOP_JREL(c, JUMP_IF_FALSE, if_cleanup);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2876 NEXT_BLOCK(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2877 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2878 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2879
36766
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))
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2881 if (!compiler_comprehension_generator(c,
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2882 generators, gen_index,
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2883 elt, val, type))
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2884 return 0;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2885
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2886 /* only append after the last for generator */
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2887 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
2888 /* comprehension specific code */
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2889 switch (type) {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2890 case COMP_GENEXP:
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, YIELD_VALUE);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2893 ADDOP(c, POP_TOP);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2894 break;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2895 case COMP_LISTCOMP:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2896 VISIT(c, expr, elt);
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2897 ADDOP_I(c, LIST_APPEND, gen_index + 1);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2898 break;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2899 case COMP_SETCOMP:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2900 VISIT(c, expr, elt);
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2901 ADDOP_I(c, SET_ADD, gen_index + 1);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2902 break;
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2903 case COMP_DICTCOMP:
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2904 /* With 'd[k] = v', v is evaluated before k, so we do
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2905 the same. */
42193
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 VISIT(c, expr, elt);
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2908 ADDOP_I(c, MAP_ADD, gen_index + 1);
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2909 break;
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2910 default:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2911 return 0;
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2912 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2913
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2914 compiler_use_next_block(c, skip);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2915 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2916 for (i = 0; i < n; i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2917 ADDOP_I(c, JUMP_FORWARD, 1);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
2918 if (i == 0)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2919 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
2920
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2921 ADDOP(c, POP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2922 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2923 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2924 compiler_use_next_block(c, anchor);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2925
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2926 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2927 }
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 static int
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2930 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
2931 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
2932 {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2933 PyCodeObject *co = NULL;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2934 expr_ty outermost_iter;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2935
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2936 outermost_iter = ((comprehension_ty)
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2937 asdl_seq_GET(generators, 0))->iter;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2938
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2939 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
2940 goto error;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2941
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2942 if (type != COMP_GENEXP) {
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2943 int op;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2944 switch (type) {
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2945 case COMP_LISTCOMP:
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2946 op = BUILD_LIST;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2947 break;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2948 case COMP_SETCOMP:
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2949 op = BUILD_SET;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2950 break;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2951 case COMP_DICTCOMP:
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2952 op = BUILD_MAP;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2953 break;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2954 default:
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2955 PyErr_Format(PyExc_SystemError,
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2956 "unknown comprehension type %d", type);
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2957 goto error_in_scope;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2958 }
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2959
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2960 ADDOP_I(c, op, 0);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2961 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2962
50211
2ee4653927f7 Merged revisions 67818 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49697
diff changeset
2963 if (!compiler_comprehension_generator(c, generators, 0, elt,
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
2964 val, type))
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2965 goto error_in_scope;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2966
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2967 if (type != COMP_GENEXP) {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2968 ADDOP(c, RETURN_VALUE);
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
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2971 co = assemble(c, 1);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2972 compiler_exit_scope(c);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2973 if (co == NULL)
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2974 goto error;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2975
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2976 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
2977 goto error;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2978 Py_DECREF(co);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2979
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2980 VISIT(c, expr, outermost_iter);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2981 ADDOP(c, GET_ITER);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2982 ADDOP_I(c, CALL_FUNCTION, 1);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2983 return 1;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2984 error_in_scope:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2985 compiler_exit_scope(c);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2986 error:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2987 Py_XDECREF(co);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2988 return 0;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2989 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2990
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2991 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2992 compiler_genexp(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2993 {
35881
29420bd3b5cb Correctly handle identifiers for anonymous scopes and align genexpr name with symtable.c
Nick Coghlan <ncoghlan@gmail.com>
parents: 35863
diff changeset
2994 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
2995 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
2996 name = PyUnicode_FromString("<genexpr>");
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
2997 if (!name)
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 assert(e->kind == GeneratorExp_kind);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3001 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
3002 e->v.GeneratorExp.generators,
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3003 e->v.GeneratorExp.elt, NULL);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3004 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3005
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3006 static int
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3007 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
3008 {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3009 static identifier name;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3010 if (!name) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
3011 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
3012 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
3013 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
3014 }
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3015 assert(e->kind == ListComp_kind);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3016 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
3017 e->v.ListComp.generators,
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3018 e->v.ListComp.elt, NULL);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3019 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3020
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3021 static int
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3022 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
3023 {
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3024 static identifier name;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3025 if (!name) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
3026 name = PyUnicode_FromString("<setcomp>");
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3027 if (!name)
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3028 return 0;
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3029 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3030 assert(e->kind == SetComp_kind);
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3031 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
3032 e->v.SetComp.generators,
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3033 e->v.SetComp.elt, NULL);
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3034 }
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3035
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3036
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3037 static int
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3038 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
3039 {
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3040 static identifier name;
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3041 if (!name) {
42802
01ee6311ba46 Ensure that code object names (co_name) are unicode.
Neal Norwitz <nnorwitz@gmail.com>
parents: 42775
diff changeset
3042 name = PyUnicode_FromString("<dictcomp>");
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3043 if (!name)
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3044 return 0;
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 assert(e->kind == DictComp_kind);
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3047 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
3048 e->v.DictComp.generators,
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3049 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
3050 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3051
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3052
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3053 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3054 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
3055 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3056 ADDOP_O(c, LOAD_CONST, k->arg, consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3057 VISIT(c, expr, k->value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3058 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3059 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3060
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3061 /* 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
3062 whether they are true or false.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3063
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3064 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
3065 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3066
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3067 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3068 expr_constant(expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3069 {
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
3070 char *id;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3071 switch (e->kind) {
39783
7a0ad110e91e Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents: 39782
diff changeset
3072 case Ellipsis_kind:
7a0ad110e91e Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents: 39782
diff changeset
3073 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3074 case Num_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3075 return PyObject_IsTrue(e->v.Num.n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3076 case Str_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3077 return PyObject_IsTrue(e->v.Str.s);
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
3078 case Name_kind:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
3079 /* optimize away names that can't be reassigned */
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3080 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
3081 _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
3082 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
3083 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
3084 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
3085 if (strcmp(id, "__debug__") == 0)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42013
diff changeset
3086 return ! Py_OptimizeFlag;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
3087 /* fall through */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3088 default:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3089 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3090 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3091 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3092
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3093 /*
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3094 Implements the with statement from PEP 343.
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3095
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3096 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
3097
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3098 with EXPR as VAR:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3099 BLOCK
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3100
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3101 It is implemented roughly as:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3102
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
3103 context = EXPR
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3104 exit = context.__exit__ # not calling it
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3105 value = context.__enter__()
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3106 try:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3107 VAR = value # if VAR present in the syntax
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3108 BLOCK
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3109 finally:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3110 if an exception was raised:
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3111 exc = copy of (exception, instance, traceback)
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3112 else:
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3113 exc = (None, None, None)
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3114 exit(*exc)
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3115 */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3116 static int
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3117 compiler_with(struct compiler *c, stmt_ty s)
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3118 {
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
3119 static identifier enter_attr, exit_attr;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3120 basicblock *block, *finally;
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3121 identifier tmpvalue = NULL, tmpexit = NULL;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3122
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3123 assert(s->kind == With_kind);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3124
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3125 if (!enter_attr) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
3126 enter_attr = PyUnicode_InternFromString("__enter__");
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3127 if (!enter_attr)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3128 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3129 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3130 if (!exit_attr) {
42013
cd125fe83051 Make identifiers str (not str8) objects throughout.
Martin v. Löwis <martin@v.loewis.de>
parents: 41878
diff changeset
3131 exit_attr = PyUnicode_InternFromString("__exit__");
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3132 if (!exit_attr)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3133 return 0;
36695
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
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3136 block = compiler_new_block(c);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3137 finally = compiler_new_block(c);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3138 if (!block || !finally)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3139 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3140
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3141 if (s->v.With.optional_vars) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3142 /* 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
3143 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
3144 because SETUP_FINALLY remembers the stack level.
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3145 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
3146 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
3147 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
3148 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
3149 context.__exit__().
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3150 */
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3151 tmpvalue = compiler_new_tmpname(c);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3152 if (tmpvalue == NULL)
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3153 return 0;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3154 PyArena_AddPyObject(c->c_arena, tmpvalue);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3155 }
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3156 tmpexit = compiler_new_tmpname(c);
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3157 if (tmpexit == NULL)
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3158 return 0;
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3159 PyArena_AddPyObject(c->c_arena, tmpexit);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3160
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
3161 /* Evaluate EXPR */
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3162 VISIT(c, expr, s->v.With.context_expr);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3163
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
3164 /* 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
3165 ADDOP(c, DUP_TOP);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3166 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
3167 if (!compiler_nameop(c, tmpexit, Store))
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3168 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3169
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3170 /* Call context.__enter__() */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3171 ADDOP_O(c, LOAD_ATTR, enter_attr, names);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3172 ADDOP_I(c, CALL_FUNCTION, 0);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3173
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3174 if (s->v.With.optional_vars) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3175 /* Store it in tmpvalue */
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3176 if (!compiler_nameop(c, tmpvalue, Store))
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3177 return 0;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3178 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3179 else {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3180 /* Discard result from context.__enter__() */
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3181 ADDOP(c, POP_TOP);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3182 }
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 /* Start the try block */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3185 ADDOP_JREL(c, SETUP_FINALLY, finally);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3186
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3187 compiler_use_next_block(c, block);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3188 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
3189 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3190 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3191
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3192 if (s->v.With.optional_vars) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3193 /* 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
3194 if (!compiler_nameop(c, tmpvalue, Load) ||
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3195 !compiler_nameop(c, tmpvalue, Del))
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3196 return 0;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3197 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
3198 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3199
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3200 /* BLOCK code */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3201 VISIT_SEQ(c, stmt, s->v.With.body);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3202
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3203 /* End of try block; start the finally block */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3204 ADDOP(c, POP_BLOCK);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3205 compiler_pop_fblock(c, FINALLY_TRY, block);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3206
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3207 ADDOP_O(c, LOAD_CONST, Py_None, consts);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3208 compiler_use_next_block(c, finally);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3209 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
3210 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3211
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
3212 /* 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
3213 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
3214 opcode. */
47594
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3215 if (!compiler_nameop(c, tmpexit, Load) ||
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3216 !compiler_nameop(c, tmpexit, Del))
212a1fee6bf9 #3021: Antoine Pitrou's Lexical exception handlers
Benjamin Peterson <benjamin@python.org>
parents: 47301
diff changeset
3217 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3218 ADDOP(c, WITH_CLEANUP);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3219
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3220 /* Finally block ends. */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3221 ADDOP(c, END_FINALLY);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3222 compiler_pop_fblock(c, FINALLY_END, finally);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3223 return 1;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3224 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3225
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3226 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3227 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
3228 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3229 int i, n;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3230
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3231 /* 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
3232 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
3233 */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3234 if (e->lineno > c->u->u_lineno) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3235 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
3236 c->u->u_lineno_set = 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3237 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3238 switch (e->kind) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3239 case BoolOp_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3240 return compiler_boolop(c, e);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3241 case BinOp_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3242 VISIT(c, expr, e->v.BinOp.left);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3243 VISIT(c, expr, e->v.BinOp.right);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3244 ADDOP(c, binop(c, e->v.BinOp.op));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3245 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3246 case UnaryOp_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3247 VISIT(c, expr, e->v.UnaryOp.operand);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3248 ADDOP(c, unaryop(e->v.UnaryOp.op));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3249 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3250 case Lambda_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3251 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
3252 case IfExp_kind:
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
3253 return compiler_ifexp(c, e);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3254 case Dict_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3255 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
3256 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
3257 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
3258 VISIT(c, expr,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
3259 (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
3260 VISIT(c, expr,
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
3261 (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
3262 ADDOP(c, STORE_MAP);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3263 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3264 break;
39693
d0b83c4630c0 SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents: 39676
diff changeset
3265 case Set_kind:
d0b83c4630c0 SF patch 1547796 by Georg Brandl -- set literals.
Guido van Rossum <guido@python.org>
parents: 39676
diff changeset
3266 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
3267 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
3268 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
3269 break;
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3270 case GeneratorExp_kind:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3271 return compiler_genexp(c, e);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3272 case ListComp_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3273 return compiler_listcomp(c, e);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3274 case SetComp_kind:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3275 return compiler_setcomp(c, e);
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3276 case DictComp_kind:
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3277 return compiler_dictcomp(c, e);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3278 case Yield_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3279 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
3280 return compiler_error(c, "'yield' outside function");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3281 if (e->v.Yield.value) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3282 VISIT(c, expr, e->v.Yield.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3283 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3284 else {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3285 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3286 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3287 ADDOP(c, YIELD_VALUE);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3288 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3289 case Compare_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3290 return compiler_compare(c, e);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3291 case Call_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3292 return compiler_call(c, e);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3293 case Num_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3294 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
3295 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3296 case Str_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3297 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
3298 break;
40894
0ea24f4f2467 Bytes literal.
Thomas Wouters <thomas@python.org>
parents: 40788
diff changeset
3299 case Bytes_kind:
0ea24f4f2467 Bytes literal.
Thomas Wouters <thomas@python.org>
parents: 40788
diff changeset
3300 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
0ea24f4f2467 Bytes literal.
Thomas Wouters <thomas@python.org>
parents: 40788
diff changeset
3301 break;
39783
7a0ad110e91e Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents: 39782
diff changeset
3302 case Ellipsis_kind:
7a0ad110e91e Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents: 39782
diff changeset
3303 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
7a0ad110e91e Patch #1550786: ellipsis literal.
Georg Brandl <georg@python.org>
parents: 39782
diff changeset
3304 break;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3305 /* 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
3306 case Attribute_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3307 if (e->v.Attribute.ctx != AugStore)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3308 VISIT(c, expr, e->v.Attribute.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3309 switch (e->v.Attribute.ctx) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3310 case AugLoad:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3311 ADDOP(c, DUP_TOP);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3312 /* Fall through to load */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3313 case Load:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3314 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
3315 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3316 case AugStore:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3317 ADDOP(c, ROT_TWO);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3318 /* Fall through to save */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3319 case Store:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3320 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
3321 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3322 case Del:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3323 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
3324 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3325 case Param:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3326 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
3327 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
3328 "param invalid in attribute expression");
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
3329 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3330 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3331 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3332 case Subscript_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3333 switch (e->v.Subscript.ctx) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3334 case AugLoad:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3335 VISIT(c, expr, e->v.Subscript.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3336 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3337 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3338 case Load:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3339 VISIT(c, expr, e->v.Subscript.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3340 VISIT_SLICE(c, e->v.Subscript.slice, Load);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3341 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3342 case AugStore:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3343 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3344 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3345 case Store:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3346 VISIT(c, expr, e->v.Subscript.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3347 VISIT_SLICE(c, e->v.Subscript.slice, Store);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3348 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3349 case Del:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3350 VISIT(c, expr, e->v.Subscript.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3351 VISIT_SLICE(c, e->v.Subscript.slice, Del);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3352 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3353 case Param:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3354 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
3355 PyErr_SetString(PyExc_SystemError,
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3356 "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
3357 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3358 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3359 break;
41699
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3360 case Starred_kind:
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3361 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
3362 case Store:
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3363 /* 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
3364 * 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
3365 return compiler_error(c,
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3366 "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
3367 default:
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3368 return compiler_error(c,
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3369 "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
3370 }
e16c8e5c5ca4 Merged revisions 55225-55227,55229-55269 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41554
diff changeset
3371 break;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3372 case Name_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3373 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
3374 /* 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
3375 case List_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3376 return compiler_list(c, e);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3377 case Tuple_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3378 return compiler_tuple(c, e);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3379 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3380 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3381 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3382
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3383 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3384 compiler_augassign(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3385 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3386 expr_ty e = s->v.AugAssign.target;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3387 expr_ty auge;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3388
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3389 assert(s->kind == AugAssign_kind);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3390
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3391 switch (e->kind) {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
3392 case Attribute_kind:
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3393 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
3394 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
3395 if (auge == NULL)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3396 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3397 VISIT(c, expr, auge);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3398 VISIT(c, expr, s->v.AugAssign.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3399 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
3400 auge->v.Attribute.ctx = AugStore;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3401 VISIT(c, expr, auge);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3402 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3403 case Subscript_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3404 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
3405 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
3406 if (auge == NULL)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3407 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3408 VISIT(c, expr, auge);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3409 VISIT(c, expr, s->v.AugAssign.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3410 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
3411 auge->v.Subscript.ctx = AugStore;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3412 VISIT(c, expr, auge);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3413 break;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3414 case Name_kind:
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
3415 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
3416 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3417 VISIT(c, expr, s->v.AugAssign.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3418 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
3419 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
3420 default:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3421 PyErr_Format(PyExc_SystemError,
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3422 "invalid node type (%d) for augmented assignment",
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3423 e->kind);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3424 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3425 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3426 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3427 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3428
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3429 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3430 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
3431 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3432 struct fblockinfo *f;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3433 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
3434 PyErr_SetString(PyExc_SystemError,
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3435 "too many statically nested blocks");
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3436 return 0;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3437 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3438 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
3439 f->fb_type = t;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3440 f->fb_block = b;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3441 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3442 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3443
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3444 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3445 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
3446 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3447 struct compiler_unit *u = c->u;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3448 assert(u->u_nfblocks > 0);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3449 u->u_nfblocks--;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3450 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
3451 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
3452 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3453
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3454 static int
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3455 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
3456 int i;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
3457 struct compiler_unit *u = c->u;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
3458 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
3459 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
3460 return 1;
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
3461 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41464
diff changeset
3462 return 0;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3463 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3464 /* Raises a SyntaxError and returns 0.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3465 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
3466 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3467
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3468 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3469 compiler_error(struct compiler *c, const char *errstr)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3470 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3471 PyObject *loc;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3472 PyObject *u = NULL, *v = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3473
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3474 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
3475 if (!loc) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3476 Py_INCREF(Py_None);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3477 loc = Py_None;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3478 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3479 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
3480 Py_None, loc);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3481 if (!u)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3482 goto exit;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3483 v = Py_BuildValue("(zO)", errstr, u);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3484 if (!v)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3485 goto exit;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3486 PyErr_SetObject(PyExc_SyntaxError, v);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3487 exit:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3488 Py_DECREF(loc);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3489 Py_XDECREF(u);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3490 Py_XDECREF(v);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3491 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3492 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3493
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3494 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3495 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
3496 expr_context_ty ctx)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3497 {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3498 int op = 0;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3499
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3500 /* XXX this code is duplicated */
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3501 switch (ctx) {
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3502 case AugLoad: /* fall through to Load */
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3503 case Load: op = BINARY_SUBSCR; break;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3504 case AugStore:/* fall through to Store */
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3505 case Store: op = STORE_SUBSCR; break;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3506 case Del: op = DELETE_SUBSCR; break;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3507 case Param:
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3508 PyErr_Format(PyExc_SystemError,
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3509 "invalid %s kind %d in subscript\n",
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3510 kind, ctx);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3511 return 0;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3512 }
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3513 if (ctx == AugLoad) {
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3514 ADDOP_I(c, DUP_TOPX, 2);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3515 }
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3516 else if (ctx == AugStore) {
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3517 ADDOP(c, ROT_THREE);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3518 }
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3519 ADDOP(c, op);
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3520 return 1;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3521 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3522
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3523 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3524 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
3525 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3526 int n = 2;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3527 assert(s->kind == Slice_kind);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3528
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3529 /* 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
3530 if (s->v.Slice.lower) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3531 VISIT(c, expr, s->v.Slice.lower);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3532 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3533 else {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3534 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
3535 }
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3536
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3537 if (s->v.Slice.upper) {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3538 VISIT(c, expr, s->v.Slice.upper);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3539 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3540 else {
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3541 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
3542 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3543
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3544 if (s->v.Slice.step) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3545 n++;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3546 VISIT(c, expr, s->v.Slice.step);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3547 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3548 ADDOP_I(c, BUILD_SLICE, n);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3549 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3550 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3551
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3552 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3553 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
3554 expr_context_ty ctx)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3555 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3556 switch (s->kind) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3557 case Slice_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3558 return compiler_slice(c, s, ctx);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3559 case Index_kind:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3560 VISIT(c, expr, s->v.Index.value);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3561 break;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3562 case ExtSlice_kind:
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3563 default:
35893
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
3564 PyErr_SetString(PyExc_SystemError,
825655bfdf20 Last batch of ref leaks in new AST code.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35881
diff changeset
3565 "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
3566 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3567 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3568 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3569 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3570
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3571 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3572 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
3573 {
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
3574 char * kindname = NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3575 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
3576 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
3577 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
3578 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
3579 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
3580 }
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
3581 break;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3582 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
3583 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
3584 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
3585 if (!compiler_slice(c, s, ctx))
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3586 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3587 }
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
3588 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
3589 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
3590 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
3591 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
3592 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
3593 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
3594 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
3595 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
3596 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
3597 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
3598 }
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 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
3600 }
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 break;
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3602 default:
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3603 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
3604 "invalid subscript kind %d", s->kind);
36079
8ebe34eb3eb7 Handle more error conditions with SystemError
Neal Norwitz <nnorwitz@gmail.com>
parents: 36076
diff changeset
3605 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3606 }
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
3607 return compiler_handle_subscr(c, kindname, ctx);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3608 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3609
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3610 /* 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
3611
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3612 /* 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
3613 post records the block indices in post-order.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3614
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3615 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
3616 */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3617
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3618 struct assembler {
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3619 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
3620 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
3621 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
3622 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
3623 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
3624 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
3625 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
3626 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
3627 };
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3628
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3629 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3630 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
3631 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3632 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3633 struct instr *instr = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3634
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3635 if (b->b_seen)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3636 return;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3637 b->b_seen = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3638 if (b->b_next != NULL)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3639 dfs(c, b->b_next, a);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3640 for (i = 0; i < b->b_iused; i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3641 instr = &b->b_instr[i];
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3642 if (instr->i_jrel || instr->i_jabs)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3643 dfs(c, instr->i_target, a);
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 a->a_postorder[a->a_nblocks++] = b;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3646 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3647
35860
9b885c934144 make internal method static
Neal Norwitz <nnorwitz@gmail.com>
parents: 35797
diff changeset
3648 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3649 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
3650 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3651 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3652 struct instr *instr;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3653 if (b->b_seen || b->b_startdepth >= depth)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3654 return maxdepth;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3655 b->b_seen = 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3656 b->b_startdepth = depth;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3657 for (i = 0; i < b->b_iused; i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3658 instr = &b->b_instr[i];
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3659 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
3660 if (depth > maxdepth)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3661 maxdepth = depth;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3662 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
3663 if (instr->i_jrel || instr->i_jabs) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3664 maxdepth = stackdepth_walk(c, instr->i_target,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3665 depth, maxdepth);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3666 if (instr->i_opcode == JUMP_ABSOLUTE ||
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3667 instr->i_opcode == JUMP_FORWARD) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3668 goto out; /* remaining code is dead */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3669 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3670 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3671 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3672 if (b->b_next)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3673 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
3674 out:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3675 b->b_seen = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3676 return maxdepth;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3677 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3678
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3679 /* 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
3680 * 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
3681 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3682 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3683 stackdepth(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3684 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3685 basicblock *b, *entryblock;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3686 entryblock = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3687 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
3688 b->b_seen = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3689 b->b_startdepth = INT_MIN;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3690 entryblock = b;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3691 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
3692 if (!entryblock)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
3693 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3694 return stackdepth_walk(c, entryblock, 0, 0);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3695 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3696
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3697 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3698 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
3699 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3700 memset(a, 0, sizeof(struct assembler));
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3701 a->a_lineno = firstlineno;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3702 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
3703 if (!a->a_bytecode)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3704 return 0;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3705 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
3706 if (!a->a_lnotab)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3707 return 0;
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3708 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
3709 PyErr_NoMemory();
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3710 return 0;
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3711 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3712 a->a_postorder = (basicblock **)PyObject_Malloc(
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3713 sizeof(basicblock *) * nblocks);
36076
aa7d7df853d5 Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 36065
diff changeset
3714 if (!a->a_postorder) {
aa7d7df853d5 Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 36065
diff changeset
3715 PyErr_NoMemory();
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3716 return 0;
36076
aa7d7df853d5 Set MemoryError when alloc fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 36065
diff changeset
3717 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3718 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3719 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3720
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3721 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3722 assemble_free(struct assembler *a)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3723 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3724 Py_XDECREF(a->a_bytecode);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3725 Py_XDECREF(a->a_lnotab);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3726 if (a->a_postorder)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3727 PyObject_Free(a->a_postorder);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3728 }
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 /* 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
3731
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3732 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3733 instrsize(struct instr *instr)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3734 {
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
3735 if (!instr->i_hasarg)
44373
2750d531fdc0 Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
3736 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
3737 if (instr->i_oparg > 0xffff)
44373
2750d531fdc0 Merged revisions 59565-59594 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44349
diff changeset
3738 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
3739 return 3; /* 1 (opcode) + 2 (oparg) */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3740 }
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 blocksize(basicblock *b)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3744 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3745 int i;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3746 int size = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3747
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3748 for (i = 0; i < b->b_iused; i++)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3749 size += instrsize(&b->b_instr[i]);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3750 return size;
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3753 /* All about a_lnotab.
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 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
3756 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
3757 for tracebacks).
24844
cf5928fab108 This is my patch
Michael W. Hudson <mwh@python.net>
parents: 24818
diff changeset
3758
18065
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3759 The array is conceptually a list of
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3760 (bytecode offset increment, line number increment)
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3761 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
3762
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3763 byte code offset source code line number
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3764 0 1
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3765 6 2
18065
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3766 50 7
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3767 350 307
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3768 361 308
18065
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3769
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3770 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
3771 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
3772
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3773 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
3774
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3775 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
3776 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
3777 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
3778 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
3779 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
3780 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
3781 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
3782 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
3783
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3784 lineno = addr = 0
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3785 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
3786 addr += addr_incr
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3787 if addr > A:
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3788 return lineno
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3789 lineno += line_incr
18065
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3790
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3791 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
3792 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
3793 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
3794 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
3795 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
3796 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
3797 */
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3798
17518
f939ce52a734 Make some private symbols static.
Guido van Rossum <guido@python.org>
parents: 17355
diff changeset
3799 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3800 assemble_lnotab(struct assembler *a, struct instr *i)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3801 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3802 int d_bytecode, d_lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3803 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
3804 unsigned char *lnotab;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3805
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3806 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
3807 d_lineno = i->i_lineno - a->a_lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3808
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3809 assert(d_bytecode >= 0);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3810 assert(d_lineno >= 0);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3811
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
3812 if(d_bytecode == 0 && d_lineno == 0)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3813 return 1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3814
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3815 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
3816 int j, nbytes, ncodes = d_bytecode / 255;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3817 nbytes = a->a_lnotab_off + 2 * ncodes;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3818 len = PyBytes_GET_SIZE(a->a_lnotab);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3819 if (nbytes >= len) {
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3820 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
3821 len = nbytes;
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3822 else if (len <= INT_MAX / 2)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3823 len *= 2;
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3824 else {
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3825 PyErr_NoMemory();
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3826 return 0;
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3827 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3828 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
3829 return 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3830 }
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
3831 lnotab = (unsigned char *)
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3832 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
3833 for (j = 0; j < ncodes; j++) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3834 *lnotab++ = 255;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3835 *lnotab++ = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3836 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3837 d_bytecode -= ncodes * 255;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3838 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
3839 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3840 assert(d_bytecode <= 255);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3841 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
3842 int j, nbytes, ncodes = d_lineno / 255;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3843 nbytes = a->a_lnotab_off + 2 * ncodes;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3844 len = PyBytes_GET_SIZE(a->a_lnotab);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3845 if (nbytes >= len) {
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3846 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
3847 len = nbytes;
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3848 else if (len <= INT_MAX / 2)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3849 len *= 2;
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3850 else {
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3851 PyErr_NoMemory();
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3852 return 0;
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47594
diff changeset
3853 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3854 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
3855 return 0;
18065
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3856 }
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
3857 lnotab = (unsigned char *)
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3858 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
3859 *lnotab++ = d_bytecode;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3860 *lnotab++ = 255;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3861 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
3862 for (j = 1; j < ncodes; j++) {
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
3863 *lnotab++ = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3864 *lnotab++ = 255;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3865 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3866 d_lineno -= ncodes * 255;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3867 a->a_lnotab_off += ncodes * 2;
14147
21ec69a56228 Charles G. Waldman <cgw@fnal.gov>:
Fred Drake <fdrake@acm.org>
parents: 14117
diff changeset
3868 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3869
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3870 len = PyBytes_GET_SIZE(a->a_lnotab);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3871 if (a->a_lnotab_off + 2 >= len) {
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3872 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
3873 return 0;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3874 }
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
3875 lnotab = (unsigned char *)
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3876 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
3877
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3878 a->a_lnotab_off += 2;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3879 if (d_bytecode) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3880 *lnotab++ = d_bytecode;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3881 *lnotab++ = d_lineno;
73
3028acaa56b0 Compile class definitions.
Guido van Rossum <guido@python.org>
parents: 69
diff changeset
3882 }
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
3883 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
3884 *lnotab++ = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3885 *lnotab++ = d_lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3886 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3887 a->a_lineno = i->i_lineno;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3888 a->a_lineno_off = a->a_offset;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3889 return 1;
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
3890 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3891
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3892 /* assemble_emit()
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3893 Extend the bytecode with a new instruction.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3894 Update lnotab if necessary.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3895 */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3896
24855
bed5d5e536bc Add warnings for assignment or deletion of variables and attributes
Guido van Rossum <guido@python.org>
parents: 24854
diff changeset
3897 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3898 assemble_emit(struct assembler *a, struct instr *i)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3899 {
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
3900 int size, arg = 0, ext = 0;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3901 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
3902 char *code;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3903
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
3904 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
3905 if (i->i_hasarg) {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3906 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
3907 ext = arg >> 16;
32121
302d399cfd37 SF patch #872326: Generator expression implementation
Raymond Hettinger <python@rcn.com>
parents: 31764
diff changeset
3908 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3909 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
3910 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3911 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
3912 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
3913 return 0;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3914 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
3915 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
3916 }
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
3917 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
3918 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
3919 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
3920 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
3921 *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
3922 *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
3923 *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
3924 arg &= 0xffff;
4991
8276916e1ea8 Add co_stacksize field to codeobject structure, and stacksize argument
Guido van Rossum <guido@python.org>
parents: 4905
diff changeset
3925 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3926 *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
3927 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
3928 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
3929 *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
3930 *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
3931 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3932 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
3933 }
30f8b654c2e5 SF Patch [ 429024 ] deal with some unary ops at compile time
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19177
diff changeset
3934
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
3935 static void
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3936 assemble_jump_offsets(struct assembler *a, struct compiler *c)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3937 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3938 basicblock *b;
35790
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3939 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
3940 int i;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3941
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3942 /* 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
3943 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
3944 start:
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3945 totsize = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3946 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
3947 b = a->a_postorder[i];
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3948 bsize = blocksize(b);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3949 b->b_offset = totsize;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3950 totsize += bsize;
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 73
diff changeset
3951 }
35790
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3952 extended_arg_count = 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3953 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
3954 bsize = b->b_offset;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3955 for (i = 0; i < b->b_iused; i++) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3956 struct instr *instr = &b->b_instr[i];
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3957 /* Relative jumps are computed relative to
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3958 the instruction pointer after fetching
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3959 the jump instruction.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3960 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3961 bsize += instrsize(instr);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3962 if (instr->i_jabs)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3963 instr->i_oparg = instr->i_target->b_offset;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3964 else if (instr->i_jrel) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3965 int delta = instr->i_target->b_offset - bsize;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3966 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
3967 }
35790
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3968 else
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3969 continue;
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3970 if (instr->i_oparg > 0xffff)
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3971 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
3972 }
41243cb4ea05 Another "if 0:" hack, this time to complain about otherwise invisible
Tim Peters <tim.peters@gmail.com>
parents: 18274
diff changeset
3973 }
35790
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3974
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3975 /* 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
3976 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
3977 with a better solution.
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3978
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3979 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
3980 of a loop?
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3981
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3982 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
3983 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
3984 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
3985 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
3986
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3987 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
3988 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
3989 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
3990 fairly quickly.
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 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
3993 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
3994 goto start;
f7b0cbea905b Fix problem handling EXTENDED_ARGs from SF bug # 1333982
Neal Norwitz <nnorwitz@gmail.com>
parents: 35789
diff changeset
3995 }
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3996 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3997
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3998 static PyObject *
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
3999 dict_keys_inorder(PyObject *dict, int offset)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4000 {
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4001 PyObject *tuple, *k, *v;
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36225
diff changeset
4002 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
4003
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4004 tuple = PyTuple_New(size);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4005 if (tuple == NULL)
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4006 return NULL;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4007 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
4008 i = PyLong_AS_LONG(v);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4009 k = PyTuple_GET_ITEM(k, 0);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4010 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
4011 assert((i - offset) < size);
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4012 assert((i - offset) >= 0);
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4013 PyTuple_SET_ITEM(tuple, i - offset, k);
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4014 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4015 return tuple;
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4016 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4017
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4018 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4019 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
4020 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4021 PySTEntryObject *ste = c->u->u_ste;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4022 int flags = 0, n;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4023 if (ste->ste_type != ModuleBlock)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4024 flags |= CO_NEWLOCALS;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4025 if (ste->ste_type == FunctionBlock) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4026 if (!ste->ste_unoptimized)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4027 flags |= CO_OPTIMIZED;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4028 if (ste->ste_nested)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4029 flags |= CO_NESTED;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4030 if (ste->ste_generator)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4031 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
4032 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4033 if (ste->ste_varargs)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4034 flags |= CO_VARARGS;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4035 if (ste->ste_varkeywords)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4036 flags |= CO_VARKEYWORDS;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4037 if (ste->ste_generator)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4038 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
4039
d6cbc71b8010 Generally inehrit codeflags that are in PyCF_MASK, instead of writing it out
Thomas Wouters <thomas@python.org>
parents: 36726
diff changeset
4040 /* (Only) inherit compilerflags in PyCF_MASK */
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4041 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
4042
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4043 n = PyDict_Size(c->u->u_freevars);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4044 if (n < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4045 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4046 if (n == 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4047 n = PyDict_Size(c->u->u_cellvars);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4048 if (n < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4049 return -1;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4050 if (n == 0) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4051 flags |= CO_NOFREE;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4052 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4053 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4054
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4055 return flags;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4056 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4057
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
4058 static PyCodeObject *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4059 makecode(struct compiler *c, struct assembler *a)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4060 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4061 PyObject *tmp;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4062 PyCodeObject *co = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4063 PyObject *consts = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4064 PyObject *names = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4065 PyObject *varnames = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4066 PyObject *filename = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4067 PyObject *name = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4068 PyObject *freevars = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4069 PyObject *cellvars = NULL;
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4070 PyObject *bytecode = NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4071 int nlocals, flags;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4072
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4073 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
4074 if (!tmp)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4075 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4076 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
4077 Py_DECREF(tmp);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4078
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4079 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
4080 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
4081 if (!consts || !names || !varnames)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4082 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4083
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4084 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
4085 if (!cellvars)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4086 goto error;
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4087 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
4088 if (!freevars)
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
4089 goto error;
43569
19319e70fc3e Patch #1272, by Christian Heimes and Alexandre Vassalotti.
Guido van Rossum <guido@python.org>
parents: 43410
diff changeset
4090 filename = PyUnicode_DecodeFSDefault(c->c_filename);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4091 if (!filename)
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 nlocals = PyDict_Size(c->u->u_varnames);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4095 flags = compute_code_flags(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4096 if (flags < 0)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4097 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4098
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
4099 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
4100 if (!bytecode)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4101 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4102
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4103 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
4104 if (!tmp)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4105 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4106 Py_DECREF(consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4107 consts = tmp;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4108
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
4109 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
4110 nlocals, stackdepth(c), flags,
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4111 bytecode, consts, names, varnames,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4112 freevars, cellvars,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4113 filename, c->u->u_name,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4114 c->u->u_firstlineno,
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4115 a->a_lnotab);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4116 error:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4117 Py_XDECREF(consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4118 Py_XDECREF(names);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4119 Py_XDECREF(varnames);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4120 Py_XDECREF(filename);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4121 Py_XDECREF(name);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4122 Py_XDECREF(freevars);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4123 Py_XDECREF(cellvars);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4124 Py_XDECREF(bytecode);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4125 return co;
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4126 }
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
4127
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4128
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4129 /* For debugging purposes only */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4130 #if 0
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4131 static void
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4132 dump_instr(const struct instr *i)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4133 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4134 const char *jrel = i->i_jrel ? "jrel " : "";
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4135 const char *jabs = i->i_jabs ? "jabs " : "";
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4136 char arg[128];
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4137
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4138 *arg = '\0';
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4139 if (i->i_hasarg)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4140 sprintf(arg, "arg: %d ", i->i_oparg);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4141
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4142 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
4143 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
4144 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4145
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4146 static void
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4147 dump_basicblock(const basicblock *b)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4148 {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4149 const char *seen = b->b_seen ? "seen " : "";
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4150 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
4151 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
4152 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
4153 if (b->b_instr) {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4154 int i;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4155 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
4156 fprintf(stderr, " [%02d] ", i);
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4157 dump_instr(b->b_instr + i);
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 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4160 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4161 #endif
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4162
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4163 static PyCodeObject *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4164 assemble(struct compiler *c, int addNone)
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4165 {
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4166 basicblock *b, *entryblock;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4167 struct assembler a;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4168 int i, j, nblocks;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4169 PyCodeObject *co = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4170
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4171 /* 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
4172 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
4173 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
4174 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4175 if (!c->u->u_curblock->b_return) {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4176 NEXT_BLOCK(c);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4177 if (addNone)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4178 ADDOP_O(c, LOAD_CONST, Py_None, consts);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4179 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
4180 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4181
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4182 nblocks = 0;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4183 entryblock = NULL;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4184 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
4185 nblocks++;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4186 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
4187 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4188
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4189 /* 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
4190 if (!c->u->u_firstlineno) {
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4191 if (entryblock && entryblock->b_instr)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4192 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
4193 else
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4194 c->u->u_firstlineno = 1;
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4195 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4196 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
4197 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4198 dfs(c, entryblock, &a);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4199
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4200 /* 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
4201 assemble_jump_offsets(&a, c);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4202
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4203 /* Emit code in reverse postorder from dfs. */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4204 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
4205 b = a.a_postorder[i];
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4206 for (j = 0; j < b->b_iused; j++)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4207 if (!assemble_emit(&a, &b->b_instr[j]))
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4208 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
4209 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4210
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
4211 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
4212 goto error;
47301
23ab586c427a Renamed PyString to PyBytes
Christian Heimes <christian@cheimes.de>
parents: 47082
diff changeset
4213 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
4214 goto error;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4215
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4216 co = makecode(c, &a);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4217 error:
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4218 assemble_free(&a);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4219 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
4220 }