annotate Python/compile.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 5fe72b9ed48e
children
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
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
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
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
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"
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
28 #include "ast.h"
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
29 #include "code.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
30 #include "symtable.h"
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 #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
32
5164
8c277f29b535 Add global Py_OptimizeFlag. SET_LINENO is omitted again unless this is
Guido van Rossum <guido@python.org>
parents: 5119
diff changeset
33 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
34
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
35 #define DEFAULT_BLOCK_SIZE 16
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
36 #define DEFAULT_BLOCKS 8
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
37 #define DEFAULT_CODE_SIZE 128
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
38 #define DEFAULT_LNOTAB_SIZE 16
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
39
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
40 #define COMP_GENEXP 0
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
41 #define COMP_LISTCOMP 1
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
42 #define COMP_SETCOMP 2
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
43 #define COMP_DICTCOMP 3
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
44
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
45 struct instr {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
46 unsigned i_jabs : 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
47 unsigned i_jrel : 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
48 unsigned i_hasarg : 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
49 unsigned char i_opcode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
50 int i_oparg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
51 struct basicblock_ *i_target; /* target block (if jump instruction) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
52 int i_lineno;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
53 };
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
54
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
55 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
56 /* 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
57 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
58 block, not to be confused with b_next, which is next by control flow. */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
59 struct basicblock_ *b_list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
60 /* number of instructions used */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
61 int b_iused;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
62 /* length of instruction array (b_instr) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
63 int b_ialloc;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
64 /* pointer to an array of instructions, initially NULL */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
65 struct instr *b_instr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
66 /* If b_next is non-NULL, it is a pointer to the next
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
67 block reached by normal control flow. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
68 struct basicblock_ *b_next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
69 /* b_seen is used to perform a DFS of basicblocks. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
70 unsigned b_seen : 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
71 /* b_return is true if a RETURN_VALUE opcode is inserted. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
72 unsigned b_return : 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
73 /* depth of stack upon entry of block, computed by stackdepth() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
74 int b_startdepth;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
75 /* instruction offset for block, computed by assemble_jump_offsets() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
76 int b_offset;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
77 } basicblock;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
78
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
79 /* fblockinfo tracks the current frame block.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
80
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
81 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
82 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
83 compiler IR.
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
84 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
85
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
86 enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };
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 struct fblockinfo {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
89 enum fblocktype fb_type;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
90 basicblock *fb_block;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
91 };
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
92
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
93 enum {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
94 COMPILER_SCOPE_MODULE,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
95 COMPILER_SCOPE_CLASS,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
96 COMPILER_SCOPE_FUNCTION,
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
97 COMPILER_SCOPE_LAMBDA,
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
98 COMPILER_SCOPE_COMPREHENSION,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
99 };
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
100
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
101 /* 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
102 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
103 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
104 struct compiler_unit {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
105 PySTEntryObject *u_ste;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
106
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
107 PyObject *u_name;
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
108 PyObject *u_qualname; /* dot-separated qualified name (lazy) */
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
109 int u_scope_type;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
110
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
111 /* The following fields are dicts that map objects to
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
112 the index of them in co_XXX. The index is used as
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
113 the argument for opcodes that refer to those collections.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
114 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
115 PyObject *u_consts; /* all constants */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
116 PyObject *u_names; /* all names */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
117 PyObject *u_varnames; /* local variables */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
118 PyObject *u_cellvars; /* cell variables */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
119 PyObject *u_freevars; /* free variables */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
120
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
121 PyObject *u_private; /* for private name mangling */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
122
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
123 Py_ssize_t u_argcount; /* number of arguments for block */
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
124 Py_ssize_t u_kwonlyargcount; /* number of keyword only arguments for block */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
125 /* Pointer to the most recently allocated block. By following b_list
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
126 members, you can reach all early allocated blocks. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
127 basicblock *u_blocks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
128 basicblock *u_curblock; /* pointer to current block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
129
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
130 int u_nfblocks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
131 struct fblockinfo u_fblock[CO_MAXBLOCKS];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
132
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
133 int u_firstlineno; /* the first lineno of the block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
134 int u_lineno; /* the lineno for the current stmt */
64861
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
135 int u_col_offset; /* the offset of the current stmt */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
136 int u_lineno_set; /* boolean to indicate whether instr
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
137 has been generated with current lineno */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
138 };
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
139
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
140 /* This struct captures the global state of a compilation.
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
141
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
142 The u pointer points to the current compilation unit, while units
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
143 for enclosing blocks are stored in c_stack. The u and c_stack are
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
144 managed by compiler_enter_scope() and compiler_exit_scope().
80239
ab02cd145f56 Issue #5765: Apply a hard recursion limit in the compiler
Nick Coghlan <ncoghlan@gmail.com>
parents: 78172
diff changeset
145
ab02cd145f56 Issue #5765: Apply a hard recursion limit in the compiler
Nick Coghlan <ncoghlan@gmail.com>
parents: 78172
diff changeset
146 Note that we don't track recursion levels during compilation - the
ab02cd145f56 Issue #5765: Apply a hard recursion limit in the compiler
Nick Coghlan <ncoghlan@gmail.com>
parents: 78172
diff changeset
147 task of detecting and rejecting excessive levels of nesting is
ab02cd145f56 Issue #5765: Apply a hard recursion limit in the compiler
Nick Coghlan <ncoghlan@gmail.com>
parents: 78172
diff changeset
148 handled by the symbol analysis pass.
ab02cd145f56 Issue #5765: Apply a hard recursion limit in the compiler
Nick Coghlan <ncoghlan@gmail.com>
parents: 78172
diff changeset
149
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
150 */
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 struct compiler {
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
153 PyObject *c_filename;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
154 struct symtable *c_st;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
155 PyFutureFeatures *c_future; /* pointer to module's __future__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
156 PyCompilerFlags *c_flags;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
157
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
158 int c_optimize; /* optimization level */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
159 int c_interactive; /* true if in interactive mode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
160 int c_nestlevel;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
161
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
162 struct compiler_unit *u; /* compiler state for current block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
163 PyObject *c_stack; /* Python list holding compiler_unit ptrs */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
164 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
165 };
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
166
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
167 static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
168 static void compiler_free(struct compiler *);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
169 static basicblock *compiler_new_block(struct compiler *);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
170 static int compiler_next_instr(struct compiler *, basicblock *);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
171 static int compiler_addop(struct compiler *, int);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
172 static int compiler_addop_o(struct compiler *, int, PyObject *, PyObject *);
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
173 static int compiler_addop_i(struct compiler *, int, Py_ssize_t);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
174 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
175 static basicblock *compiler_use_new_block(struct compiler *);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
176 static int compiler_error(struct compiler *, const char *);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
177 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
178
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
179 static PyCodeObject *compiler_mod(struct compiler *, mod_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
180 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
181 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
182 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
183 static int compiler_augassign(struct compiler *, stmt_ty);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
184 static int compiler_visit_slice(struct compiler *, slice_ty,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
185 expr_context_ty);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
186
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
187 static int compiler_push_fblock(struct compiler *, enum fblocktype,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
188 basicblock *);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
189 static void compiler_pop_fblock(struct compiler *, enum fblocktype,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
190 basicblock *);
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
191 /* 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
192 static int compiler_in_loop(struct compiler *);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
193
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
194 static int inplace_binop(struct compiler *, operator_ty);
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
195 static int expr_constant(struct compiler *, expr_ty);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
196
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
197 static int compiler_with(struct compiler *, stmt_ty, int);
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
198 static int compiler_call_helper(struct compiler *c, Py_ssize_t n,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
199 asdl_seq *args,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
200 asdl_seq *keywords,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
201 expr_ty starargs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
202 expr_ty kwargs);
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
203 static int compiler_try_except(struct compiler *, stmt_ty);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
204 static int compiler_set_qualname(struct compiler *);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
205
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
206 static PyCodeObject *assemble(struct compiler *, int addNone);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
207 static PyObject *__doc__;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
208
53816
911df82bc25d add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents: 51959
diff changeset
209 #define COMPILER_CAPSULE_NAME_COMPILER_UNIT "compile.c compiler unit"
911df82bc25d add a replacement API for PyCObject, PyCapsule #5630
Benjamin Peterson <benjamin@python.org>
parents: 51959
diff changeset
210
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
211 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
212 _Py_Mangle(PyObject *privateobj, PyObject *ident)
33100
356887410bde Fix bug
Michael W. Hudson <mwh@python.net>
parents: 32977
diff changeset
213 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
214 /* Name mangling: __private becomes _classname__private.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
215 This is independent from how the name is used. */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
216 PyObject *result;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
217 size_t nlen, plen, ipriv;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
218 Py_UCS4 maxchar;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
219 if (privateobj == NULL || !PyUnicode_Check(privateobj) ||
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
220 PyUnicode_READ_CHAR(ident, 0) != '_' ||
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
221 PyUnicode_READ_CHAR(ident, 1) != '_') {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
222 Py_INCREF(ident);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
223 return ident;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
224 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
225 nlen = PyUnicode_GET_LENGTH(ident);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
226 plen = PyUnicode_GET_LENGTH(privateobj);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
227 /* Don't mangle __id__ or names with dots.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
228
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
229 The only time a name with a dot can occur is when
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
230 we are compiling an import statement that has a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
231 package name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
232
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
233 TODO(jhylton): Decide whether we want to support
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
234 mangling of the module name, e.g. __M.X.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
235 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
236 if ((PyUnicode_READ_CHAR(ident, nlen-1) == '_' &&
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
237 PyUnicode_READ_CHAR(ident, nlen-2) == '_') ||
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
238 PyUnicode_FindChar(ident, '.', 0, nlen, 1) != -1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
239 Py_INCREF(ident);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
240 return ident; /* Don't mangle __whatever__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
241 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
242 /* Strip leading underscores from class name */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
243 ipriv = 0;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
244 while (PyUnicode_READ_CHAR(privateobj, ipriv) == '_')
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
245 ipriv++;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
246 if (ipriv == plen) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
247 Py_INCREF(ident);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
248 return ident; /* Don't mangle if class is just underscores */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
249 }
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
250 plen -= ipriv;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
251
83160
72f0fd0c4d90 Issue #17645: convert an assert() into a proper exception in _Py_Mangle().
Antoine Pitrou <solipsis@pitrou.net>
parents: 80589
diff changeset
252 if (plen + nlen >= PY_SSIZE_T_MAX - 1) {
72f0fd0c4d90 Issue #17645: convert an assert() into a proper exception in _Py_Mangle().
Antoine Pitrou <solipsis@pitrou.net>
parents: 80589
diff changeset
253 PyErr_SetString(PyExc_OverflowError,
72f0fd0c4d90 Issue #17645: convert an assert() into a proper exception in _Py_Mangle().
Antoine Pitrou <solipsis@pitrou.net>
parents: 80589
diff changeset
254 "private identifier too large to be mangled");
72f0fd0c4d90 Issue #17645: convert an assert() into a proper exception in _Py_Mangle().
Antoine Pitrou <solipsis@pitrou.net>
parents: 80589
diff changeset
255 return NULL;
72f0fd0c4d90 Issue #17645: convert an assert() into a proper exception in _Py_Mangle().
Antoine Pitrou <solipsis@pitrou.net>
parents: 80589
diff changeset
256 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
257
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
258 maxchar = PyUnicode_MAX_CHAR_VALUE(ident);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
259 if (PyUnicode_MAX_CHAR_VALUE(privateobj) > maxchar)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
260 maxchar = PyUnicode_MAX_CHAR_VALUE(privateobj);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
261
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
262 result = PyUnicode_New(1 + nlen + plen, maxchar);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
263 if (!result)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
264 return 0;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
265 /* ident = "_" + priv[ipriv:] + ident # i.e. 1+plen+nlen bytes */
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
266 PyUnicode_WRITE(PyUnicode_KIND(result), PyUnicode_DATA(result), 0, '_');
72493
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
267 if (PyUnicode_CopyCharacters(result, 1, privateobj, ipriv, plen) < 0) {
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
268 Py_DECREF(result);
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
269 return NULL;
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
270 }
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
271 if (PyUnicode_CopyCharacters(result, plen+1, ident, 0, nlen) < 0) {
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
272 Py_DECREF(result);
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
273 return NULL;
c4dcb68e0711 Check for PyUnicode_CopyCharacters() failure
Victor Stinner <victor.stinner@haypocalc.com>
parents: 72475
diff changeset
274 }
76573
1439e2d1f490 Check newly created consistency using _PyUnicode_CheckConsistency(str, 1)
Victor Stinner <victor.stinner@gmail.com>
parents: 76383
diff changeset
275 assert(_PyUnicode_CheckConsistency(result, 1));
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
276 return result;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
277 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
278
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
279 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
280 compiler_init(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
281 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
282 memset(c, 0, sizeof(struct compiler));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
283
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
284 c->c_stack = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
285 if (!c->c_stack)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
286 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
287
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
288 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
289 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
290
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
291 PyCodeObject *
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
292 PyAST_CompileObject(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
293 int optimize, PyArena *arena)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
294 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
295 struct compiler c;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
296 PyCodeObject *co = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
297 PyCompilerFlags local_flags;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
298 int merged;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
299
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
300 if (!__doc__) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
301 __doc__ = PyUnicode_InternFromString("__doc__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
302 if (!__doc__)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
303 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
304 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
305
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
306 if (!compiler_init(&c))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
307 return NULL;
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
308 Py_INCREF(filename);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
309 c.c_filename = filename;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
310 c.c_arena = arena;
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
311 c.c_future = PyFuture_FromASTObject(mod, filename);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
312 if (c.c_future == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
313 goto finally;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
314 if (!flags) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
315 local_flags.cf_flags = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
316 flags = &local_flags;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
317 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
318 merged = c.c_future->ff_features | flags->cf_flags;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
319 c.c_future->ff_features = merged;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
320 flags->cf_flags = merged;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
321 c.c_flags = flags;
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
322 c.c_optimize = (optimize == -1) ? Py_OptimizeFlag : optimize;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
323 c.c_nestlevel = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
324
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
325 c.c_st = PySymtable_BuildObject(mod, filename, c.c_future);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
326 if (c.c_st == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
327 if (!PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
328 PyErr_SetString(PyExc_SystemError, "no symtable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
329 goto finally;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
330 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
331
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
332 co = compiler_mod(&c, mod);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
333
36697
78de5f6b2f67 Clarify C-style exception handling with proper label name.
Thomas Wouters <thomas@python.org>
parents: 36696
diff changeset
334 finally:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
335 compiler_free(&c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
336 assert(co || PyErr_Occurred());
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
337 return co;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
338 }
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 PyCodeObject *
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
341 PyAST_CompileEx(mod_ty mod, const char *filename_str, PyCompilerFlags *flags,
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
342 int optimize, PyArena *arena)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
343 {
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
344 PyObject *filename;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
345 PyCodeObject *co;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
346 filename = PyUnicode_DecodeFSDefault(filename_str);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
347 if (filename == NULL)
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
348 return NULL;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
349 co = PyAST_CompileObject(mod, filename, flags, optimize, arena);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
350 Py_DECREF(filename);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
351 return co;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
352
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
353 }
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
354
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
355 PyCodeObject *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
356 PyNode_Compile(struct _node *n, const char *filename)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
357 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
358 PyCodeObject *co = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
359 mod_ty mod;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
360 PyArena *arena = PyArena_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
361 if (!arena)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
362 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
363 mod = PyAST_FromNode(n, NULL, filename, arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
364 if (mod)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
365 co = PyAST_Compile(mod, filename, NULL, arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
366 PyArena_Free(arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
367 return co;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23589
diff changeset
368 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23589
diff changeset
369
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 static void
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
371 compiler_free(struct compiler *c)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
373 if (c->c_st)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
374 PySymtable_Free(c->c_st);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
375 if (c->c_future)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
376 PyObject_Free(c->c_future);
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
377 Py_XDECREF(c->c_filename);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
378 Py_DECREF(c->c_stack);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
381 static PyObject *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
382 list2dict(PyObject *list)
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
383 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
384 Py_ssize_t i, n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
385 PyObject *v, *k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
386 PyObject *dict = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
387 if (!dict) return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
388
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
389 n = PyList_Size(list);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
390 for (i = 0; i < n; i++) {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
391 v = PyLong_FromSsize_t(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
392 if (!v) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
393 Py_DECREF(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
394 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
395 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
396 k = PyList_GET_ITEM(list, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
397 k = PyTuple_Pack(2, k, k->ob_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
398 if (k == NULL || PyDict_SetItem(dict, k, v) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
399 Py_XDECREF(k);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
400 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
401 Py_DECREF(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
402 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
403 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
404 Py_DECREF(k);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
405 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
406 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
407 return dict;
1399
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
408 }
cc172ce05561 Added compare operations for functions and code objects.
Guido van Rossum <guido@python.org>
parents: 1369
diff changeset
409
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
410 /* 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
411
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
412 src is a symbol table dictionary. If the scope of a name matches
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
413 either scope_type or flag is set, insert it into the new dict. The
36766
1daa199b784b Tabify and reflow some long lines.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 36729
diff changeset
414 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
415 each key.
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
416 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
417
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
418 static PyObject *
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
419 dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
16006
51811d78a9da SF Patch #103250, by pj99: Optimize a strspn() out of startup.
Guido van Rossum <guido@python.org>
parents: 15438
diff changeset
420 {
78171
1577e66a6642 remove unused variable
Meador Inge <meadori@gmail.com>
parents: 78167
diff changeset
421 Py_ssize_t i = offset, scope, num_keys, key_i;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
422 PyObject *k, *v, *dest = PyDict_New();
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
423 PyObject *sorted_keys;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
424
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
425 assert(offset >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
426 if (dest == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
427 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
428
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
429 /* Sort the keys so that we have a deterministic order on the indexes
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
430 saved in the returned dictionary. These indexes are used as indexes
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
431 into the free and cell var storage. Therefore if they aren't
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
432 deterministic, then the generated bytecode is not deterministic.
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
433 */
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
434 sorted_keys = PyDict_Keys(src);
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
435 if (sorted_keys == NULL)
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
436 return NULL;
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
437 if (PyList_Sort(sorted_keys) != 0) {
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
438 Py_DECREF(sorted_keys);
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
439 return NULL;
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
440 }
78167
1c46f2ede4cb Issue #15368: fixing variable typo.
Meador Inge <meadori@gmail.com>
parents: 78164
diff changeset
441 num_keys = PyList_GET_SIZE(sorted_keys);
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
442
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
443 for (key_i = 0; key_i < num_keys; key_i++) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
444 /* XXX this should probably be a macro in symtable.h */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
445 long vi;
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
446 k = PyList_GET_ITEM(sorted_keys, key_i);
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
447 v = PyDict_GetItem(src, k);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
448 assert(PyLong_Check(v));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
449 vi = PyLong_AS_LONG(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
450 scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
451
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
452 if (scope == scope_type || vi & flag) {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
453 PyObject *tuple, *item = PyLong_FromSsize_t(i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
454 if (item == NULL) {
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
455 Py_DECREF(sorted_keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
456 Py_DECREF(dest);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
457 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
458 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
459 i++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
460 tuple = PyTuple_Pack(2, k, k->ob_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
461 if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) {
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
462 Py_DECREF(sorted_keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
463 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
464 Py_DECREF(dest);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
465 Py_XDECREF(tuple);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
466 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
467 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
468 Py_DECREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
469 Py_DECREF(tuple);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
470 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
471 }
78164
79d54fba49b3 Issue #15368: make bytecode generation deterministic.
Meador Inge <meadori@gmail.com>
parents: 76382
diff changeset
472 Py_DECREF(sorted_keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
473 return dest;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
474 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
475
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
476 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
477 compiler_unit_check(struct compiler_unit *u)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
478 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
479 basicblock *block;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
480 for (block = u->u_blocks; block != NULL; block = block->b_list) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
481 assert((void *)block != (void *)0xcbcbcbcb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
482 assert((void *)block != (void *)0xfbfbfbfb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
483 assert((void *)block != (void *)0xdbdbdbdb);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
484 if (block->b_instr != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
485 assert(block->b_ialloc > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
486 assert(block->b_iused > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
487 assert(block->b_ialloc >= block->b_iused);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
488 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
489 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
490 assert (block->b_iused == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
491 assert (block->b_ialloc == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
492 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
493 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
494 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
495
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
496 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
497 compiler_unit_free(struct compiler_unit *u)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
498 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
499 basicblock *b, *next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
500
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
501 compiler_unit_check(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
502 b = u->u_blocks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
503 while (b != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
504 if (b->b_instr)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
505 PyObject_Free((void *)b->b_instr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
506 next = b->b_list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
507 PyObject_Free((void *)b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
508 b = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
509 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
510 Py_CLEAR(u->u_ste);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
511 Py_CLEAR(u->u_name);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
512 Py_CLEAR(u->u_qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
513 Py_CLEAR(u->u_consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
514 Py_CLEAR(u->u_names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
515 Py_CLEAR(u->u_varnames);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
516 Py_CLEAR(u->u_freevars);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
517 Py_CLEAR(u->u_cellvars);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
518 Py_CLEAR(u->u_private);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
519 PyObject_Free(u);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
520 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
521
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
522 static int
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
523 compiler_enter_scope(struct compiler *c, identifier name,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
524 int scope_type, void *key, int lineno)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
525 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
526 struct compiler_unit *u;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
527
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
528 u = (struct compiler_unit *)PyObject_Malloc(sizeof(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
529 struct compiler_unit));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
530 if (!u) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
531 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
532 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
533 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
534 memset(u, 0, sizeof(struct compiler_unit));
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
535 u->u_scope_type = scope_type;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
536 u->u_argcount = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
537 u->u_kwonlyargcount = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
538 u->u_ste = PySymtable_Lookup(c->c_st, key);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
539 if (!u->u_ste) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
540 compiler_unit_free(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
541 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
542 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
543 Py_INCREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
544 u->u_name = name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
545 u->u_varnames = list2dict(u->u_ste->ste_varnames);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
546 u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
547 if (!u->u_varnames || !u->u_cellvars) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
548 compiler_unit_free(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
549 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
550 }
83783
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
551 if (u->u_ste->ste_needs_class_closure) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
552 /* Cook up a implicit __class__ cell. */
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
553 _Py_IDENTIFIER(__class__);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
554 PyObject *tuple, *name, *zero;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
555 int res;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
556 assert(u->u_scope_type == COMPILER_SCOPE_CLASS);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
557 assert(PyDict_Size(u->u_cellvars) == 0);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
558 name = _PyUnicode_FromId(&PyId___class__);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
559 if (!name) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
560 compiler_unit_free(u);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
561 return 0;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
562 }
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
563 tuple = PyTuple_Pack(2, name, Py_TYPE(name));
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
564 if (!tuple) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
565 compiler_unit_free(u);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
566 return 0;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
567 }
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
568 zero = PyLong_FromLong(0);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
569 if (!zero) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
570 Py_DECREF(tuple);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
571 compiler_unit_free(u);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
572 return 0;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
573 }
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
574 res = PyDict_SetItem(u->u_cellvars, tuple, zero);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
575 Py_DECREF(tuple);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
576 Py_DECREF(zero);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
577 if (res < 0) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
578 compiler_unit_free(u);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
579 return 0;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
580 }
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
581 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
582
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
583 u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
584 PyDict_Size(u->u_cellvars));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
585 if (!u->u_freevars) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
586 compiler_unit_free(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
587 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
588 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
589
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
590 u->u_blocks = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
591 u->u_nfblocks = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
592 u->u_firstlineno = lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
593 u->u_lineno = 0;
64861
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
594 u->u_col_offset = 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
595 u->u_lineno_set = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
596 u->u_consts = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
597 if (!u->u_consts) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
598 compiler_unit_free(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
599 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
600 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
601 u->u_names = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
602 if (!u->u_names) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
603 compiler_unit_free(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
604 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
605 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
606
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
607 u->u_private = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
608
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
609 /* Push the old compiler_unit on the stack. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
610 if (c->u) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
611 PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
612 if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
613 Py_XDECREF(capsule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
614 compiler_unit_free(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
615 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
616 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
617 Py_DECREF(capsule);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
618 u->u_private = c->u->u_private;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
619 Py_XINCREF(u->u_private);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
620 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
621 c->u = u;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
622
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
623 c->c_nestlevel++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
624 if (compiler_use_new_block(c) == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
625 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
626
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
627 if (u->u_scope_type != COMPILER_SCOPE_MODULE) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
628 if (!compiler_set_qualname(c))
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
629 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
630 }
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
631
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
632 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
633 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
634
35797
3778083fe2c8 Ensure that compiler_exit_scope() is called as necessary to free memory
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 35790
diff changeset
635 static void
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
636 compiler_exit_scope(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
637 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
638 Py_ssize_t n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
639 PyObject *capsule;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
640
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
641 c->c_nestlevel--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
642 compiler_unit_free(c->u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
643 /* Restore c->u to the parent unit. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
644 n = PyList_GET_SIZE(c->c_stack) - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
645 if (n >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
646 capsule = PyList_GET_ITEM(c->c_stack, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
647 c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
648 assert(c->u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
649 /* we are deleting from a list so this really shouldn't fail */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
650 if (PySequence_DelItem(c->c_stack, n) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
651 Py_FatalError("compiler_exit_scope()");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
652 compiler_unit_check(c->u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
653 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
654 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
655 c->u = NULL;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
656
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
657 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
658
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
659 static int
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
660 compiler_set_qualname(struct compiler *c)
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
661 {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
662 _Py_static_string(dot, ".");
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
663 _Py_static_string(dot_locals, ".<locals>");
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
664 Py_ssize_t stack_size;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
665 struct compiler_unit *u = c->u;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
666 PyObject *name, *base, *dot_str, *dot_locals_str;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
667
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
668 base = NULL;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
669 stack_size = PyList_GET_SIZE(c->c_stack);
86495
50bb4300bf2b strengthen condition and add assertion
Benjamin Peterson <benjamin@python.org>
parents: 86491
diff changeset
670 assert(stack_size >= 1);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
671 if (stack_size > 1) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
672 int scope, force_global = 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
673 struct compiler_unit *parent;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
674 PyObject *mangled, *capsule;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
675
86491
35b384ed594b give explicitly global functions and classes a global __qualname__ (closes #19301)
Benjamin Peterson <benjamin@python.org>
parents: 85419
diff changeset
676 capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
677 parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
678 assert(parent);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
679
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
680 if (u->u_scope_type == COMPILER_SCOPE_FUNCTION || u->u_scope_type == COMPILER_SCOPE_CLASS) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
681 assert(u->u_name);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
682 mangled = _Py_Mangle(parent->u_private, u->u_name);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
683 if (!mangled)
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
684 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
685 scope = PyST_GetScope(parent->u_ste, mangled);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
686 Py_DECREF(mangled);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
687 assert(scope != GLOBAL_IMPLICIT);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
688 if (scope == GLOBAL_EXPLICIT)
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
689 force_global = 1;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
690 }
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
691
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
692 if (!force_global) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
693 if (parent->u_scope_type == COMPILER_SCOPE_FUNCTION
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
694 || parent->u_scope_type == COMPILER_SCOPE_LAMBDA) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
695 dot_locals_str = _PyUnicode_FromId(&dot_locals);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
696 if (dot_locals_str == NULL)
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
697 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
698 base = PyUnicode_Concat(parent->u_qualname, dot_locals_str);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
699 if (base == NULL)
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
700 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
701 }
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
702 else {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
703 Py_INCREF(parent->u_qualname);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
704 base = parent->u_qualname;
86491
35b384ed594b give explicitly global functions and classes a global __qualname__ (closes #19301)
Benjamin Peterson <benjamin@python.org>
parents: 85419
diff changeset
705 }
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
706 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
707 }
86491
35b384ed594b give explicitly global functions and classes a global __qualname__ (closes #19301)
Benjamin Peterson <benjamin@python.org>
parents: 85419
diff changeset
708
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
709 if (base != NULL) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
710 dot_str = _PyUnicode_FromId(&dot);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
711 if (dot_str == NULL) {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
712 Py_DECREF(base);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
713 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
714 }
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
715 name = PyUnicode_Concat(base, dot_str);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
716 Py_DECREF(base);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
717 if (name == NULL)
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
718 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
719 PyUnicode_Append(&name, u->u_name);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
720 if (name == NULL)
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
721 return 0;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
722 }
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
723 else {
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
724 Py_INCREF(u->u_name);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
725 name = u->u_name;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
726 }
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
727 u->u_qualname = name;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
728
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
729 return 1;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
730 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
731
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
732 /* 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
733 Returns NULL on error.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
734 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
735
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
736 static basicblock *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
737 compiler_new_block(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
738 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
739 basicblock *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
740 struct compiler_unit *u;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
741
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
742 u = c->u;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
743 b = (basicblock *)PyObject_Malloc(sizeof(basicblock));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
744 if (b == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
745 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
746 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
747 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
748 memset((void *)b, 0, sizeof(basicblock));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
749 /* Extend the singly linked list of blocks with new block. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
750 b->b_list = u->u_blocks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
751 u->u_blocks = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
752 return b;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
753 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
754
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
755 static basicblock *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
756 compiler_use_new_block(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
757 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
758 basicblock *block = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
759 if (block == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
760 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
761 c->u->u_curblock = block;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
762 return block;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
763 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
764
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
765 static basicblock *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
766 compiler_next_block(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
767 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
768 basicblock *block = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
769 if (block == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
770 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
771 c->u->u_curblock->b_next = block;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
772 c->u->u_curblock = block;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
773 return block;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
774 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
775
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
776 static basicblock *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
777 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
778 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
779 assert(block != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
780 c->u->u_curblock->b_next = block;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
781 c->u->u_curblock = block;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
782 return block;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
783 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
784
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
785 /* 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
786 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
787 Returns -1 on failure.
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
788 */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
789
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
790 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
791 compiler_next_instr(struct compiler *c, basicblock *b)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
792 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
793 assert(b != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
794 if (b->b_instr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
795 b->b_instr = (struct instr *)PyObject_Malloc(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
796 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
797 if (b->b_instr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
798 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
799 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
800 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
801 b->b_ialloc = DEFAULT_BLOCK_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
802 memset((char *)b->b_instr, 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
803 sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
804 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
805 else if (b->b_iused == b->b_ialloc) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
806 struct instr *tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
807 size_t oldsize, newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
808 oldsize = b->b_ialloc * sizeof(struct instr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
809 newsize = oldsize << 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
810
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
811 if (oldsize > (PY_SIZE_MAX >> 1)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
812 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
813 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
814 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
815
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
816 if (newsize == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
817 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
818 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
819 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
820 b->b_ialloc <<= 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
821 tmp = (struct instr *)PyObject_Realloc(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
822 (void *)b->b_instr, newsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
823 if (tmp == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
824 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
825 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
826 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
827 b->b_instr = tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
828 memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
829 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
830 return b->b_iused++;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
831 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
832
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
833 /* 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
834 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
835 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
836
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
837 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
838 - 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
839 - 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
840 - 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
841 - 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
842 - 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
843 */
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
844
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
845 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
846 compiler_set_lineno(struct compiler *c, int off)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
847 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
848 basicblock *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
849 if (c->u->u_lineno_set)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
850 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
851 c->u->u_lineno_set = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
852 b = c->u->u_curblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
853 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
854 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
855
87465
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
856 int
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
857 PyCompile_OpcodeStackEffect(int opcode, int oparg)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
858 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
859 switch (opcode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
860 case POP_TOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
861 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
862 case ROT_TWO:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
863 case ROT_THREE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
864 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
865 case DUP_TOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
866 return 1;
64439
725231211273 Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents: 63114
diff changeset
867 case DUP_TOP_TWO:
725231211273 Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents: 63114
diff changeset
868 return 2;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
869
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
870 case UNARY_POSITIVE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
871 case UNARY_NEGATIVE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
872 case UNARY_NOT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
873 case UNARY_INVERT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
874 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
875
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
876 case SET_ADD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
877 case LIST_APPEND:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
878 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
879 case MAP_ADD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
880 return -2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
881
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
882 case BINARY_POWER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
883 case BINARY_MULTIPLY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
884 case BINARY_MODULO:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
885 case BINARY_ADD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
886 case BINARY_SUBTRACT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
887 case BINARY_SUBSCR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
888 case BINARY_FLOOR_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
889 case BINARY_TRUE_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
890 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
891 case INPLACE_FLOOR_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
892 case INPLACE_TRUE_DIVIDE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
893 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
894
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
895 case INPLACE_ADD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
896 case INPLACE_SUBTRACT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
897 case INPLACE_MULTIPLY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
898 case INPLACE_MODULO:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
899 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
900 case STORE_SUBSCR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
901 return -3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
902 case STORE_MAP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
903 return -2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
904 case DELETE_SUBSCR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
905 return -2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
906
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
907 case BINARY_LSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
908 case BINARY_RSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
909 case BINARY_AND:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
910 case BINARY_XOR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
911 case BINARY_OR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
912 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
913 case INPLACE_POWER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
914 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
915 case GET_ITER:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
916 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
917
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
918 case PRINT_EXPR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
919 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
920 case LOAD_BUILD_CLASS:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
921 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
922 case INPLACE_LSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
923 case INPLACE_RSHIFT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
924 case INPLACE_AND:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
925 case INPLACE_XOR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
926 case INPLACE_OR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
927 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
928 case BREAK_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
929 return 0;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
930 case SETUP_WITH:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
931 return 7;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
932 case WITH_CLEANUP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
933 return -1; /* XXX Sometimes more */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
934 case RETURN_VALUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
935 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
936 case IMPORT_STAR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
937 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
938 case YIELD_VALUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
939 return 0;
74356
d64ac9ab4cd0 Implement PEP 380 - 'yield from' (closes #11682)
Nick Coghlan <ncoghlan@gmail.com>
parents: 73738
diff changeset
940 case YIELD_FROM:
75714
72556ff86828 perform yield from delegation by repeating YIELD_FROM opcode (closes #14230)
Benjamin Peterson <benjamin@python.org>
parents: 74391
diff changeset
941 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
942 case POP_BLOCK:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
943 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
944 case POP_EXCEPT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
945 return 0; /* -3 except if bad bytecode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
946 case END_FINALLY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
947 return -1; /* or -2 or -3 if exception occurred */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
948
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
949 case STORE_NAME:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
950 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
951 case DELETE_NAME:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
952 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
953 case UNPACK_SEQUENCE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
954 return oparg-1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
955 case UNPACK_EX:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
956 return (oparg&0xFF) + (oparg>>8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
957 case FOR_ITER:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
958 return 1; /* or -1, at end of iterator */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
959
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
960 case STORE_ATTR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
961 return -2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
962 case DELETE_ATTR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
963 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
964 case STORE_GLOBAL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
965 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
966 case DELETE_GLOBAL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
967 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
968 case LOAD_CONST:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
969 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
970 case LOAD_NAME:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
971 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
972 case BUILD_TUPLE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
973 case BUILD_LIST:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
974 case BUILD_SET:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
975 return 1-oparg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
976 case BUILD_MAP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
977 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
978 case LOAD_ATTR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
979 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
980 case COMPARE_OP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
981 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
982 case IMPORT_NAME:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
983 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
984 case IMPORT_FROM:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
985 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
986
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
987 case JUMP_FORWARD:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
988 case JUMP_IF_TRUE_OR_POP: /* -1 if jump not taken */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
989 case JUMP_IF_FALSE_OR_POP: /* "" */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
990 case JUMP_ABSOLUTE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
991 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
992
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
993 case POP_JUMP_IF_FALSE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
994 case POP_JUMP_IF_TRUE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
995 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
996
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
997 case LOAD_GLOBAL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
998 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
999
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1000 case CONTINUE_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1001 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1002 case SETUP_LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1003 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1004 case SETUP_EXCEPT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1005 case SETUP_FINALLY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1006 return 6; /* can push 3 values for the new exception
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1007 + 3 others for the previous exception state */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1008
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1009 case LOAD_FAST:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1010 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1011 case STORE_FAST:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1012 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1013 case DELETE_FAST:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1014 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1015
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1016 case RAISE_VARARGS:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1017 return -oparg;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1018 #define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1019 case CALL_FUNCTION:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1020 return -NARGS(oparg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1021 case CALL_FUNCTION_VAR:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1022 case CALL_FUNCTION_KW:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1023 return -NARGS(oparg)-1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1024 case CALL_FUNCTION_VAR_KW:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1025 return -NARGS(oparg)-2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1026 case MAKE_FUNCTION:
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1027 return -1 -NARGS(oparg) - ((oparg >> 16) & 0xffff);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1028 case MAKE_CLOSURE:
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1029 return -2 - NARGS(oparg) - ((oparg >> 16) & 0xffff);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1030 #undef NARGS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1031 case BUILD_SLICE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1032 if (oparg == 3)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1033 return -2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1034 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1035 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1036
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1037 case LOAD_CLOSURE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1038 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1039 case LOAD_DEREF:
83572
cf65c7a75f55 check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents: 83452
diff changeset
1040 case LOAD_CLASSDEREF:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1041 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1042 case STORE_DEREF:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1043 return -1;
64620
25cc226dc9bd #4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 64439
diff changeset
1044 case DELETE_DEREF:
25cc226dc9bd #4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 64439
diff changeset
1045 return 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1046 default:
87465
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
1047 return PY_INVALID_STACK_EFFECT;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1048 }
87465
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
1049 return PY_INVALID_STACK_EFFECT; /* not reachable */
35742
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1052 /* Add an opcode with no argument.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1053 Returns 0 on failure, 1 on success.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1054 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1055
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1056 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1057 compiler_addop(struct compiler *c, int opcode)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1058 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1059 basicblock *b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1060 struct instr *i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1061 int off;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1062 off = compiler_next_instr(c, c->u->u_curblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1063 if (off < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1064 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1065 b = c->u->u_curblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1066 i = &b->b_instr[off];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1067 i->i_opcode = opcode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1068 i->i_hasarg = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1069 if (opcode == RETURN_VALUE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1070 b->b_return = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1071 compiler_set_lineno(c, off);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1072 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1073 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1074
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
1075 static Py_ssize_t
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1076 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
1077 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1078 PyObject *t, *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1079 Py_ssize_t arg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1080 double d;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1081
85418
4d62a62ba44d Issue #18783: Removed existing mentions of Python long type in docstrings,
Serhiy Storchaka <storchaka@gmail.com>
parents: 83451
diff changeset
1082 /* necessary to make sure types aren't coerced (e.g., float and complex) */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1083 /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1084 if (PyFloat_Check(o)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1085 d = PyFloat_AS_DOUBLE(o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1086 /* all we need is to make the tuple different in either the 0.0
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1087 * or -0.0 case from all others, just to avoid the "coercion".
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1088 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1089 if (d == 0.0 && copysign(1.0, d) < 0.0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1090 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1091 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1092 t = PyTuple_Pack(2, o, o->ob_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1093 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1094 else if (PyComplex_Check(o)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1095 Py_complex z;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1096 int real_negzero, imag_negzero;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1097 /* For the complex case we must make complex(x, 0.)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1098 different from complex(x, -0.) and complex(0., y)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1099 different from complex(-0., y), for any x and y.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1100 All four complex zeros must be distinguished.*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1101 z = PyComplex_AsCComplex(o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1102 real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1103 imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1104 if (real_negzero && imag_negzero) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1105 t = PyTuple_Pack(5, o, o->ob_type,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1106 Py_None, Py_None, Py_None);
45082
d7540031b959 Merged revisions 60475-60479,60481-60488 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45029
diff changeset
1107 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1108 else if (imag_negzero) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1109 t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1110 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1111 else if (real_negzero) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1112 t = PyTuple_Pack(3, o, o->ob_type, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1113 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1114 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1115 t = PyTuple_Pack(2, o, o->ob_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1116 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1117 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1118 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1119 t = PyTuple_Pack(2, o, o->ob_type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1120 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1121 if (t == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1122 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1123
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1124 v = PyDict_GetItem(dict, t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1125 if (!v) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1126 if (PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1127 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1128 arg = PyDict_Size(dict);
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1129 v = PyLong_FromSsize_t(arg);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1130 if (!v) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1131 Py_DECREF(t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1132 return -1;
42775
d7517c306791 Merged revisions 57221-57391 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42193
diff changeset
1133 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1134 if (PyDict_SetItem(dict, t, v) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1135 Py_DECREF(t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1136 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1137 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1138 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1139 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1140 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1141 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1142 arg = PyLong_AsLong(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1143 Py_DECREF(t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1144 return arg;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1145 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1146
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1147 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1148 compiler_addop_o(struct compiler *c, int opcode, PyObject *dict,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1149 PyObject *o)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1150 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1151 Py_ssize_t arg = compiler_add_o(c, dict, o);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1152 if (arg < 0)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
1153 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1154 return compiler_addop_i(c, opcode, arg);
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1157 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1158 compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1159 PyObject *o)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1160 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1161 Py_ssize_t arg;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1162 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
1163 if (!mangled)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
1164 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1165 arg = compiler_add_o(c, dict, mangled);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1166 Py_DECREF(mangled);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1167 if (arg < 0)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
1168 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1169 return compiler_addop_i(c, opcode, arg);
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1170 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1171
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1172 /* Add an opcode with an integer argument.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1173 Returns 0 on failure, 1 on success.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1174 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1175
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1176 static int
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
1177 compiler_addop_i(struct compiler *c, int opcode, Py_ssize_t oparg)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1178 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1179 struct instr *i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1180 int off;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1181
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1182 /* Integer arguments are limit to 16-bit. There is an extension for 32-bit
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1183 integer arguments. */
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
1184 assert((-2147483647-1) <= oparg);
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
1185 assert(oparg <= 2147483647);
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1186
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1187 off = compiler_next_instr(c, c->u->u_curblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1188 if (off < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1189 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1190 i = &c->u->u_curblock->b_instr[off];
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
1191 i->i_opcode = opcode;
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
1192 i->i_oparg = Py_SAFE_DOWNCAST(oparg, Py_ssize_t, int);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1193 i->i_hasarg = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1194 compiler_set_lineno(c, off);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1195 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1196 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1197
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1198 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1199 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
1200 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1201 struct instr *i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1202 int off;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1203
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1204 assert(b != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1205 off = compiler_next_instr(c, c->u->u_curblock);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1206 if (off < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1207 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1208 i = &c->u->u_curblock->b_instr[off];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1209 i->i_opcode = opcode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1210 i->i_target = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1211 i->i_hasarg = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1212 if (absolute)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1213 i->i_jabs = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1214 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1215 i->i_jrel = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1216 compiler_set_lineno(c, off);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1217 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1218 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1219
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1220 /* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle. (I'd
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1221 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
1222 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
1223 from the current block to the new block.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1224 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1225
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
1226 /* 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
1227 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
1228 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1229
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1230
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1231 #define NEW_BLOCK(C) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1232 if (compiler_use_new_block((C)) == NULL) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1233 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1234 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1235
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1236 #define NEXT_BLOCK(C) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1237 if (compiler_next_block((C)) == NULL) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1238 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1239 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1240
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1241 #define ADDOP(C, OP) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1242 if (!compiler_addop((C), (OP))) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1243 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1244 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1245
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1246 #define ADDOP_IN_SCOPE(C, OP) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1247 if (!compiler_addop((C), (OP))) { \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1248 compiler_exit_scope(c); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1249 return 0; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1250 } \
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1251 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1252
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1253 #define ADDOP_O(C, OP, O, TYPE) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1254 if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1255 return 0; \
35742
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1258 #define ADDOP_NAME(C, OP, O, TYPE) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1259 if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1260 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1261 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1262
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1263 #define ADDOP_I(C, OP, O) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1264 if (!compiler_addop_i((C), (OP), (O))) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1265 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1266 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1267
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1268 #define ADDOP_JABS(C, OP, O) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1269 if (!compiler_addop_j((C), (OP), (O), 1)) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1270 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1271 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1272
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1273 #define ADDOP_JREL(C, OP, O) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1274 if (!compiler_addop_j((C), (OP), (O), 0)) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1275 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1276 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1277
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1278 /* 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
1279 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
1280 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1281
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1282 #define VISIT(C, TYPE, V) {\
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1283 if (!compiler_visit_ ## TYPE((C), (V))) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1284 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1285 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1286
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1287 #define VISIT_IN_SCOPE(C, TYPE, V) {\
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1288 if (!compiler_visit_ ## TYPE((C), (V))) { \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1289 compiler_exit_scope(c); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1290 return 0; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1291 } \
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1292 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1293
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1294 #define VISIT_SLICE(C, V, CTX) {\
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1295 if (!compiler_visit_slice((C), (V), (CTX))) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1296 return 0; \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1297 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1298
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1299 #define VISIT_SEQ(C, TYPE, SEQ) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1300 int _i; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1301 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1302 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1303 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1304 if (!compiler_visit_ ## TYPE((C), elt)) \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1305 return 0; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1306 } \
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1307 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1308
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1309 #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1310 int _i; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1311 asdl_seq *seq = (SEQ); /* avoid variable capture */ \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1312 for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1313 TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1314 if (!compiler_visit_ ## TYPE((C), elt)) { \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1315 compiler_exit_scope(c); \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1316 return 0; \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1317 } \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1318 } \
35863
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1319 }
79f2ce320192 Fix a lot of memory and ref leaks in error paths.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35860
diff changeset
1320
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1321 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1322 compiler_isdocstring(stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1323 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1324 if (s->kind != Expr_kind)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
1325 return 0;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1326 return s->v.Expr.value->kind == Str_kind;
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1327 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1328
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1329 /* 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
1330
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1331 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1332 compiler_body(struct compiler *c, asdl_seq *stmts)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1333 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1334 int i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1335 stmt_ty st;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1336
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1337 if (!asdl_seq_LEN(stmts))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1338 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1339 st = (stmt_ty)asdl_seq_GET(stmts, 0);
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
1340 if (compiler_isdocstring(st) && c->c_optimize < 2) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1341 /* don't generate docstrings if -OO */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1342 i = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1343 VISIT(c, expr, st->v.Expr.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1344 if (!compiler_nameop(c, __doc__, Store))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1345 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1346 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1347 for (; i < asdl_seq_LEN(stmts); i++)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1348 VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1349 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1350 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1351
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1352 static PyCodeObject *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1353 compiler_mod(struct compiler *c, mod_ty mod)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1354 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1355 PyCodeObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1356 int addNone = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1357 static PyObject *module;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1358 if (!module) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1359 module = PyUnicode_InternFromString("<module>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1360 if (!module)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1361 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1362 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1363 /* Use 0 for firstlineno initially, will fixup in assemble(). */
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1364 if (!compiler_enter_scope(c, module, COMPILER_SCOPE_MODULE, mod, 0))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1365 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1366 switch (mod->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1367 case Module_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1368 if (!compiler_body(c, mod->v.Module.body)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1369 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1370 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1371 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1372 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1373 case Interactive_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1374 c->c_interactive = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1375 VISIT_SEQ_IN_SCOPE(c, stmt,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1376 mod->v.Interactive.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1377 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1378 case Expression_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1379 VISIT_IN_SCOPE(c, expr, mod->v.Expression.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1380 addNone = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1381 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1382 case Suite_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1383 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1384 "suite should not be possible");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1385 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1386 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1387 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1388 "module kind %d should not be possible",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1389 mod->kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1390 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1391 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1392 co = assemble(c, addNone);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1393 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1394 return co;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1395 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1396
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1397 /* 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
1398 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
1399 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
1400 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1401
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1402 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1403 get_ref_type(struct compiler *c, PyObject *name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1404 {
83792
d1ba1228a04f fix compilation on Windows
Victor Stinner <victor.stinner@gmail.com>
parents: 83791
diff changeset
1405 int scope;
83783
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1406 if (c->u->u_scope_type == COMPILER_SCOPE_CLASS &&
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1407 !PyUnicode_CompareWithASCIIString(name, "__class__"))
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1408 return CELL;
83792
d1ba1228a04f fix compilation on Windows
Victor Stinner <victor.stinner@gmail.com>
parents: 83791
diff changeset
1409 scope = PyST_GetScope(c->u->u_ste, name);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1410 if (scope == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1411 char buf[350];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1412 PyOS_snprintf(buf, sizeof(buf),
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
1413 "unknown scope for %.100s in %.100s(%s)\n"
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1414 "symbols: %s\nlocals: %s\nglobals: %s",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1415 PyBytes_AS_STRING(name),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1416 PyBytes_AS_STRING(c->u->u_name),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1417 PyObject_REPR(c->u->u_ste->ste_id),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1418 PyObject_REPR(c->u->u_ste->ste_symbols),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1419 PyObject_REPR(c->u->u_varnames),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1420 PyObject_REPR(c->u->u_names)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1421 );
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1422 Py_FatalError(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1423 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1424
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1425 return scope;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1426 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1427
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1428 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1429 compiler_lookup_arg(PyObject *dict, PyObject *name)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1430 {
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1431 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
1432 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
1433 if (k == NULL)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
1434 return -1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1435 v = PyDict_GetItem(dict, k);
35939
79374eb6db51 Fix a few more ref leaks. Backport candidate
Neal Norwitz <nnorwitz@gmail.com>
parents: 35895
diff changeset
1436 Py_DECREF(k);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1437 if (v == NULL)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
1438 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
1439 return PyLong_AS_LONG(v);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1440 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1441
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1442 static int
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1443 compiler_make_closure(struct compiler *c, PyCodeObject *co, Py_ssize_t args, PyObject *qualname)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1444 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1445 Py_ssize_t i, free = PyCode_GetNumFree(co);
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1446 if (qualname == NULL)
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1447 qualname = co->co_name;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1448
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1449 if (free == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1450 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1451 ADDOP_O(c, LOAD_CONST, qualname, consts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1452 ADDOP_I(c, MAKE_FUNCTION, args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1453 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1454 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1455 for (i = 0; i < free; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1456 /* Bypass com_addop_varname because it will generate
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1457 LOAD_DEREF but LOAD_CLOSURE is needed.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1458 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1459 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1460 int arg, reftype;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1461
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1462 /* Special case: If a class contains a method with a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1463 free variable that has the same name as a method,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1464 the name will be considered free *and* local in the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1465 class. It should be handled by the closure, as
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1466 well as by the normal name loookup logic.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1467 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1468 reftype = get_ref_type(c, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1469 if (reftype == CELL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1470 arg = compiler_lookup_arg(c->u->u_cellvars, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1471 else /* (reftype == FREE) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1472 arg = compiler_lookup_arg(c->u->u_freevars, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1473 if (arg == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1474 fprintf(stderr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1475 "lookup %s in %s %d %d\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1476 "freevars of %s: %s\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1477 PyObject_REPR(name),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1478 PyBytes_AS_STRING(c->u->u_name),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1479 reftype, arg,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1480 _PyUnicode_AsString(co->co_name),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1481 PyObject_REPR(co->co_freevars));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1482 Py_FatalError("compiler_make_closure()");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1483 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1484 ADDOP_I(c, LOAD_CLOSURE, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1485 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1486 ADDOP_I(c, BUILD_TUPLE, free);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1487 ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts);
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1488 ADDOP_O(c, LOAD_CONST, qualname, consts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1489 ADDOP_I(c, MAKE_CLOSURE, args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1490 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1491 }
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 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1494 compiler_decorators(struct compiler *c, asdl_seq* decos)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1495 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1496 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1497
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1498 if (!decos)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1499 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1500
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1501 for (i = 0; i < asdl_seq_LEN(decos); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1502 VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1503 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1504 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1505 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1506
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1507 static int
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1508 compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1509 asdl_seq *kw_defaults)
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1510 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1511 int i, default_count = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1512 for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1513 arg_ty arg = asdl_seq_GET(kwonlyargs, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1514 expr_ty default_ = asdl_seq_GET(kw_defaults, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1515 if (default_) {
76382
f8540b8d076c mangle keyword-only argname when loading defaults (closes #14607)
Benjamin Peterson <benjamin@python.org>
parents: 70444
diff changeset
1516 PyObject *mangled = _Py_Mangle(c->u->u_private, arg->arg);
f8540b8d076c mangle keyword-only argname when loading defaults (closes #14607)
Benjamin Peterson <benjamin@python.org>
parents: 70444
diff changeset
1517 if (!mangled)
f8540b8d076c mangle keyword-only argname when loading defaults (closes #14607)
Benjamin Peterson <benjamin@python.org>
parents: 70444
diff changeset
1518 return -1;
f8540b8d076c mangle keyword-only argname when loading defaults (closes #14607)
Benjamin Peterson <benjamin@python.org>
parents: 70444
diff changeset
1519 ADDOP_O(c, LOAD_CONST, mangled, consts);
f8540b8d076c mangle keyword-only argname when loading defaults (closes #14607)
Benjamin Peterson <benjamin@python.org>
parents: 70444
diff changeset
1520 Py_DECREF(mangled);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1521 if (!compiler_visit_expr(c, default_)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1522 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1523 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1524 default_count++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1525 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1526 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1527 return default_count;
40215
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1528 }
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1529
1cce0526d9b0 Jiwon Seo's PEP 3102 implementation.
Guido van Rossum <guido@python.org>
parents: 39783
diff changeset
1530 static int
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1531 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
1532 expr_ty annotation, PyObject *names)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1533 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1534 if (annotation) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1535 VISIT(c, expr, annotation);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1536 if (PyList_Append(names, id))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1537 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1538 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1539 return 0;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1540 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1541
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1542 static int
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1543 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
1544 PyObject *names)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1545 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1546 int i, error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1547 for (i = 0; i < asdl_seq_LEN(args); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1548 arg_ty arg = (arg_ty)asdl_seq_GET(args, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1549 error = compiler_visit_argannotation(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1550 c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1551 arg->arg,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1552 arg->annotation,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1553 names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1554 if (error)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1555 return error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1556 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1557 return 0;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1558 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1559
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1560 static int
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1561 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
1562 expr_ty returns)
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1563 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1564 /* Push arg annotations and a list of the argument names. Return the #
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1565 of items pushed. The expressions are evaluated out-of-order wrt the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1566 source code.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1567
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1568 More than 2^16-1 annotations is a SyntaxError. Returns -1 on error.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1569 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1570 static identifier return_str;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1571 PyObject *names;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1572 Py_ssize_t len;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1573 names = PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1574 if (!names)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1575 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1576
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1577 if (compiler_visit_argannotations(c, args->args, names))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1578 goto error;
82732
7c5c678e4164 unify some ast.argument's attrs; change Attribute column offset (closes #16795)
Benjamin Peterson <benjamin@python.org>
parents: 82135
diff changeset
1579 if (args->vararg && args->vararg->annotation &&
7c5c678e4164 unify some ast.argument's attrs; change Attribute column offset (closes #16795)
Benjamin Peterson <benjamin@python.org>
parents: 82135
diff changeset
1580 compiler_visit_argannotation(c, args->vararg->arg,
7c5c678e4164 unify some ast.argument's attrs; change Attribute column offset (closes #16795)
Benjamin Peterson <benjamin@python.org>
parents: 82135
diff changeset
1581 args->vararg->annotation, names))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1582 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1583 if (compiler_visit_argannotations(c, args->kwonlyargs, names))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1584 goto error;
82732
7c5c678e4164 unify some ast.argument's attrs; change Attribute column offset (closes #16795)
Benjamin Peterson <benjamin@python.org>
parents: 82135
diff changeset
1585 if (args->kwarg && args->kwarg->annotation &&
7c5c678e4164 unify some ast.argument's attrs; change Attribute column offset (closes #16795)
Benjamin Peterson <benjamin@python.org>
parents: 82135
diff changeset
1586 compiler_visit_argannotation(c, args->kwarg->arg,
7c5c678e4164 unify some ast.argument's attrs; change Attribute column offset (closes #16795)
Benjamin Peterson <benjamin@python.org>
parents: 82135
diff changeset
1587 args->kwarg->annotation, names))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1588 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1589
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1590 if (!return_str) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1591 return_str = PyUnicode_InternFromString("return");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1592 if (!return_str)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1593 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1594 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1595 if (compiler_visit_argannotation(c, return_str, returns, names)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1596 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1597 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1598
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1599 len = PyList_GET_SIZE(names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1600 if (len > 65534) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1601 /* len must fit in 16 bits, and len is incremented below */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1602 PyErr_SetString(PyExc_SyntaxError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1603 "too many annotations");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1604 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1605 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1606 if (len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1607 /* convert names to a tuple and place on stack */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1608 PyObject *elt;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1609 Py_ssize_t i;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1610 PyObject *s = PyTuple_New(len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1611 if (!s)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1612 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1613 for (i = 0; i < len; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1614 elt = PyList_GET_ITEM(names, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1615 Py_INCREF(elt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1616 PyTuple_SET_ITEM(s, i, elt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1617 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1618 ADDOP_O(c, LOAD_CONST, s, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1619 Py_DECREF(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1620 len++; /* include the just-pushed tuple */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1621 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1622 Py_DECREF(names);
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1623
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1624 /* We just checked that len <= 65535, see above */
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1625 return Py_SAFE_DOWNCAST(len, Py_ssize_t, int);
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1626
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1627 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1628 Py_DECREF(names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1629 return -1;
40529
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1630 }
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1631
54cd47788811 PEP 3107 - Function Annotations thanks to Tony Lownds
Neal Norwitz <nnorwitz@gmail.com>
parents: 40450
diff changeset
1632 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1633 compiler_function(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1634 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1635 PyCodeObject *co;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1636 PyObject *qualname, *first_const = Py_None;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1637 arguments_ty args = s->v.FunctionDef.args;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1638 expr_ty returns = s->v.FunctionDef.returns;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1639 asdl_seq* decos = s->v.FunctionDef.decorator_list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1640 stmt_ty st;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1641 Py_ssize_t i, n, arglength;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1642 int docstring, kw_default_count = 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1643 int num_annotations;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1644
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1645 assert(s->kind == FunctionDef_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1646
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1647 if (!compiler_decorators(c, decos))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1648 return 0;
82133
d296cf1600a8 evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents: 80739
diff changeset
1649 if (args->defaults)
d296cf1600a8 evaluate positional defaults before keyword-only defaults (closes #16967)
Benjamin Peterson <benjamin@python.org>
parents: 80739
diff changeset
1650 VISIT_SEQ(c, expr, args->defaults);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1651 if (args->kwonlyargs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1652 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1653 args->kw_defaults);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1654 if (res < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1655 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1656 kw_default_count = res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1657 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1658 num_annotations = compiler_visit_annotations(c, args, returns);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1659 if (num_annotations < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1660 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1661 assert((num_annotations & 0xFFFF) == num_annotations);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1662
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1663 if (!compiler_enter_scope(c, s->v.FunctionDef.name,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1664 COMPILER_SCOPE_FUNCTION, (void *)s,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1665 s->lineno))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1666 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1667
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1668 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1669 docstring = compiler_isdocstring(st);
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
1670 if (docstring && c->c_optimize < 2)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1671 first_const = st->v.Expr.value->v.Str.s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1672 if (compiler_add_o(c, c->u->u_consts, first_const) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1673 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1674 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1675 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1676
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1677 c->u->u_argcount = asdl_seq_LEN(args->args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1678 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1679 n = asdl_seq_LEN(s->v.FunctionDef.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1680 /* if there was a docstring, we need to skip the first statement */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1681 for (i = docstring; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1682 st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1683 VISIT_IN_SCOPE(c, stmt, st);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1684 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1685 co = assemble(c, 1);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1686 qualname = c->u->u_qualname;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1687 Py_INCREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1688 compiler_exit_scope(c);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1689 if (co == NULL) {
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1690 Py_XDECREF(qualname);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1691 Py_XDECREF(co);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1692 return 0;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1693 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1694
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1695 arglength = asdl_seq_LEN(args->defaults);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1696 arglength |= kw_default_count << 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1697 arglength |= num_annotations << 16;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1698 compiler_make_closure(c, co, arglength, qualname);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1699 Py_DECREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1700 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1701
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1702 /* decorators */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1703 for (i = 0; i < asdl_seq_LEN(decos); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1704 ADDOP_I(c, CALL_FUNCTION, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1705 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1706
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1707 return compiler_nameop(c, s->v.FunctionDef.name, Store);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1708 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1709
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1710 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1711 compiler_class(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1712 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1713 PyCodeObject *co;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1714 PyObject *str;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1715 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1716 asdl_seq* decos = s->v.ClassDef.decorator_list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1717
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1718 if (!compiler_decorators(c, decos))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1719 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1720
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1721 /* ultimately generate code for:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1722 <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1723 where:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1724 <func> is a function/closure created from the class body;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1725 it has a single argument (__locals__) where the dict
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1726 (or MutableSequence) representing the locals is passed
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1727 <name> is the class name
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1728 <bases> is the positional arguments and *varargs argument
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1729 <keywords> is the keyword arguments and **kwds argument
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1730 This borrows from compiler_call.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1731 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1732
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1733 /* 1. compile the class body into a code object */
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1734 if (!compiler_enter_scope(c, s->v.ClassDef.name,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1735 COMPILER_SCOPE_CLASS, (void *)s, s->lineno))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1736 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1737 /* this block represents what we do in the new scope */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1738 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1739 /* use the class name for name mangling */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1740 Py_INCREF(s->v.ClassDef.name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1741 Py_XDECREF(c->u->u_private);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1742 c->u->u_private = s->v.ClassDef.name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1743 /* load (global) __name__ ... */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1744 str = PyUnicode_InternFromString("__name__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1745 if (!str || !compiler_nameop(c, str, Load)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1746 Py_XDECREF(str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1747 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1748 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1749 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1750 Py_DECREF(str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1751 /* ... and store it as __module__ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1752 str = PyUnicode_InternFromString("__module__");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1753 if (!str || !compiler_nameop(c, str, Store)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1754 Py_XDECREF(str);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1755 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1756 return 0;
41824
24b60622b944 Merged revisions 55407-55513 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 41717
diff changeset
1757 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1758 Py_DECREF(str);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1759 assert(c->u->u_qualname);
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1760 ADDOP_O(c, LOAD_CONST, c->u->u_qualname, consts);
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1761 str = PyUnicode_InternFromString("__qualname__");
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1762 if (!str || !compiler_nameop(c, str, Store)) {
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1763 Py_XDECREF(str);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1764 compiler_exit_scope(c);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1765 return 0;
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1766 }
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1767 Py_DECREF(str);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1768 /* compile the body proper */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1769 if (!compiler_body(c, s->v.ClassDef.body)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1770 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1771 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1772 }
83783
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1773 if (c->u->u_ste->ste_needs_class_closure) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1774 /* return the (empty) __class__ cell */
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1775 str = PyUnicode_InternFromString("__class__");
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1776 if (str == NULL) {
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1777 compiler_exit_scope(c);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1778 return 0;
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1779 }
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1780 i = compiler_lookup_arg(c->u->u_cellvars, str);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1781 Py_DECREF(str);
86948
ea373a14f9e9 Issue #19437: Fix compiler_class(), handle compiler_lookup_arg() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 86521
diff changeset
1782 if (i < 0) {
ea373a14f9e9 Issue #19437: Fix compiler_class(), handle compiler_lookup_arg() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 86521
diff changeset
1783 compiler_exit_scope(c);
ea373a14f9e9 Issue #19437: Fix compiler_class(), handle compiler_lookup_arg() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 86521
diff changeset
1784 return 0;
ea373a14f9e9 Issue #19437: Fix compiler_class(), handle compiler_lookup_arg() failure
Victor Stinner <victor.stinner@gmail.com>
parents: 86521
diff changeset
1785 }
83783
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1786 assert(i == 0);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1787 /* Return the cell where to store __class__ */
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1788 ADDOP_I(c, LOAD_CLOSURE, i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1789 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1790 else {
83783
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1791 assert(PyDict_Size(c->u->u_cellvars) == 0);
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1792 /* This happens when nobody references the cell. Return None. */
3d858f1eef54 hide the __class__ closure from the class body (#12370)
Benjamin Peterson <benjamin@python.org>
parents: 83572
diff changeset
1793 ADDOP_O(c, LOAD_CONST, Py_None, consts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1794 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1795 ADDOP_IN_SCOPE(c, RETURN_VALUE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1796 /* create the code object */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1797 co = assemble(c, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1798 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1799 /* leave the new scope */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1800 compiler_exit_scope(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1801 if (co == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1802 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1803
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1804 /* 2. load the 'build_class' function */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1805 ADDOP(c, LOAD_BUILD_CLASS);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1806
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1807 /* 3. load a function (or closure) made from the code object */
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1808 compiler_make_closure(c, co, 0, NULL);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1809 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1810
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1811 /* 4. load class name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1812 ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1813
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1814 /* 5. generate the rest of the code for the call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1815 if (!compiler_call_helper(c, 2,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1816 s->v.ClassDef.bases,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1817 s->v.ClassDef.keywords,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1818 s->v.ClassDef.starargs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1819 s->v.ClassDef.kwargs))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1820 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1821
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1822 /* 6. apply decorators */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1823 for (i = 0; i < asdl_seq_LEN(decos); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1824 ADDOP_I(c, CALL_FUNCTION, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1825 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1826
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1827 /* 7. store into <name> */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1828 if (!compiler_nameop(c, s->v.ClassDef.name, Store))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1829 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1830 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1831 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1832
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1833 static int
36666
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1834 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
1835 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1836 basicblock *end, *next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1837
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1838 assert(e->kind == IfExp_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1839 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1840 if (end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1841 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1842 next = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1843 if (next == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1844 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1845 VISIT(c, expr, e->v.IfExp.test);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1846 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1847 VISIT(c, expr, e->v.IfExp.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1848 ADDOP_JREL(c, JUMP_FORWARD, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1849 compiler_use_next_block(c, next);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1850 VISIT(c, expr, e->v.IfExp.orelse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1851 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1852 return 1;
36666
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1853 }
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1854
6165927431d6 PEP 308 implementation, including minor refdocs and some testcases. It
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
1855 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1856 compiler_lambda(struct compiler *c, expr_ty e)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1857 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1858 PyCodeObject *co;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1859 PyObject *qualname;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1860 static identifier name;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1861 int kw_default_count = 0;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
1862 Py_ssize_t arglength;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1863 arguments_ty args = e->v.Lambda.args;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1864 assert(e->kind == Lambda_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1865
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1866 if (!name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1867 name = PyUnicode_InternFromString("<lambda>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1868 if (!name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1869 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1870 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1871
82135
6917402c6191 evaluate lambda keyword-only defaults after positional defaults (#16967 again)
Benjamin Peterson <benjamin@python.org>
parents: 82133
diff changeset
1872 if (args->defaults)
6917402c6191 evaluate lambda keyword-only defaults after positional defaults (#16967 again)
Benjamin Peterson <benjamin@python.org>
parents: 82133
diff changeset
1873 VISIT_SEQ(c, expr, args->defaults);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1874 if (args->kwonlyargs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1875 int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1876 args->kw_defaults);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1877 if (res < 0) return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1878 kw_default_count = res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1879 }
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1880 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_LAMBDA,
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1881 (void *)e, e->lineno))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1882 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1883
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
1884 /* Make None the first constant, so the lambda can't have a
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
1885 docstring. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
1886 if (compiler_add_o(c, c->u->u_consts, Py_None) < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
1887 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
1888
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1889 c->u->u_argcount = asdl_seq_LEN(args->args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1890 c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1891 VISIT_IN_SCOPE(c, expr, e->v.Lambda.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1892 if (c->u->u_ste->ste_generator) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1893 ADDOP_IN_SCOPE(c, POP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1894 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1895 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1896 ADDOP_IN_SCOPE(c, RETURN_VALUE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1897 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1898 co = assemble(c, 1);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1899 qualname = c->u->u_qualname;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1900 Py_INCREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1901 compiler_exit_scope(c);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
1902 if (co == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1903 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1904
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1905 arglength = asdl_seq_LEN(args->defaults);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1906 arglength |= kw_default_count << 8;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1907 compiler_make_closure(c, co, arglength, qualname);
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
1908 Py_DECREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1909 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1910
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1911 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1912 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1913
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1914 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1915 compiler_if(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1916 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1917 basicblock *end, *next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1918 int constant;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1919 assert(s->kind == If_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1920 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1921 if (end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1922 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1923
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
1924 constant = expr_constant(c, s->v.If.test);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1925 /* constant = 0: "if 0"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1926 * constant = 1: "if 1", "if 2", ...
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1927 * constant = -1: rest */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1928 if (constant == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1929 if (s->v.If.orelse)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1930 VISIT_SEQ(c, stmt, s->v.If.orelse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1931 } else if (constant == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1932 VISIT_SEQ(c, stmt, s->v.If.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1933 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1934 if (s->v.If.orelse) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1935 next = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1936 if (next == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1937 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1938 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1939 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1940 next = end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1941 VISIT(c, expr, s->v.If.test);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1942 ADDOP_JABS(c, POP_JUMP_IF_FALSE, next);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1943 VISIT_SEQ(c, stmt, s->v.If.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1944 ADDOP_JREL(c, JUMP_FORWARD, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1945 if (s->v.If.orelse) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1946 compiler_use_next_block(c, next);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1947 VISIT_SEQ(c, stmt, s->v.If.orelse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1948 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1949 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1950 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1951 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1952 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1953
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1954 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1955 compiler_for(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1956 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1957 basicblock *start, *cleanup, *end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1958
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1959 start = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1960 cleanup = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1961 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1962 if (start == NULL || end == NULL || cleanup == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1963 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1964 ADDOP_JREL(c, SETUP_LOOP, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1965 if (!compiler_push_fblock(c, LOOP, start))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1966 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1967 VISIT(c, expr, s->v.For.iter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1968 ADDOP(c, GET_ITER);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1969 compiler_use_next_block(c, start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1970 ADDOP_JREL(c, FOR_ITER, cleanup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1971 VISIT(c, expr, s->v.For.target);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1972 VISIT_SEQ(c, stmt, s->v.For.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1973 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1974 compiler_use_next_block(c, cleanup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1975 ADDOP(c, POP_BLOCK);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1976 compiler_pop_fblock(c, LOOP, start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1977 VISIT_SEQ(c, stmt, s->v.For.orelse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1978 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1979 return 1;
35742
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1982 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1983 compiler_while(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
1984 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1985 basicblock *loop, *orelse, *end, *anchor = NULL;
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
1986 int constant = expr_constant(c, s->v.While.test);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1987
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1988 if (constant == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1989 if (s->v.While.orelse)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1990 VISIT_SEQ(c, stmt, s->v.While.orelse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1991 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1992 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1993 loop = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1994 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1995 if (constant == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1996 anchor = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1997 if (anchor == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1998 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
1999 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2000 if (loop == NULL || end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2001 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2002 if (s->v.While.orelse) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2003 orelse = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2004 if (orelse == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2005 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2006 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2007 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2008 orelse = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2009
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2010 ADDOP_JREL(c, SETUP_LOOP, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2011 compiler_use_next_block(c, loop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2012 if (!compiler_push_fblock(c, LOOP, loop))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2013 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2014 if (constant == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2015 VISIT(c, expr, s->v.While.test);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2016 ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2017 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2018 VISIT_SEQ(c, stmt, s->v.While.body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2019 ADDOP_JABS(c, JUMP_ABSOLUTE, loop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2020
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2021 /* XXX should the two POP instructions be in a separate block
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2022 if there is no else clause ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2023 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2024
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2025 if (constant == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2026 compiler_use_next_block(c, anchor);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2027 ADDOP(c, POP_BLOCK);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2028 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2029 compiler_pop_fblock(c, LOOP, loop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2030 if (orelse != NULL) /* what if orelse is just pass? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2031 VISIT_SEQ(c, stmt, s->v.While.orelse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2032 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2033
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2034 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2035 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2036
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2037 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2038 compiler_continue(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2039 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2040 static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2041 static const char IN_FINALLY_ERROR_MSG[] =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2042 "'continue' not supported inside 'finally' clause";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2043 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2044
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2045 if (!c->u->u_nfblocks)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2046 return compiler_error(c, LOOP_ERROR_MSG);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2047 i = c->u->u_nfblocks - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2048 switch (c->u->u_fblock[i].fb_type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2049 case LOOP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2050 ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2051 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2052 case EXCEPT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2053 case FINALLY_TRY:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2054 while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2055 /* Prevent continue anywhere under a finally
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2056 even if hidden in a sub-try or except. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2057 if (c->u->u_fblock[i].fb_type == FINALLY_END)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2058 return compiler_error(c, IN_FINALLY_ERROR_MSG);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2059 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2060 if (i == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2061 return compiler_error(c, LOOP_ERROR_MSG);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2062 ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2063 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2064 case FINALLY_END:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2065 return compiler_error(c, IN_FINALLY_ERROR_MSG);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2066 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2067
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2068 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2069 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2070
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2071 /* Code generated for "try: <body> finally: <finalbody>" is as follows:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2072
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2073 SETUP_FINALLY L
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2074 <code for body>
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2075 POP_BLOCK
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2076 LOAD_CONST <None>
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2077 L: <code for finalbody>
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2078 END_FINALLY
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2079
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2080 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
2081 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
2082 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
2083 block stack entry was created, and a label (here L).
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2084
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2085 SETUP_FINALLY:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2086 Pushes the current value stack level and the label
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2087 onto the block stack.
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2088 POP_BLOCK:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2089 Pops en entry from the block stack, and pops the value
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2090 stack until its level is the same as indicated on the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2091 block stack. (The label is ignored.)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2092 END_FINALLY:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2093 Pops a variable number of entries from the *value* stack
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2094 and re-raises the exception they specify. The number of
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2095 entries popped depends on the (pseudo) exception type.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2096
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2097 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
2098 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
2099 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
2100 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
2101 stack.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2102 */
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 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2105 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
2106 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2107 basicblock *body, *end;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2108 body = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2109 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2110 if (body == NULL || end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2111 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2112
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2113 ADDOP_JREL(c, SETUP_FINALLY, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2114 compiler_use_next_block(c, body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2115 if (!compiler_push_fblock(c, FINALLY_TRY, body))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2116 return 0;
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2117 if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) {
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2118 if (!compiler_try_except(c, s))
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2119 return 0;
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2120 }
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2121 else {
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2122 VISIT_SEQ(c, stmt, s->v.Try.body);
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2123 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2124 ADDOP(c, POP_BLOCK);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2125 compiler_pop_fblock(c, FINALLY_TRY, body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2126
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2127 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2128 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2129 if (!compiler_push_fblock(c, FINALLY_END, end))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2130 return 0;
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2131 VISIT_SEQ(c, stmt, s->v.Try.finalbody);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2132 ADDOP(c, END_FINALLY);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2133 compiler_pop_fblock(c, FINALLY_END, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2134
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2135 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2136 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2137
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2138 /*
51853
643d8d4fc8eb http://bugs.python.org/issue4715
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 51382
diff changeset
2139 Code generated for "try: S except E1 as V1: S1 except E2 as V2: S2 ...":
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2140 (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
2141 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
2142 associated value, and 'exc' the exception.)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2143
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2144 Value stack Label Instruction Argument
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2145 [] SETUP_EXCEPT L1
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2146 [] <code for S>
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2147 [] POP_BLOCK
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2148 [] JUMP_FORWARD L0
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2149
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2150 [tb, val, exc] L1: DUP )
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2151 [tb, val, exc, exc] <evaluate E1> )
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2152 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2153 [tb, val, exc, 1-or-0] POP_JUMP_IF_FALSE L2 )
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2154 [tb, val, exc] POP
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2155 [tb, val] <assign to V1> (or POP if no V1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2156 [tb] POP
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2157 [] <code for S1>
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2158 JUMP_FORWARD L0
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2159
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2160 [tb, val, exc] L2: DUP
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2161 .............................etc.......................
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2162
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2163 [tb, val, exc] Ln+1: END_FINALLY # re-raise exception
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2164
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2165 [] L0: <next statement>
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2166
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2167 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
2168 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2169 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2170 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
2171 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2172 basicblock *body, *orelse, *except, *end;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2173 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2174
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2175 body = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2176 except = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2177 orelse = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2178 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2179 if (body == NULL || except == NULL || orelse == NULL || end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2180 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2181 ADDOP_JREL(c, SETUP_EXCEPT, except);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2182 compiler_use_next_block(c, body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2183 if (!compiler_push_fblock(c, EXCEPT, body))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2184 return 0;
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2185 VISIT_SEQ(c, stmt, s->v.Try.body);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2186 ADDOP(c, POP_BLOCK);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2187 compiler_pop_fblock(c, EXCEPT, body);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2188 ADDOP_JREL(c, JUMP_FORWARD, orelse);
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2189 n = asdl_seq_LEN(s->v.Try.handlers);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2190 compiler_use_next_block(c, except);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2191 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2192 excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET(
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2193 s->v.Try.handlers, i);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2194 if (!handler->v.ExceptHandler.type && i < n-1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2195 return compiler_error(c, "default 'except:' must be last");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2196 c->u->u_lineno_set = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2197 c->u->u_lineno = handler->lineno;
64861
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
2198 c->u->u_col_offset = handler->col_offset;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2199 except = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2200 if (except == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2201 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2202 if (handler->v.ExceptHandler.type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2203 ADDOP(c, DUP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2204 VISIT(c, expr, handler->v.ExceptHandler.type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2205 ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2206 ADDOP_JABS(c, POP_JUMP_IF_FALSE, except);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2207 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2208 ADDOP(c, POP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2209 if (handler->v.ExceptHandler.name) {
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2210 basicblock *cleanup_end, *cleanup_body;
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2211
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2212 cleanup_end = compiler_new_block(c);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2213 cleanup_body = compiler_new_block(c);
70443
95117a2da450 fix spacing
Benjamin Peterson <benjamin@python.org>
parents: 70440
diff changeset
2214 if (!(cleanup_end || cleanup_body))
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2215 return 0;
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2216
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2217 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2218 ADDOP(c, POP_TOP);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2219
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2220 /*
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2221 try:
83451
74eb5f978471 Fix indentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83160
diff changeset
2222 # body
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2223 except type as name:
83451
74eb5f978471 Fix indentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83160
diff changeset
2224 try:
74eb5f978471 Fix indentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83160
diff changeset
2225 # body
74eb5f978471 Fix indentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83160
diff changeset
2226 finally:
74eb5f978471 Fix indentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83160
diff changeset
2227 name = None
74eb5f978471 Fix indentation.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 83160
diff changeset
2228 del name
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2229 */
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2230
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2231 /* second try: */
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2232 ADDOP_JREL(c, SETUP_FINALLY, cleanup_end);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2233 compiler_use_next_block(c, cleanup_body);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2234 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2235 return 0;
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2236
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2237 /* second # body */
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2238 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2239 ADDOP(c, POP_BLOCK);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2240 ADDOP(c, POP_EXCEPT);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2241 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2242
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2243 /* finally: */
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2244 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2245 compiler_use_next_block(c, cleanup_end);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2246 if (!compiler_push_fblock(c, FINALLY_END, cleanup_end))
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2247 return 0;
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2248
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2249 /* name = None */
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2250 ADDOP_O(c, LOAD_CONST, Py_None, consts);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2251 compiler_nameop(c, handler->v.ExceptHandler.name, Store);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2252
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2253 /* del name */
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2254 compiler_nameop(c, handler->v.ExceptHandler.name, Del);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2255
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2256 ADDOP(c, END_FINALLY);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2257 compiler_pop_fblock(c, FINALLY_END, cleanup_end);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2258 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2259 else {
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2260 basicblock *cleanup_body;
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2261
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2262 cleanup_body = compiler_new_block(c);
70443
95117a2da450 fix spacing
Benjamin Peterson <benjamin@python.org>
parents: 70440
diff changeset
2263 if (!cleanup_body)
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2264 return 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2265
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 40529
diff changeset
2266 ADDOP(c, POP_TOP);
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2267 ADDOP(c, POP_TOP);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2268 compiler_use_next_block(c, cleanup_body);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2269 if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body))
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2270 return 0;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2271 VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body);
70440
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2272 ADDOP(c, POP_EXCEPT);
4e472427315e fix indentation
Benjamin Peterson <benjamin@python.org>
parents: 65536
diff changeset
2273 compiler_pop_fblock(c, FINALLY_TRY, cleanup_body);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2274 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2275 ADDOP_JREL(c, JUMP_FORWARD, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2276 compiler_use_next_block(c, except);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2277 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2278 ADDOP(c, END_FINALLY);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2279 compiler_use_next_block(c, orelse);
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2280 VISIT_SEQ(c, stmt, s->v.Try.orelse);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2281 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2282 return 1;
35742
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2285 static int
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2286 compiler_try(struct compiler *c, stmt_ty s) {
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2287 if (s->v.Try.finalbody && asdl_seq_LEN(s->v.Try.finalbody))
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2288 return compiler_try_finally(c, s);
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2289 else
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2290 return compiler_try_except(c, s);
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2291 }
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2292
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2293
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2294 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2295 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
2296 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2297 /* The IMPORT_NAME opcode was already generated. This function
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2298 merely needs to bind the result to a name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2299
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2300 If there is a dot in name, we need to split it and emit a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2301 LOAD_ATTR for each name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2302 */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2303 Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2304 PyUnicode_GET_LENGTH(name), 1);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2305 if (dot == -2)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2306 return -1;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2307 if (dot != -1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2308 /* Consume the base module name to get the first attribute */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2309 Py_ssize_t pos = dot + 1;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2310 while (dot != -1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2311 PyObject *attr;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2312 dot = PyUnicode_FindChar(name, '.', pos,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2313 PyUnicode_GET_LENGTH(name), 1);
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2314 if (dot == -2)
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2315 return -1;
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2316 attr = PyUnicode_Substring(name, pos,
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2317 (dot != -1) ? dot :
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2318 PyUnicode_GET_LENGTH(name));
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2319 if (!attr)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2320 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2321 ADDOP_O(c, LOAD_ATTR, attr, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2322 Py_DECREF(attr);
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2323 pos = dot + 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2324 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2325 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2326 return compiler_nameop(c, asname, Store);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2327 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2328
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2329 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2330 compiler_import(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2331 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2332 /* The Import node stores a module name like a.b.c as a single
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2333 string. This is convenient for all cases except
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2334 import a.b.c as d
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2335 where we need to parse that string to extract the individual
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2336 module names.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2337 XXX Perhaps change the representation to make this case simpler?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2338 */
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2339 Py_ssize_t i, n = asdl_seq_LEN(s->v.Import.names);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2340
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2341 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2342 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2343 int r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2344 PyObject *level;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2345
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2346 level = PyLong_FromLong(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2347 if (level == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2348 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2349
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2350 ADDOP_O(c, LOAD_CONST, level, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2351 Py_DECREF(level);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2352 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2353 ADDOP_NAME(c, IMPORT_NAME, alias->name, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2354
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2355 if (alias->asname) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2356 r = compiler_import_as(c, alias->name, alias->asname);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2357 if (!r)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2358 return r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2359 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2360 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2361 identifier tmp = alias->name;
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2362 Py_ssize_t dot = PyUnicode_FindChar(
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2363 alias->name, '.', 0, PyUnicode_GET_LENGTH(alias->name), 1);
84563
aaa6e8b8a5c9 Issue #18408: Fix compiler_import() to handle PyUnicode_Substring() failure properly
Victor Stinner <victor.stinner@gmail.com>
parents: 83792
diff changeset
2364 if (dot != -1) {
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2365 tmp = PyUnicode_Substring(alias->name, 0, dot);
84563
aaa6e8b8a5c9 Issue #18408: Fix compiler_import() to handle PyUnicode_Substring() failure properly
Victor Stinner <victor.stinner@gmail.com>
parents: 83792
diff changeset
2366 if (tmp == NULL)
aaa6e8b8a5c9 Issue #18408: Fix compiler_import() to handle PyUnicode_Substring() failure properly
Victor Stinner <victor.stinner@gmail.com>
parents: 83792
diff changeset
2367 return 0;
aaa6e8b8a5c9 Issue #18408: Fix compiler_import() to handle PyUnicode_Substring() failure properly
Victor Stinner <victor.stinner@gmail.com>
parents: 83792
diff changeset
2368 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2369 r = compiler_nameop(c, tmp, Store);
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2370 if (dot != -1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2371 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2372 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2373 if (!r)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2374 return r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2375 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2376 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2377 return 1;
35742
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 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
2382 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2383 Py_ssize_t i, n = asdl_seq_LEN(s->v.ImportFrom.names);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2384
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2385 PyObject *names = PyTuple_New(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2386 PyObject *level;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2387 static PyObject *empty_string;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2388
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2389 if (!empty_string) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2390 empty_string = PyUnicode_FromString("");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2391 if (!empty_string)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2392 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2393 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2394
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2395 if (!names)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2396 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2397
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2398 level = PyLong_FromLong(s->v.ImportFrom.level);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2399 if (!level) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2400 Py_DECREF(names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2401 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2402 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2403
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2404 /* build up the names */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2405 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2406 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2407 Py_INCREF(alias->name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2408 PyTuple_SET_ITEM(names, i, alias->name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2409 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2410
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2411 if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2412 !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2413 Py_DECREF(level);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2414 Py_DECREF(names);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2415 return compiler_error(c, "from __future__ imports must occur "
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2416 "at the beginning of the file");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2417 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2418
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2419 ADDOP_O(c, LOAD_CONST, level, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2420 Py_DECREF(level);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2421 ADDOP_O(c, LOAD_CONST, names, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2422 Py_DECREF(names);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2423 if (s->v.ImportFrom.module) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2424 ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2425 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2426 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2427 ADDOP_NAME(c, IMPORT_NAME, empty_string, names);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
2428 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2429 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2430 alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2431 identifier store_name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2432
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2433 if (i == 0 && PyUnicode_READ_CHAR(alias->name, 0) == '*') {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2434 assert(n == 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2435 ADDOP(c, IMPORT_STAR);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2436 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2437 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2438
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2439 ADDOP_NAME(c, IMPORT_FROM, alias->name, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2440 store_name = alias->name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2441 if (alias->asname)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2442 store_name = alias->asname;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2443
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2444 if (!compiler_nameop(c, store_name, Store)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2445 Py_DECREF(names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2446 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2447 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2448 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2449 /* remove imported module */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2450 ADDOP(c, POP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2451 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2452 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2453
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2454 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2455 compiler_assert(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2456 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2457 static PyObject *assertion_error = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2458 basicblock *end;
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2459 PyObject* msg;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2460
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
2461 if (c->c_optimize)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2462 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2463 if (assertion_error == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2464 assertion_error = PyUnicode_InternFromString("AssertionError");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2465 if (assertion_error == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2466 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2467 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2468 if (s->v.Assert.test->kind == Tuple_kind &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2469 asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) {
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2470 msg = PyUnicode_FromString("assertion is always true, "
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2471 "perhaps remove parentheses?");
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2472 if (msg == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2473 return 0;
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2474 if (PyErr_WarnExplicitObject(PyExc_SyntaxWarning, msg,
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2475 c->c_filename, c->u->u_lineno,
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2476 NULL, NULL) == -1) {
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2477 Py_DECREF(msg);
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2478 return 0;
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2479 }
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
2480 Py_DECREF(msg);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2481 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2482 VISIT(c, expr, s->v.Assert.test);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2483 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2484 if (end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2485 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2486 ADDOP_JABS(c, POP_JUMP_IF_TRUE, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2487 ADDOP_O(c, LOAD_GLOBAL, assertion_error, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2488 if (s->v.Assert.msg) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2489 VISIT(c, expr, s->v.Assert.msg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2490 ADDOP_I(c, CALL_FUNCTION, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2491 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2492 ADDOP_I(c, RAISE_VARARGS, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2493 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2494 return 1;
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 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2498 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
2499 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2500 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2501
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2502 /* Always assign a lineno to the next instruction for a stmt. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2503 c->u->u_lineno = s->lineno;
64861
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
2504 c->u->u_col_offset = s->col_offset;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2505 c->u->u_lineno_set = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2506
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2507 switch (s->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2508 case FunctionDef_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2509 return compiler_function(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2510 case ClassDef_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2511 return compiler_class(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2512 case Return_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2513 if (c->u->u_ste->ste_type != FunctionBlock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2514 return compiler_error(c, "'return' outside function");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2515 if (s->v.Return.value) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2516 VISIT(c, expr, s->v.Return.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2517 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2518 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2519 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2520 ADDOP(c, RETURN_VALUE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2521 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2522 case Delete_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2523 VISIT_SEQ(c, expr, s->v.Delete.targets)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2524 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2525 case Assign_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2526 n = asdl_seq_LEN(s->v.Assign.targets);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2527 VISIT(c, expr, s->v.Assign.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2528 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2529 if (i < n - 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2530 ADDOP(c, DUP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2531 VISIT(c, expr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2532 (expr_ty)asdl_seq_GET(s->v.Assign.targets, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2533 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2534 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2535 case AugAssign_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2536 return compiler_augassign(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2537 case For_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2538 return compiler_for(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2539 case While_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2540 return compiler_while(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2541 case If_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2542 return compiler_if(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2543 case Raise_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2544 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2545 if (s->v.Raise.exc) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2546 VISIT(c, expr, s->v.Raise.exc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2547 n++;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2548 if (s->v.Raise.cause) {
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2549 VISIT(c, expr, s->v.Raise.cause);
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2550 n++;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2551 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2552 }
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2553 ADDOP_I(c, RAISE_VARARGS, (int)n);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2554 break;
70499
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2555 case Try_kind:
e0e663132363 unify TryExcept and TryFinally (closes #12199)
Benjamin Peterson <benjamin@python.org>
parents: 70445
diff changeset
2556 return compiler_try(c, s);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2557 case Assert_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2558 return compiler_assert(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2559 case Import_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2560 return compiler_import(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2561 case ImportFrom_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2562 return compiler_from_import(c, s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2563 case Global_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2564 case Nonlocal_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2565 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2566 case Expr_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2567 if (c->c_interactive && c->c_nestlevel <= 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2568 VISIT(c, expr, s->v.Expr.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2569 ADDOP(c, PRINT_EXPR);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2570 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2571 else if (s->v.Expr.value->kind != Str_kind &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2572 s->v.Expr.value->kind != Num_kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2573 VISIT(c, expr, s->v.Expr.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2574 ADDOP(c, POP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2575 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2576 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2577 case Pass_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2578 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2579 case Break_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2580 if (!compiler_in_loop(c))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2581 return compiler_error(c, "'break' outside loop");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2582 ADDOP(c, BREAK_LOOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2583 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2584 case Continue_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2585 return compiler_continue(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2586 case With_kind:
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
2587 return compiler_with(c, s, 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2588 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2589 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2590 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2591
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2592 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2593 unaryop(unaryop_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2594 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2595 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2596 case Invert:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2597 return UNARY_INVERT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2598 case Not:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2599 return UNARY_NOT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2600 case UAdd:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2601 return UNARY_POSITIVE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2602 case USub:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2603 return UNARY_NEGATIVE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2604 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2605 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2606 "unary op %d should not be possible", op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2607 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2608 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2609 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2610
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2611 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2612 binop(struct compiler *c, operator_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2613 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2614 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2615 case Add:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2616 return BINARY_ADD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2617 case Sub:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2618 return BINARY_SUBTRACT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2619 case Mult:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2620 return BINARY_MULTIPLY;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2621 case Div:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2622 return BINARY_TRUE_DIVIDE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2623 case Mod:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2624 return BINARY_MODULO;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2625 case Pow:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2626 return BINARY_POWER;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2627 case LShift:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2628 return BINARY_LSHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2629 case RShift:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2630 return BINARY_RSHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2631 case BitOr:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2632 return BINARY_OR;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2633 case BitXor:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2634 return BINARY_XOR;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2635 case BitAnd:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2636 return BINARY_AND;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2637 case FloorDiv:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2638 return BINARY_FLOOR_DIVIDE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2639 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2640 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2641 "binary op %d should not be possible", op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2642 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2643 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2644 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2645
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2646 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2647 cmpop(cmpop_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2648 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2649 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2650 case Eq:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2651 return PyCmp_EQ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2652 case NotEq:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2653 return PyCmp_NE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2654 case Lt:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2655 return PyCmp_LT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2656 case LtE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2657 return PyCmp_LE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2658 case Gt:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2659 return PyCmp_GT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2660 case GtE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2661 return PyCmp_GE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2662 case Is:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2663 return PyCmp_IS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2664 case IsNot:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2665 return PyCmp_IS_NOT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2666 case In:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2667 return PyCmp_IN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2668 case NotIn:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2669 return PyCmp_NOT_IN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2670 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2671 return PyCmp_BAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2672 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2673 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2674
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2675 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2676 inplace_binop(struct compiler *c, operator_ty op)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2677 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2678 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2679 case Add:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2680 return INPLACE_ADD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2681 case Sub:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2682 return INPLACE_SUBTRACT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2683 case Mult:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2684 return INPLACE_MULTIPLY;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2685 case Div:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2686 return INPLACE_TRUE_DIVIDE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2687 case Mod:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2688 return INPLACE_MODULO;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2689 case Pow:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2690 return INPLACE_POWER;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2691 case LShift:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2692 return INPLACE_LSHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2693 case RShift:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2694 return INPLACE_RSHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2695 case BitOr:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2696 return INPLACE_OR;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2697 case BitXor:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2698 return INPLACE_XOR;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2699 case BitAnd:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2700 return INPLACE_AND;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2701 case FloorDiv:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2702 return INPLACE_FLOOR_DIVIDE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2703 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2704 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2705 "inplace binary op %d should not be possible", op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2706 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2707 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2708 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2709
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2710 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2711 compiler_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
2712 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2713 int op, scope;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2714 Py_ssize_t arg;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2715 enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2716
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2717 PyObject *dict = c->u->u_names;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2718 PyObject *mangled;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2719 /* XXX AugStore isn't used anywhere! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2720
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2721 mangled = _Py_Mangle(c->u->u_private, name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2722 if (!mangled)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2723 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2724
80739
0238cc842805 assert than we never try to deal with True, False, or None as a name
Benjamin Peterson <benjamin@python.org>
parents: 80738
diff changeset
2725 assert(PyUnicode_CompareWithASCIIString(name, "None") &&
0238cc842805 assert than we never try to deal with True, False, or None as a name
Benjamin Peterson <benjamin@python.org>
parents: 80738
diff changeset
2726 PyUnicode_CompareWithASCIIString(name, "True") &&
0238cc842805 assert than we never try to deal with True, False, or None as a name
Benjamin Peterson <benjamin@python.org>
parents: 80738
diff changeset
2727 PyUnicode_CompareWithASCIIString(name, "False"));
0238cc842805 assert than we never try to deal with True, False, or None as a name
Benjamin Peterson <benjamin@python.org>
parents: 80738
diff changeset
2728
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2729 op = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2730 optype = OP_NAME;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2731 scope = PyST_GetScope(c->u->u_ste, mangled);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2732 switch (scope) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2733 case FREE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2734 dict = c->u->u_freevars;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2735 optype = OP_DEREF;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2736 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2737 case CELL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2738 dict = c->u->u_cellvars;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2739 optype = OP_DEREF;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2740 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2741 case LOCAL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2742 if (c->u->u_ste->ste_type == FunctionBlock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2743 optype = OP_FAST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2744 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2745 case GLOBAL_IMPLICIT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2746 if (c->u->u_ste->ste_type == FunctionBlock &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2747 !c->u->u_ste->ste_unoptimized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2748 optype = OP_GLOBAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2749 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2750 case GLOBAL_EXPLICIT:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2751 optype = OP_GLOBAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2752 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2753 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2754 /* scope can be 0 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2755 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2756 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2757
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2758 /* XXX Leave assert here, but handle __doc__ and the like better */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
2759 assert(scope || PyUnicode_READ_CHAR(name, 0) == '_');
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2760
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2761 switch (optype) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2762 case OP_DEREF:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2763 switch (ctx) {
83572
cf65c7a75f55 check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents: 83452
diff changeset
2764 case Load:
cf65c7a75f55 check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents: 83452
diff changeset
2765 op = (c->u->u_ste->ste_type == ClassBlock) ? LOAD_CLASSDEREF : LOAD_DEREF;
cf65c7a75f55 check local class namespace before reaching for cells (closes #17853)
Benjamin Peterson <benjamin@python.org>
parents: 83452
diff changeset
2766 break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2767 case Store: op = STORE_DEREF; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2768 case AugLoad:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2769 case AugStore:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2770 break;
64620
25cc226dc9bd #4617: Previously it was illegal to delete a name from the local
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 64439
diff changeset
2771 case Del: op = DELETE_DEREF; break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2772 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2773 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2774 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2775 "param invalid for deref variable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2776 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2777 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2778 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2779 case OP_FAST:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2780 switch (ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2781 case Load: op = LOAD_FAST; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2782 case Store: op = STORE_FAST; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2783 case Del: op = DELETE_FAST; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2784 case AugLoad:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2785 case AugStore:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2786 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2787 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2788 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2789 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2790 "param invalid for local variable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2791 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2792 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2793 ADDOP_O(c, op, mangled, varnames);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2794 Py_DECREF(mangled);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2795 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2796 case OP_GLOBAL:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2797 switch (ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2798 case Load: op = LOAD_GLOBAL; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2799 case Store: op = STORE_GLOBAL; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2800 case Del: op = DELETE_GLOBAL; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2801 case AugLoad:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2802 case AugStore:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2803 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2804 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2805 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2806 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2807 "param invalid for global variable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2808 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2809 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2810 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2811 case OP_NAME:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2812 switch (ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2813 case Load: op = LOAD_NAME; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2814 case Store: op = STORE_NAME; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2815 case Del: op = DELETE_NAME; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2816 case AugLoad:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2817 case AugStore:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2818 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2819 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2820 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2821 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2822 "param invalid for name variable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2823 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2824 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2825 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2826 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2827
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2828 assert(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2829 arg = compiler_add_o(c, dict, mangled);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2830 Py_DECREF(mangled);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2831 if (arg < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2832 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2833 return compiler_addop_i(c, op, arg);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2834 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2835
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2836 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2837 compiler_boolop(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2838 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2839 basicblock *end;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2840 int jumpi;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2841 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2842 asdl_seq *s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2843
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2844 assert(e->kind == BoolOp_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2845 if (e->v.BoolOp.op == And)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2846 jumpi = JUMP_IF_FALSE_OR_POP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2847 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2848 jumpi = JUMP_IF_TRUE_OR_POP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2849 end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2850 if (end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2851 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2852 s = e->v.BoolOp.values;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2853 n = asdl_seq_LEN(s) - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2854 assert(n >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2855 for (i = 0; i < n; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2856 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2857 ADDOP_JABS(c, jumpi, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2858 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2859 VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2860 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2861 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2862 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2863
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2864 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2865 compiler_list(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2866 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2867 Py_ssize_t n = asdl_seq_LEN(e->v.List.elts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2868 if (e->v.List.ctx == Store) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2869 int i, seen_star = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2870 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2871 expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2872 if (elt->kind == Starred_kind && !seen_star) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2873 if ((i >= (1 << 8)) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2874 (n-i-1 >= (INT_MAX >> 8)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2875 return compiler_error(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2876 "too many expressions in "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2877 "star-unpacking assignment");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2878 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2879 seen_star = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2880 asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2881 } else if (elt->kind == Starred_kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2882 return compiler_error(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2883 "two starred expressions in assignment");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2884 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2885 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2886 if (!seen_star) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2887 ADDOP_I(c, UNPACK_SEQUENCE, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2888 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2889 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2890 VISIT_SEQ(c, expr, e->v.List.elts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2891 if (e->v.List.ctx == Load) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2892 ADDOP_I(c, BUILD_LIST, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2893 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2894 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2895 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2896
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2897 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2898 compiler_tuple(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2899 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2900 Py_ssize_t n = asdl_seq_LEN(e->v.Tuple.elts);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2901 if (e->v.Tuple.ctx == Store) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2902 int i, seen_star = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2903 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2904 expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2905 if (elt->kind == Starred_kind && !seen_star) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2906 if ((i >= (1 << 8)) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2907 (n-i-1 >= (INT_MAX >> 8)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2908 return compiler_error(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2909 "too many expressions in "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2910 "star-unpacking assignment");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2911 ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2912 seen_star = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2913 asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2914 } else if (elt->kind == Starred_kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2915 return compiler_error(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2916 "two starred expressions in assignment");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2917 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2918 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2919 if (!seen_star) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2920 ADDOP_I(c, UNPACK_SEQUENCE, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2921 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2922 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2923 VISIT_SEQ(c, expr, e->v.Tuple.elts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2924 if (e->v.Tuple.ctx == Load) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2925 ADDOP_I(c, BUILD_TUPLE, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2926 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2927 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2928 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2929
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2930 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2931 compiler_compare(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2932 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2933 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2934 basicblock *cleanup = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2935
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2936 /* XXX the logic can be cleaned up for 1 or multiple comparisons */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2937 VISIT(c, expr, e->v.Compare.left);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2938 n = asdl_seq_LEN(e->v.Compare.ops);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2939 assert(n > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2940 if (n > 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2941 cleanup = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2942 if (cleanup == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2943 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2944 VISIT(c, expr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2945 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2946 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2947 for (i = 1; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2948 ADDOP(c, DUP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2949 ADDOP(c, ROT_THREE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2950 ADDOP_I(c, COMPARE_OP,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2951 cmpop((cmpop_ty)(asdl_seq_GET(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2952 e->v.Compare.ops, i - 1))));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2953 ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2954 NEXT_BLOCK(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2955 if (i < (n - 1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2956 VISIT(c, expr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2957 (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2958 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2959 VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2960 ADDOP_I(c, COMPARE_OP,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2961 cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1))));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2962 if (n > 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2963 basicblock *end = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2964 if (end == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2965 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2966 ADDOP_JREL(c, JUMP_FORWARD, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2967 compiler_use_next_block(c, cleanup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2968 ADDOP(c, ROT_TWO);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2969 ADDOP(c, POP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2970 compiler_use_next_block(c, end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2971 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2972 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2973 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2974
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2975 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2976 compiler_call(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
2977 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2978 VISIT(c, expr, e->v.Call.func);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2979 return compiler_call_helper(c, 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2980 e->v.Call.args,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2981 e->v.Call.keywords,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2982 e->v.Call.starargs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2983 e->v.Call.kwargs);
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2984 }
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2985
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2986 /* 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
2987 static int
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2988 compiler_call_helper(struct compiler *c,
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2989 Py_ssize_t n, /* Args already pushed */
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2990 asdl_seq *args,
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2991 asdl_seq *keywords,
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2992 expr_ty starargs,
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
2993 expr_ty kwargs)
41226
19f7ff443718 Implement PEP 3115 -- new metaclass syntax and semantics.
Guido van Rossum <guido@python.org>
parents: 40965
diff changeset
2994 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2995 int code = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2996
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2997 n += asdl_seq_LEN(args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2998 VISIT_SEQ(c, expr, args);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
2999 if (keywords) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3000 VISIT_SEQ(c, keyword, keywords);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3001 n |= asdl_seq_LEN(keywords) << 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3002 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3003 if (starargs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3004 VISIT(c, expr, starargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3005 code |= 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3006 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3007 if (kwargs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3008 VISIT(c, expr, kwargs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3009 code |= 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3010 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3011 switch (code) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3012 case 0:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3013 ADDOP_I(c, CALL_FUNCTION, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3014 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3015 case 1:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3016 ADDOP_I(c, CALL_FUNCTION_VAR, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3017 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3018 case 2:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3019 ADDOP_I(c, CALL_FUNCTION_KW, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3020 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3021 case 3:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3022 ADDOP_I(c, CALL_FUNCTION_VAR_KW, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3023 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3024 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3025 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3026 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3027
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3028
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3029 /* 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
3030 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
3031 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
3032 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
3033 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
3034 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
3035 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
3036 when the function is called.
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3037 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
3038 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
3039
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3040 Possible cleanups:
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3041 - 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
3042 */
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3043
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3044 static int
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3045 compiler_comprehension_generator(struct compiler *c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3046 asdl_seq *generators, int gen_index,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3047 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
3048 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3049 /* generate code for the iterator, then each of the ifs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3050 and then write to the element */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3051
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3052 comprehension_ty gen;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3053 basicblock *start, *anchor, *skip, *if_cleanup;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
3054 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3055
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3056 start = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3057 skip = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3058 if_cleanup = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3059 anchor = compiler_new_block(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3060
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3061 if (start == NULL || skip == NULL || if_cleanup == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3062 anchor == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3063 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3064
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3065 gen = (comprehension_ty)asdl_seq_GET(generators, gen_index);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3066
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3067 if (gen_index == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3068 /* Receive outermost iter as an implicit argument */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3069 c->u->u_argcount = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3070 ADDOP_I(c, LOAD_FAST, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3071 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3072 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3073 /* Sub-iter - calculate on the fly */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3074 VISIT(c, expr, gen->iter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3075 ADDOP(c, GET_ITER);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3076 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3077 compiler_use_next_block(c, start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3078 ADDOP_JREL(c, FOR_ITER, anchor);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3079 NEXT_BLOCK(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3080 VISIT(c, expr, gen->target);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3081
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3082 /* XXX this needs to be cleaned up...a lot! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3083 n = asdl_seq_LEN(gen->ifs);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3084 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3085 expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3086 VISIT(c, expr, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3087 ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3088 NEXT_BLOCK(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3089 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3090
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3091 if (++gen_index < asdl_seq_LEN(generators))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3092 if (!compiler_comprehension_generator(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3093 generators, gen_index,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3094 elt, val, type))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3095 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3096
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3097 /* only append after the last for generator */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3098 if (gen_index >= asdl_seq_LEN(generators)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3099 /* comprehension specific code */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3100 switch (type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3101 case COMP_GENEXP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3102 VISIT(c, expr, elt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3103 ADDOP(c, YIELD_VALUE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3104 ADDOP(c, POP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3105 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3106 case COMP_LISTCOMP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3107 VISIT(c, expr, elt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3108 ADDOP_I(c, LIST_APPEND, gen_index + 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3109 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3110 case COMP_SETCOMP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3111 VISIT(c, expr, elt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3112 ADDOP_I(c, SET_ADD, gen_index + 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3113 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3114 case COMP_DICTCOMP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3115 /* With 'd[k] = v', v is evaluated before k, so we do
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3116 the same. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3117 VISIT(c, expr, val);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3118 VISIT(c, expr, elt);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3119 ADDOP_I(c, MAP_ADD, gen_index + 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3120 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3121 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3122 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3123 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3124
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3125 compiler_use_next_block(c, skip);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3126 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3127 compiler_use_next_block(c, if_cleanup);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3128 ADDOP_JABS(c, JUMP_ABSOLUTE, start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3129 compiler_use_next_block(c, anchor);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3130
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3131 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3132 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3133
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3134 static int
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3135 compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3136 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
3137 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3138 PyCodeObject *co = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3139 expr_ty outermost_iter;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
3140 PyObject *qualname = NULL;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3141
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3142 outermost_iter = ((comprehension_ty)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3143 asdl_seq_GET(generators, 0))->iter;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3144
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
3145 if (!compiler_enter_scope(c, name, COMPILER_SCOPE_COMPREHENSION,
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
3146 (void *)e, e->lineno))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3147 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3148
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3149 if (type != COMP_GENEXP) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3150 int op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3151 switch (type) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3152 case COMP_LISTCOMP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3153 op = BUILD_LIST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3154 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3155 case COMP_SETCOMP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3156 op = BUILD_SET;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3157 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3158 case COMP_DICTCOMP:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3159 op = BUILD_MAP;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3160 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3161 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3162 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3163 "unknown comprehension type %d", type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3164 goto error_in_scope;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3165 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3166
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3167 ADDOP_I(c, op, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3168 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3169
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3170 if (!compiler_comprehension_generator(c, generators, 0, elt,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3171 val, type))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3172 goto error_in_scope;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3173
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3174 if (type != COMP_GENEXP) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3175 ADDOP(c, RETURN_VALUE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3176 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3177
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3178 co = assemble(c, 1);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
3179 qualname = c->u->u_qualname;
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
3180 Py_INCREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3181 compiler_exit_scope(c);
86521
bb2affc1e317 cleanup the construction of __qualname__ (closes #19301 again)
Benjamin Peterson <benjamin@python.org>
parents: 86509
diff changeset
3182 if (co == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3183 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3184
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
3185 if (!compiler_make_closure(c, co, 0, qualname))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3186 goto error;
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
3187 Py_DECREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3188 Py_DECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3189
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3190 VISIT(c, expr, outermost_iter);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3191 ADDOP(c, GET_ITER);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3192 ADDOP_I(c, CALL_FUNCTION, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3193 return 1;
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3194 error_in_scope:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3195 compiler_exit_scope(c);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3196 error:
73738
e1dbc72bd97f PEP 3155 / issue #13448: Qualified name for classes and functions.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72493
diff changeset
3197 Py_XDECREF(qualname);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3198 Py_XDECREF(co);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3199 return 0;
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3200 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3201
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3202 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3203 compiler_genexp(struct compiler *c, expr_ty e)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3204 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3205 static identifier name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3206 if (!name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3207 name = PyUnicode_FromString("<genexpr>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3208 if (!name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3209 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3210 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3211 assert(e->kind == GeneratorExp_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3212 return compiler_comprehension(c, e, COMP_GENEXP, name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3213 e->v.GeneratorExp.generators,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3214 e->v.GeneratorExp.elt, NULL);
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3215 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3216
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3217 static int
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3218 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
3219 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3220 static identifier name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3221 if (!name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3222 name = PyUnicode_FromString("<listcomp>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3223 if (!name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3224 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3225 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3226 assert(e->kind == ListComp_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3227 return compiler_comprehension(c, e, COMP_LISTCOMP, name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3228 e->v.ListComp.generators,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3229 e->v.ListComp.elt, NULL);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3230 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3231
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3232 static int
41464
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3233 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
3234 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3235 static identifier name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3236 if (!name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3237 name = PyUnicode_FromString("<setcomp>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3238 if (!name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3239 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3240 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3241 assert(e->kind == SetComp_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3242 return compiler_comprehension(c, e, COMP_SETCOMP, name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3243 e->v.SetComp.generators,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3244 e->v.SetComp.elt, NULL);
42193
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3245 }
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3246
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3247
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3248 static int
090588a17490 Merged revisions 56154-56264 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42089
diff changeset
3249 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
3250 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3251 static identifier name;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3252 if (!name) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3253 name = PyUnicode_FromString("<dictcomp>");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3254 if (!name)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3255 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3256 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3257 assert(e->kind == DictComp_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3258 return compiler_comprehension(c, e, COMP_DICTCOMP, name,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3259 e->v.DictComp.generators,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3260 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
3261 }
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3262
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3263
060c79f6d919 Hide list comp variables and support set comprehensions
Nick Coghlan <ncoghlan@gmail.com>
parents: 41273
diff changeset
3264 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3265 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
3266 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3267 ADDOP_O(c, LOAD_CONST, k->arg, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3268 VISIT(c, expr, k->value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3269 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3270 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3271
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3272 /* 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
3273 whether they are true or false.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3274
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3275 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
3276 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3277
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3278 static int
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
3279 expr_constant(struct compiler *c, expr_ty e)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3280 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3281 char *id;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3282 switch (e->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3283 case Ellipsis_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3284 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3285 case Num_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3286 return PyObject_IsTrue(e->v.Num.n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3287 case Str_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3288 return PyObject_IsTrue(e->v.Str.s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3289 case Name_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3290 /* optimize away names that can't be reassigned */
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 70889
diff changeset
3291 id = PyUnicode_AsUTF8(e->v.Name.id);
80738
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3292 if (id && strcmp(id, "__debug__") == 0)
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3293 return !c->c_optimize;
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3294 return -1;
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3295 case NameConstant_kind: {
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3296 PyObject *o = e->v.NameConstant.value;
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3297 if (o == Py_None)
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3298 return 0;
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3299 else if (o == Py_True)
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3300 return 1;
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3301 else if (o == Py_False)
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3302 return 0;
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3303 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3304 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3305 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3306 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3307 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3308
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3309 /*
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3310 Implements the with statement from PEP 343.
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3311
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3312 The semantics outlined in that PEP are as follows:
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3313
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3314 with EXPR as VAR:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3315 BLOCK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3316
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3317 It is implemented roughly as:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3318
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
3319 context = EXPR
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3320 exit = context.__exit__ # not calling it
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3321 value = context.__enter__()
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3322 try:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3323 VAR = value # if VAR present in the syntax
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3324 BLOCK
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3325 finally:
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3326 if an exception was raised:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3327 exc = copy of (exception, instance, traceback)
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3328 else:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3329 exc = (None, None, None)
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3330 exit(*exc)
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3331 */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3332 static int
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3333 compiler_with(struct compiler *c, stmt_ty s, int pos)
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3334 {
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3335 basicblock *block, *finally;
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3336 withitem_ty item = asdl_seq_GET(s->v.With.items, pos);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3337
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3338 assert(s->kind == With_kind);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3339
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3340 block = compiler_new_block(c);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3341 finally = compiler_new_block(c);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3342 if (!block || !finally)
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
3343 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3344
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
3345 /* Evaluate EXPR */
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3346 VISIT(c, expr, item->context_expr);
54889
3aaf2e065db0 Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53816
diff changeset
3347 ADDOP_JREL(c, SETUP_WITH, finally);
3aaf2e065db0 Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53816
diff changeset
3348
3aaf2e065db0 Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53816
diff changeset
3349 /* SETUP_WITH pushes a finally block. */
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3350 compiler_use_next_block(c, block);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3351 if (!compiler_push_fblock(c, FINALLY_TRY, block)) {
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
3352 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3353 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3354
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3355 if (item->optional_vars) {
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3356 VISIT(c, expr, item->optional_vars);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3357 }
54889
3aaf2e065db0 Merged revisions 72912,72920,72940 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53816
diff changeset
3358 else {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3359 /* Discard result from context.__enter__() */
62455
eb95af0a99cb Merged revisions 82169 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62389
diff changeset
3360 ADDOP(c, POP_TOP);
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3361 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3362
70438
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3363 pos++;
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3364 if (pos == asdl_seq_LEN(s->v.With.items))
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3365 /* BLOCK code */
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3366 VISIT_SEQ(c, stmt, s->v.With.body)
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3367 else if (!compiler_with(c, s, pos))
9b11cc4e2918 reflect with statements with multiple items in the AST (closes #12106)
Benjamin Peterson <benjamin@python.org>
parents: 70436
diff changeset
3368 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3369
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3370 /* End of try block; start the finally block */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3371 ADDOP(c, POP_BLOCK);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3372 compiler_pop_fblock(c, FINALLY_TRY, block);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3373
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3374 ADDOP_O(c, LOAD_CONST, Py_None, consts);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3375 compiler_use_next_block(c, finally);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3376 if (!compiler_push_fblock(c, FINALLY_END, finally))
62456
2907ce8bfbb6 Merged revisions 82171 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62393
diff changeset
3377 return 0;
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3378
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
3379 /* 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
3380 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
3381 opcode. */
36695
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3382 ADDOP(c, WITH_CLEANUP);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3383
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3384 /* Finally block ends. */
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3385 ADDOP(c, END_FINALLY);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3386 compiler_pop_fblock(c, FINALLY_END, finally);
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3387 return 1;
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3388 }
b6d2f6fd3e11 PEP 343 -- the with-statement.
Guido van Rossum <guido@python.org>
parents: 36666
diff changeset
3389
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3390 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3391 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
3392 {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
3393 Py_ssize_t i, n;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3394
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3395 /* If expr e has a different line number than the last expr/stmt,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3396 set a new line number for the next instruction.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3397 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3398 if (e->lineno > c->u->u_lineno) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3399 c->u->u_lineno = e->lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3400 c->u->u_lineno_set = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3401 }
64861
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
3402 /* Updating the column offset is always harmless. */
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
3403 c->u->u_col_offset = e->col_offset;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3404 switch (e->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3405 case BoolOp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3406 return compiler_boolop(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3407 case BinOp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3408 VISIT(c, expr, e->v.BinOp.left);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3409 VISIT(c, expr, e->v.BinOp.right);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3410 ADDOP(c, binop(c, e->v.BinOp.op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3411 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3412 case UnaryOp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3413 VISIT(c, expr, e->v.UnaryOp.operand);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3414 ADDOP(c, unaryop(e->v.UnaryOp.op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3415 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3416 case Lambda_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3417 return compiler_lambda(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3418 case IfExp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3419 return compiler_ifexp(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3420 case Dict_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3421 n = asdl_seq_LEN(e->v.Dict.values);
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
3422 /* BUILD_MAP parameter is only used to preallocate the dictionary,
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
3423 it doesn't need to be exact */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3424 ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3425 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3426 VISIT(c, expr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3427 (expr_ty)asdl_seq_GET(e->v.Dict.values, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3428 VISIT(c, expr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3429 (expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3430 ADDOP(c, STORE_MAP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3431 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3432 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3433 case Set_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3434 n = asdl_seq_LEN(e->v.Set.elts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3435 VISIT_SEQ(c, expr, e->v.Set.elts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3436 ADDOP_I(c, BUILD_SET, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3437 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3438 case GeneratorExp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3439 return compiler_genexp(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3440 case ListComp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3441 return compiler_listcomp(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3442 case SetComp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3443 return compiler_setcomp(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3444 case DictComp_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3445 return compiler_dictcomp(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3446 case Yield_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3447 if (c->u->u_ste->ste_type != FunctionBlock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3448 return compiler_error(c, "'yield' outside function");
80589
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3449 if (e->v.Yield.value) {
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3450 VISIT(c, expr, e->v.Yield.value);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3451 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3452 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3453 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3454 }
80589
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3455 ADDOP(c, YIELD_VALUE);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3456 break;
80589
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3457 case YieldFrom_kind:
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3458 if (c->u->u_ste->ste_type != FunctionBlock)
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3459 return compiler_error(c, "'yield' outside function");
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3460 VISIT(c, expr, e->v.YieldFrom.value);
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3461 ADDOP(c, GET_ITER);
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3462 ADDOP_O(c, LOAD_CONST, Py_None, consts);
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3463 ADDOP(c, YIELD_FROM);
ffb2fa900cb7 Issue #16546: make ast.YieldFrom argument mandatory.
Mark Dickinson <mdickinson@enthought.com>
parents: 80239
diff changeset
3464 break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3465 case Compare_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3466 return compiler_compare(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3467 case Call_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3468 return compiler_call(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3469 case Num_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3470 ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3471 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3472 case Str_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3473 ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3474 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3475 case Bytes_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3476 ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3477 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3478 case Ellipsis_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3479 ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3480 break;
80738
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3481 case NameConstant_kind:
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3482 ADDOP_O(c, LOAD_CONST, e->v.NameConstant.value, consts);
03f92a9f0875 create NameConstant AST class for None, True, and False literals (closes #16619)
Benjamin Peterson <benjamin@python.org>
parents: 80589
diff changeset
3483 break;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3484 /* The following exprs can be assignment targets. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3485 case Attribute_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3486 if (e->v.Attribute.ctx != AugStore)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3487 VISIT(c, expr, e->v.Attribute.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3488 switch (e->v.Attribute.ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3489 case AugLoad:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3490 ADDOP(c, DUP_TOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3491 /* Fall through to load */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3492 case Load:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3493 ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3494 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3495 case AugStore:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3496 ADDOP(c, ROT_TWO);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3497 /* Fall through to save */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3498 case Store:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3499 ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3500 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3501 case Del:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3502 ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3503 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3504 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3505 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3506 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3507 "param invalid in attribute expression");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3508 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3509 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3510 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3511 case Subscript_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3512 switch (e->v.Subscript.ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3513 case AugLoad:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3514 VISIT(c, expr, e->v.Subscript.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3515 VISIT_SLICE(c, e->v.Subscript.slice, AugLoad);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3516 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3517 case Load:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3518 VISIT(c, expr, e->v.Subscript.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3519 VISIT_SLICE(c, e->v.Subscript.slice, Load);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3520 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3521 case AugStore:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3522 VISIT_SLICE(c, e->v.Subscript.slice, AugStore);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3523 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3524 case Store:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3525 VISIT(c, expr, e->v.Subscript.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3526 VISIT_SLICE(c, e->v.Subscript.slice, Store);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3527 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3528 case Del:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3529 VISIT(c, expr, e->v.Subscript.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3530 VISIT_SLICE(c, e->v.Subscript.slice, Del);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3531 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3532 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3533 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3534 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3535 "param invalid in subscript expression");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3536 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3537 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3538 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3539 case Starred_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3540 switch (e->v.Starred.ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3541 case Store:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3542 /* In all legitimate cases, the Starred node was already replaced
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3543 * by compiler_list/compiler_tuple. XXX: is that okay? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3544 return compiler_error(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3545 "starred assignment target must be in a list or tuple");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3546 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3547 return compiler_error(c,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3548 "can use starred expression only as assignment target");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3549 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3550 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3551 case Name_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3552 return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3553 /* child nodes of List and Tuple will have expr_context set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3554 case List_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3555 return compiler_list(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3556 case Tuple_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3557 return compiler_tuple(c, e);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3558 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3559 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3560 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3561
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3562 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3563 compiler_augassign(struct compiler *c, stmt_ty s)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3564 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3565 expr_ty e = s->v.AugAssign.target;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3566 expr_ty auge;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3567
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3568 assert(s->kind == AugAssign_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3569
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3570 switch (e->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3571 case Attribute_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3572 auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3573 AugLoad, e->lineno, e->col_offset, c->c_arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3574 if (auge == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3575 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3576 VISIT(c, expr, auge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3577 VISIT(c, expr, s->v.AugAssign.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3578 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3579 auge->v.Attribute.ctx = AugStore;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3580 VISIT(c, expr, auge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3581 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3582 case Subscript_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3583 auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3584 AugLoad, e->lineno, e->col_offset, c->c_arena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3585 if (auge == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3586 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3587 VISIT(c, expr, auge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3588 VISIT(c, expr, s->v.AugAssign.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3589 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3590 auge->v.Subscript.ctx = AugStore;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3591 VISIT(c, expr, auge);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3592 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3593 case Name_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3594 if (!compiler_nameop(c, e->v.Name.id, Load))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3595 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3596 VISIT(c, expr, s->v.AugAssign.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3597 ADDOP(c, inplace_binop(c, s->v.AugAssign.op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3598 return compiler_nameop(c, e->v.Name.id, Store);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3599 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3600 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3601 "invalid node type (%d) for augmented assignment",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3602 e->kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3603 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3604 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3605 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3606 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3607
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3608 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3609 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
3610 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3611 struct fblockinfo *f;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3612 if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3613 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3614 "too many statically nested blocks");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3615 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3616 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3617 f = &c->u->u_fblock[c->u->u_nfblocks++];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3618 f->fb_type = t;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3619 f->fb_block = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3620 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3621 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3622
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3623 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3624 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
3625 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3626 struct compiler_unit *u = c->u;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3627 assert(u->u_nfblocks > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3628 u->u_nfblocks--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3629 assert(u->u_fblock[u->u_nfblocks].fb_type == t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3630 assert(u->u_fblock[u->u_nfblocks].fb_block == b);
35742
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
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3633 static int
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3634 compiler_in_loop(struct compiler *c) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3635 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3636 struct compiler_unit *u = c->u;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3637 for (i = 0; i < u->u_nfblocks; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3638 if (u->u_fblock[i].fb_type == LOOP)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3639 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3640 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3641 return 0;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3642 }
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3643 /* Raises a SyntaxError and returns 0.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3644 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
3645 */
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 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3648 compiler_error(struct compiler *c, const char *errstr)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3649 {
70435
27359a4e0f8c try to use the same str object for all code filenames when compiling or unmarshalling (#12190)
Benjamin Peterson <benjamin@python.org>
parents: 70397
diff changeset
3650 PyObject *loc;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3651 PyObject *u = NULL, *v = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3652
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
3653 loc = PyErr_ProgramTextObject(c->c_filename, c->u->u_lineno);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3654 if (!loc) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3655 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3656 loc = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3657 }
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
3658 u = Py_BuildValue("(OiiO)", c->c_filename, c->u->u_lineno,
64861
861c35cef7aa add column offset to all syntax errors
Benjamin Peterson <benjamin@python.org>
parents: 64620
diff changeset
3659 c->u->u_col_offset, loc);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3660 if (!u)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3661 goto exit;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3662 v = Py_BuildValue("(zO)", errstr, u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3663 if (!v)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3664 goto exit;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3665 PyErr_SetObject(PyExc_SyntaxError, v);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3666 exit:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3667 Py_DECREF(loc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3668 Py_XDECREF(u);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3669 Py_XDECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3670 return 0;
35742
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
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3673 static int
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3674 compiler_handle_subscr(struct compiler *c, const char *kind,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3675 expr_context_ty ctx)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3676 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3677 int op = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3678
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3679 /* XXX this code is duplicated */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3680 switch (ctx) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3681 case AugLoad: /* fall through to Load */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3682 case Load: op = BINARY_SUBSCR; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3683 case AugStore:/* fall through to Store */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3684 case Store: op = STORE_SUBSCR; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3685 case Del: op = DELETE_SUBSCR; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3686 case Param:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3687 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3688 "invalid %s kind %d in subscript\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3689 kind, ctx);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3690 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3691 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3692 if (ctx == AugLoad) {
64439
725231211273 Issue #9225: Remove the ROT_FOUR and DUP_TOPX opcode, the latter replaced
Antoine Pitrou <solipsis@pitrou.net>
parents: 63114
diff changeset
3693 ADDOP(c, DUP_TOP_TWO);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3694 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3695 else if (ctx == AugStore) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3696 ADDOP(c, ROT_THREE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3697 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3698 ADDOP(c, op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3699 return 1;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3700 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3701
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3702 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3703 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
3704 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3705 int n = 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3706 assert(s->kind == Slice_kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3707
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3708 /* only handles the cases where BUILD_SLICE is emitted */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3709 if (s->v.Slice.lower) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3710 VISIT(c, expr, s->v.Slice.lower);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3711 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3712 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3713 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3714 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3715
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3716 if (s->v.Slice.upper) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3717 VISIT(c, expr, s->v.Slice.upper);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3718 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3719 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3720 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3721 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3722
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3723 if (s->v.Slice.step) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3724 n++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3725 VISIT(c, expr, s->v.Slice.step);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3726 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3727 ADDOP_I(c, BUILD_SLICE, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3728 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3729 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3730
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3731 static int
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3732 compiler_visit_nested_slice(struct compiler *c, slice_ty s,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3733 expr_context_ty ctx)
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3734 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3735 switch (s->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3736 case Slice_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3737 return compiler_slice(c, s, ctx);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3738 case Index_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3739 VISIT(c, expr, s->v.Index.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3740 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3741 case ExtSlice_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3742 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3743 PyErr_SetString(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3744 "extended slice invalid in nested slice");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3745 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3746 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3747 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3748 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3749
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3750 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3751 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
3752 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3753 char * kindname = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3754 switch (s->kind) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3755 case Index_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3756 kindname = "index";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3757 if (ctx != AugStore) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3758 VISIT(c, expr, s->v.Index.value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3759 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3760 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3761 case Slice_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3762 kindname = "slice";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3763 if (ctx != AugStore) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3764 if (!compiler_slice(c, s, ctx))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3765 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3766 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3767 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3768 case ExtSlice_kind:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3769 kindname = "extended slice";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3770 if (ctx != AugStore) {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
3771 Py_ssize_t i, n = asdl_seq_LEN(s->v.ExtSlice.dims);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3772 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3773 slice_ty sub = (slice_ty)asdl_seq_GET(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3774 s->v.ExtSlice.dims, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3775 if (!compiler_visit_nested_slice(c, sub, ctx))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3776 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3777 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3778 ADDOP_I(c, BUILD_TUPLE, n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3779 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3780 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3781 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3782 PyErr_Format(PyExc_SystemError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3783 "invalid subscript kind %d", s->kind);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3784 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3785 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3786 return compiler_handle_subscr(c, kindname, ctx);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3787 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3788
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3789 /* 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
3790
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3791 /* 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
3792 post records the block indices in post-order.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3793
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3794 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
3795 */
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
3796
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3797 struct assembler {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3798 PyObject *a_bytecode; /* string containing bytecode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3799 int a_offset; /* offset into bytecode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3800 int a_nblocks; /* number of reachable blocks */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3801 basicblock **a_postorder; /* list of blocks in dfs postorder */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3802 PyObject *a_lnotab; /* string containing lnotab */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3803 int a_lnotab_off; /* offset into lnotab */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3804 int a_lineno; /* last lineno of emitted instruction */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3805 int a_lineno_off; /* bytecode offset of last lineno */
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3806 };
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 40215
diff changeset
3807
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3808 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3809 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
3810 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3811 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3812 struct instr *instr = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3813
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3814 if (b->b_seen)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3815 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3816 b->b_seen = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3817 if (b->b_next != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3818 dfs(c, b->b_next, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3819 for (i = 0; i < b->b_iused; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3820 instr = &b->b_instr[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3821 if (instr->i_jrel || instr->i_jabs)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3822 dfs(c, instr->i_target, a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3823 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3824 a->a_postorder[a->a_nblocks++] = b;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3825 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3826
35860
9b885c934144 make internal method static
Neal Norwitz <nnorwitz@gmail.com>
parents: 35797
diff changeset
3827 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3828 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
3829 {
87465
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3830 int i, target_depth, effect;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3831 struct instr *instr;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3832 if (b->b_seen || b->b_startdepth >= depth)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3833 return maxdepth;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3834 b->b_seen = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3835 b->b_startdepth = depth;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3836 for (i = 0; i < b->b_iused; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3837 instr = &b->b_instr[i];
87465
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3838 effect = PyCompile_OpcodeStackEffect(instr->i_opcode, instr->i_oparg);
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3839 if (effect == PY_INVALID_STACK_EFFECT) {
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3840 fprintf(stderr, "opcode = %d\n", instr->i_opcode);
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3841 Py_FatalError("PyCompile_OpcodeStackEffect()");
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3842 }
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3843 depth += effect;
5fe72b9ed48e Issue #19722: Added opcode.stack_effect(), which accurately
Larry Hastings <larry@hastings.org>
parents: 87281
diff changeset
3844
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3845 if (depth > maxdepth)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3846 maxdepth = depth;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3847 assert(depth >= 0); /* invalid code or bug in stackdepth() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3848 if (instr->i_jrel || instr->i_jabs) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3849 target_depth = depth;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3850 if (instr->i_opcode == FOR_ITER) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3851 target_depth = depth-2;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3852 } else if (instr->i_opcode == SETUP_FINALLY ||
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3853 instr->i_opcode == SETUP_EXCEPT) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3854 target_depth = depth+3;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3855 if (target_depth > maxdepth)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3856 maxdepth = target_depth;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3857 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3858 maxdepth = stackdepth_walk(c, instr->i_target,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
3859 target_depth, maxdepth);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3860 if (instr->i_opcode == JUMP_ABSOLUTE ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3861 instr->i_opcode == JUMP_FORWARD) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3862 goto out; /* remaining code is dead */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3863 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3864 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3865 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3866 if (b->b_next)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3867 maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3868 out:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3869 b->b_seen = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3870 return maxdepth;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3871 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3872
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3873 /* 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
3874 * 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
3875 */
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3876 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3877 stackdepth(struct compiler *c)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3878 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3879 basicblock *b, *entryblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3880 entryblock = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3881 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3882 b->b_seen = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3883 b->b_startdepth = INT_MIN;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3884 entryblock = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3885 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3886 if (!entryblock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3887 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3888 return stackdepth_walk(c, entryblock, 0, 0);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3889 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3890
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3891 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3892 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
3893 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3894 memset(a, 0, sizeof(struct assembler));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3895 a->a_lineno = firstlineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3896 a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3897 if (!a->a_bytecode)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3898 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3899 a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3900 if (!a->a_lnotab)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3901 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3902 if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3903 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3904 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3905 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3906 a->a_postorder = (basicblock **)PyObject_Malloc(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3907 sizeof(basicblock *) * nblocks);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3908 if (!a->a_postorder) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3909 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3910 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3911 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3912 return 1;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3913 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3914
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3915 static void
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3916 assemble_free(struct assembler *a)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3917 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3918 Py_XDECREF(a->a_bytecode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3919 Py_XDECREF(a->a_lnotab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3920 if (a->a_postorder)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3921 PyObject_Free(a->a_postorder);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3922 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3923
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3924 /* 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
3925
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3926 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3927 instrsize(struct instr *instr)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3928 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3929 if (!instr->i_hasarg)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3930 return 1; /* 1 byte for the opcode*/
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3931 if (instr->i_oparg > 0xffff)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3932 return 6; /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3933 return 3; /* 1 (opcode) + 2 (oparg) */
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3934 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3935
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3936 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3937 blocksize(basicblock *b)
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3938 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3939 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3940 int size = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3941
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3942 for (i = 0; i < b->b_iused; i++)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3943 size += instrsize(&b->b_instr[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3944 return size;
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3945 }
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3946
55372
79718ee03986 Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 54918
diff changeset
3947 /* Appends a pair to the end of the line number table, a_lnotab, representing
79718ee03986 Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 54918
diff changeset
3948 the instruction's bytecode offset and line number. See
79718ee03986 Merged revisions 72487-72488,72879 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 54918
diff changeset
3949 Objects/lnotab_notes.txt for the description of the line number table. */
18065
889db6d55506 SF bug 430991: wrong co_lnotab
Tim Peters <tim.peters@gmail.com>
parents: 17736
diff changeset
3950
17518
f939ce52a734 Make some private symbols static.
Guido van Rossum <guido@python.org>
parents: 17355
diff changeset
3951 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
3952 assemble_lnotab(struct assembler *a, struct instr *i)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3953 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3954 int d_bytecode, d_lineno;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
3955 Py_ssize_t len;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3956 unsigned char *lnotab;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3957
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3958 d_bytecode = a->a_offset - a->a_lineno_off;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3959 d_lineno = i->i_lineno - a->a_lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3960
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3961 assert(d_bytecode >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3962 assert(d_lineno >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3963
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3964 if(d_bytecode == 0 && d_lineno == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3965 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3966
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3967 if (d_bytecode > 255) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3968 int j, nbytes, ncodes = d_bytecode / 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3969 nbytes = a->a_lnotab_off + 2 * ncodes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3970 len = PyBytes_GET_SIZE(a->a_lnotab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3971 if (nbytes >= len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3972 if ((len <= INT_MAX / 2) && (len * 2 < nbytes))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3973 len = nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3974 else if (len <= INT_MAX / 2)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3975 len *= 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3976 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3977 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3978 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3979 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3980 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3981 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3982 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3983 lnotab = (unsigned char *)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3984 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3985 for (j = 0; j < ncodes; j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3986 *lnotab++ = 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3987 *lnotab++ = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3988 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3989 d_bytecode -= ncodes * 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3990 a->a_lnotab_off += ncodes * 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3991 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3992 assert(d_bytecode <= 255);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3993 if (d_lineno > 255) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3994 int j, nbytes, ncodes = d_lineno / 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3995 nbytes = a->a_lnotab_off + 2 * ncodes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3996 len = PyBytes_GET_SIZE(a->a_lnotab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3997 if (nbytes >= len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3998 if ((len <= INT_MAX / 2) && len * 2 < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
3999 len = nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4000 else if (len <= INT_MAX / 2)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4001 len *= 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4002 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4003 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4004 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4005 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4006 if (_PyBytes_Resize(&a->a_lnotab, len) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4007 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4008 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4009 lnotab = (unsigned char *)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4010 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4011 *lnotab++ = d_bytecode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4012 *lnotab++ = 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4013 d_bytecode = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4014 for (j = 1; j < ncodes; j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4015 *lnotab++ = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4016 *lnotab++ = 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4017 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4018 d_lineno -= ncodes * 255;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4019 a->a_lnotab_off += ncodes * 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4020 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4021
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4022 len = PyBytes_GET_SIZE(a->a_lnotab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4023 if (a->a_lnotab_off + 2 >= len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4024 if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4025 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4026 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4027 lnotab = (unsigned char *)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4028 PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4029
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4030 a->a_lnotab_off += 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4031 if (d_bytecode) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4032 *lnotab++ = d_bytecode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4033 *lnotab++ = d_lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4034 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4035 else { /* First line of a block; def stmt, etc. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4036 *lnotab++ = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4037 *lnotab++ = d_lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4038 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4039 a->a_lineno = i->i_lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4040 a->a_lineno_off = a->a_offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4041 return 1;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4042 }
16015
c832ef72499d This patch introduces an extra pass to the compiler that generates a
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16006
diff changeset
4043
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4044 /* assemble_emit()
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4045 Extend the bytecode with a new instruction.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4046 Update lnotab if necessary.
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4047 */
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4048
24855
bed5d5e536bc Add warnings for assignment or deletion of variables and attributes
Guido van Rossum <guido@python.org>
parents: 24854
diff changeset
4049 static int
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4050 assemble_emit(struct assembler *a, struct instr *i)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4051 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4052 int size, arg = 0, ext = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4053 Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4054 char *code;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4055
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4056 size = instrsize(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4057 if (i->i_hasarg) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4058 arg = i->i_oparg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4059 ext = arg >> 16;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4060 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4061 if (i->i_lineno && !assemble_lnotab(a, i))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4062 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4063 if (a->a_offset + size >= len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4064 if (len > PY_SSIZE_T_MAX / 2)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4065 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4066 if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4067 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4068 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4069 code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4070 a->a_offset += size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4071 if (size == 6) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4072 assert(i->i_hasarg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4073 *code++ = (char)EXTENDED_ARG;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4074 *code++ = ext & 0xff;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4075 *code++ = ext >> 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4076 arg &= 0xffff;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4077 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4078 *code++ = i->i_opcode;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4079 if (i->i_hasarg) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4080 assert(size == 3 || size == 6);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4081 *code++ = arg & 0xff;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4082 *code++ = arg >> 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4083 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4084 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
4085 }
30f8b654c2e5 SF Patch [ 429024 ] deal with some unary ops at compile time
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 19177
diff changeset
4086
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
4087 static void
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4088 assemble_jump_offsets(struct assembler *a, struct compiler *c)
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4089 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4090 basicblock *b;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4091 int bsize, totsize, extended_arg_count = 0, last_extended_arg_count;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4092 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4093
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4094 /* Compute the size of each block and fixup jump args.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4095 Replace block pointer with position in bytecode. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4096 do {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4097 totsize = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4098 for (i = a->a_nblocks - 1; i >= 0; i--) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4099 b = a->a_postorder[i];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4100 bsize = blocksize(b);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4101 b->b_offset = totsize;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4102 totsize += bsize;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4103 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4104 last_extended_arg_count = extended_arg_count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4105 extended_arg_count = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4106 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4107 bsize = b->b_offset;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4108 for (i = 0; i < b->b_iused; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4109 struct instr *instr = &b->b_instr[i];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4110 /* Relative jumps are computed relative to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4111 the instruction pointer after fetching
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4112 the jump instruction.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4113 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4114 bsize += instrsize(instr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4115 if (instr->i_jabs)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4116 instr->i_oparg = instr->i_target->b_offset;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4117 else if (instr->i_jrel) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4118 int delta = instr->i_target->b_offset - bsize;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4119 instr->i_oparg = delta;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4120 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4121 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4122 continue;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4123 if (instr->i_oparg > 0xffff)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4124 extended_arg_count++;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4125 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4126 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4127
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4128 /* XXX: This is an awful hack that could hurt performance, but
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4129 on the bright side it should work until we come up
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4130 with a better solution.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4131
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4132 The issue is that in the first loop blocksize() is called
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4133 which calls instrsize() which requires i_oparg be set
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4134 appropriately. There is a bootstrap problem because
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4135 i_oparg is calculated in the second loop above.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4136
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4137 So we loop until we stop seeing new EXTENDED_ARGs.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4138 The only EXTENDED_ARGs that could be popping up are
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4139 ones in jump instructions. So this should converge
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4140 fairly quickly.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4141 */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59673
diff changeset
4142 } while (last_extended_arg_count != extended_arg_count);
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4143 }
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4144
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4145 static PyObject *
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4146 dict_keys_inorder(PyObject *dict, Py_ssize_t offset)
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4147 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4148 PyObject *tuple, *k, *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4149 Py_ssize_t i, pos = 0, size = PyDict_Size(dict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4150
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4151 tuple = PyTuple_New(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4152 if (tuple == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4153 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4154 while (PyDict_Next(dict, &pos, &k, &v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4155 i = PyLong_AS_LONG(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4156 /* The keys of the dictionary are tuples. (see compiler_add_o)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4157 The object we want is always first, though. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4158 k = PyTuple_GET_ITEM(k, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4159 Py_INCREF(k);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4160 assert((i - offset) < size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4161 assert((i - offset) >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4162 PyTuple_SET_ITEM(tuple, i - offset, k);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4163 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4164 return tuple;
16257
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4165 }
fd8c7203251f PEP 227 implementation
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16250
diff changeset
4166
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4167 static int
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4168 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
4169 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4170 PySTEntryObject *ste = c->u->u_ste;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4171 int flags = 0;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4172 Py_ssize_t n;
83791
6db3741e59be rather than passing locals to the class body, just execute the class body in the proper environment
Benjamin Peterson <benjamin@python.org>
parents: 83783
diff changeset
4173 if (ste->ste_type == FunctionBlock) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4174 flags |= CO_NEWLOCALS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4175 if (!ste->ste_unoptimized)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4176 flags |= CO_OPTIMIZED;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4177 if (ste->ste_nested)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4178 flags |= CO_NESTED;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4179 if (ste->ste_generator)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4180 flags |= CO_GENERATOR;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4181 if (ste->ste_varargs)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4182 flags |= CO_VARARGS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4183 if (ste->ste_varkeywords)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4184 flags |= CO_VARKEYWORDS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4185 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4186
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4187 /* (Only) inherit compilerflags in PyCF_MASK */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4188 flags |= (c->c_flags->cf_flags & PyCF_MASK);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4189
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4190 n = PyDict_Size(c->u->u_freevars);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4191 if (n < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4192 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4193 if (n == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4194 n = PyDict_Size(c->u->u_cellvars);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4195 if (n < 0)
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4196 return -1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4197 if (n == 0) {
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4198 flags |= CO_NOFREE;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4199 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4200 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4201
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4202 return flags;
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4203 }
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4204
5373
5880384d7c71 Quickly renamed the remaining files -- this directory is done.
Guido van Rossum <guido@python.org>
parents: 5287
diff changeset
4205 static PyCodeObject *
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4206 makecode(struct compiler *c, struct assembler *a)
4129
eedaa59341b9 Name mangling, what the heck!
Guido van Rossum <guido@python.org>
parents: 4003
diff changeset
4207 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4208 PyObject *tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4209 PyCodeObject *co = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4210 PyObject *consts = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4211 PyObject *names = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4212 PyObject *varnames = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4213 PyObject *name = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4214 PyObject *freevars = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4215 PyObject *cellvars = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4216 PyObject *bytecode = NULL;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4217 Py_ssize_t nlocals;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4218 int nlocals_int;
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4219 int flags;
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
4220 int argcount, kwonlyargcount;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4221
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4222 tmp = dict_keys_inorder(c->u->u_consts, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4223 if (!tmp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4224 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4225 consts = PySequence_List(tmp); /* optimize_code requires a list */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4226 Py_DECREF(tmp);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4227
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4228 names = dict_keys_inorder(c->u->u_names, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4229 varnames = dict_keys_inorder(c->u->u_varnames, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4230 if (!consts || !names || !varnames)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4231 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4232
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4233 cellvars = dict_keys_inorder(c->u->u_cellvars, 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4234 if (!cellvars)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4235 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4236 freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4237 if (!freevars)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4238 goto error;
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4239
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4240 nlocals = PyDict_Size(c->u->u_varnames);
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4241 assert(nlocals < INT_MAX);
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4242 nlocals_int = Py_SAFE_DOWNCAST(nlocals, Py_ssize_t, int);
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4243
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4244 flags = compute_code_flags(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4245 if (flags < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4246 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4247
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4248 bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4249 if (!bytecode)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4250 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4251
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4252 tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4253 if (!tmp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4254 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4255 Py_DECREF(consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4256 consts = tmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4257
87281
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
4258 argcount = Py_SAFE_DOWNCAST(c->u->u_argcount, Py_ssize_t, int);
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
4259 kwonlyargcount = Py_SAFE_DOWNCAST(c->u->u_kwonlyargcount, Py_ssize_t, int);
116bd550e309 Issue #9566, #19617: Fix more compiler warnings in compile.c on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 87279
diff changeset
4260 co = PyCode_New(argcount, kwonlyargcount,
87277
68fd86a83ece Issue #9566: compile.c uses Py_ssize_t instead of int to store sizes to fix
Victor Stinner <victor.stinner@gmail.com>
parents: 86948
diff changeset
4261 nlocals_int, stackdepth(c), flags,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4262 bytecode, consts, names, varnames,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4263 freevars, cellvars,
85417
df2fdd42b375 Close #11619: The parser and the import machinery do not encode Unicode
Victor Stinner <victor.stinner@gmail.com>
parents: 84563
diff changeset
4264 c->c_filename, c->u->u_name,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4265 c->u->u_firstlineno,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4266 a->a_lnotab);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4267 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4268 Py_XDECREF(consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4269 Py_XDECREF(names);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4270 Py_XDECREF(varnames);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4271 Py_XDECREF(name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4272 Py_XDECREF(freevars);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4273 Py_XDECREF(cellvars);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4274 Py_XDECREF(bytecode);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4275 return co;
69
cccd534f2280 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4276 }
5041
c497929b2371 Instead of emitting SET_LINENO instructions, generate a line number
Guido van Rossum <guido@python.org>
parents: 5011
diff changeset
4277
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4278
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4279 /* For debugging purposes only */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4280 #if 0
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4281 static void
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4282 dump_instr(const struct instr *i)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4283 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4284 const char *jrel = i->i_jrel ? "jrel " : "";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4285 const char *jabs = i->i_jabs ? "jabs " : "";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4286 char arg[128];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4287
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4288 *arg = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4289 if (i->i_hasarg)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4290 sprintf(arg, "arg: %d ", i->i_oparg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4291
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4292 fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4293 i->i_lineno, i->i_opcode, arg, jabs, jrel);
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4294 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4295
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4296 static void
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4297 dump_basicblock(const basicblock *b)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4298 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4299 const char *seen = b->b_seen ? "seen " : "";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4300 const char *b_return = b->b_return ? "return " : "";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4301 fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4302 b->b_iused, b->b_startdepth, b->b_offset, seen, b_return);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4303 if (b->b_instr) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4304 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4305 for (i = 0; i < b->b_iused; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4306 fprintf(stderr, " [%02d] ", i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4307 dump_instr(b->b_instr + i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4308 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4309 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4310 }
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4311 #endif
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
4312
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4313 static PyCodeObject *
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4314 assemble(struct compiler *c, int addNone)
16781
5a1230de436a Preliminary support for future nested scopes
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16763
diff changeset
4315 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4316 basicblock *b, *entryblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4317 struct assembler a;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4318 int i, j, nblocks;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4319 PyCodeObject *co = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4320
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4321 /* Make sure every block that falls off the end returns None.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4322 XXX NEXT_BLOCK() isn't quite right, because if the last
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4323 block ends with a jump or return b_next shouldn't set.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4324 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4325 if (!c->u->u_curblock->b_return) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4326 NEXT_BLOCK(c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4327 if (addNone)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4328 ADDOP_O(c, LOAD_CONST, Py_None, consts);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4329 ADDOP(c, RETURN_VALUE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4330 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4331
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4332 nblocks = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4333 entryblock = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4334 for (b = c->u->u_blocks; b != NULL; b = b->b_list) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4335 nblocks++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4336 entryblock = b;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4337 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4338
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4339 /* Set firstlineno if it wasn't explicitly set. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4340 if (!c->u->u_firstlineno) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4341 if (entryblock && entryblock->b_instr)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4342 c->u->u_firstlineno = entryblock->b_instr->i_lineno;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4343 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4344 c->u->u_firstlineno = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4345 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4346 if (!assemble_init(&a, nblocks, c->u->u_firstlineno))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4347 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4348 dfs(c, entryblock, &a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4349
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4350 /* Can't modify the bytecode after computing jump offsets. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4351 assemble_jump_offsets(&a, c);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4352
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4353 /* Emit code in reverse postorder from dfs. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4354 for (i = a.a_nblocks - 1; i >= 0; i--) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4355 b = a.a_postorder[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4356 for (j = 0; j < b->b_iused; j++)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4357 if (!assemble_emit(&a, &b->b_instr[j]))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4358 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4359 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4360
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4361 if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4362 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4363 if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4364 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4365
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4366 co = makecode(c, &a);
35742
1c4d192f1568 Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 35310
diff changeset
4367 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4368 assemble_free(&a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57502
diff changeset
4369 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
4370 }
66685
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4371
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4372 #undef PyAST_Compile
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4373 PyAPI_FUNC(PyCodeObject *)
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4374 PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags,
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4375 PyArena *arena)
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4376 {
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4377 return PyAST_CompileEx(mod, filename, flags, -1, arena);
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4378 }
713c6b6ca5ce Add an "optimize" parameter to compile() to control the optimization level, and provide an interface to it in py_compile, compileall and PyZipFile.
Georg Brandl <georg@python.org>
parents: 66556
diff changeset
4379